git使用教程

0 太长不看版本

创建git
git init 把当前目录变成Git可以管理的仓库


提交
git add t.txt 把文件从工作区>>>>暂存区
git commit -m "wrote a readme file" 把文件从暂存区>>>>仓库。其中,-m 表示本次提交的说明,后面的为说明的内容,请写有意义的话


查看日志/状态
git log 显示从最近到最远的提交日志
git log --pretty=oneline 省略Author、data等信息,显示从近到远的提交日志
git log --graph --pretty=oneline --abbrev-commit 提交日志
git status 查看修改状况


版本回退/查找版本号

git reset --hard HEAD^ 把当前版本回退到上一个版本
git reset --hard 56ed96 回退到某一版本
git reflog 记录每一次命令及其版本号


查看区别/撤销修改
git diff HEAD -- test.txt 查看工作区和版本库里面最新版本的区别
git checkout -- test.txt 用版本库里的版本替换工作区的版本(撤销修改,丢弃工作区的修改)
git reset HEAD test.txt 把目前暂存区的文件给撤销掉


删除文件
删除场景1:需要删除文件
rm test.txt 在工作区删除文件(或者右键删除)
git status 查看哪些文件被删除了
git rm test.txt 从版本库里删除文件
git commit -m "remove test.txt" 提交删除文件

删除场景2:删错了
右键把文件删了,但是我不想删的,就可以把文件从版本库里找回来
git checkout -- test.txt 用版本库里的版本替换工作区的版本


远程库操作/github
git remote add origin git@github.com:AlingJia/test.git 添加远程库
git push origin master 把本地库的所有内容推送到远程库上
git remote -v 查看远程库信息
git remote rm origin 根据名字删除远程库,比如删除origin
git clone git@github.com:AlingJia/gitskills.git 从远程库克隆


分支
git branch dev 创建dev分支
git checkout -b dev 创建dev分支,然后切换到dev分支
git switch -c dev 创建并切换到新的dev分支
git switch master 直接切换到已有的master分支

git branch 查看当前分支
在当前分支上进行更改以后也要add和commit
git checkout master 切换分支回master
git merge dev 合并分支,把dev和master合并
git merge --no-ff -m "merge with no-ff" dev 把dev和master–no–ff合并
git branch -d dev 删除分支dev


保存工作现场stash
git stash Git提供的一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
git stash list 查看刚才保存的工作现场。

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:git stash apply stash@{0}


git cherry-pick 6084405 把修改放到别的分支上?(没学会)


标签
标签打在commit上
git tag v1.0 默认标签是打在最新提交的commit上的。
git tag v0.9 f52c633 要对commit id是f52c633的打标签
git tag -a v0.1 -m "version 0.1 released" 1094adb 创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag 查看标签(按字母排序)
git show v1.0 查看标签信息
git tag -d v0.1 删除标签(因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。)
git push origin v1.0 推送某个标签到远程
git push origin --tags 一次性推送全部尚未推送到远程的本地标签
git push origin :refs/tags/v0.9 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除 git tag -d v0.9。然后,从远程删除。


1 git简介

本文章是廖雪峰的git教程笔记
Git是目前世界上最先进的分布式版本控制系统。

2 git命令记录

2.1 版本库/创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  1. cd进你的目录
$ cd F:
$ cd git
$ pwd  //pwd命令用于显示当前目录。
  1. 通过git init命令把这个目录变成Git可以管理的仓库
 $ git init

在这里插入图片描述
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),这时当前目录下多了一个.git的目录(隐藏文件),这个目录是Git来跟踪管理版本库的。

2.2工作区和暂存区

  Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。


  ▲工作区Working Directory:在电脑里能看到的目录,一个文件夹就是一个工作区
  ▲暂存区stage:前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
  第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区
  第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支
在这里插入图片描述


Git管理的文件分为:工作区,版本库,版本库又分为暂存区stage和暂存区分支master(仓库)

工作区>>>>暂存区>>>>仓库

git add把文件从工作区>>>>暂存区,git commit把文件从暂存区>>>>仓库,

git diff查看工作区和暂存区差异,

git diff --cached查看暂存区和仓库差异,

git diff HEAD 查看工作区和仓库的差异,

git add的反向命令git checkout,撤销工作区修改,即把暂存区最新版本转移到工作区,

git commit的反向命令git reset HEAD,就是把仓库最新版本转移到暂存区。

2.3 命令

2.3.1 git add / git commit

git add t.txt 把文件从工作区>>>>暂存区
git commit -m "wrote a readme file" 把文件从暂存区>>>>仓库。其中,-m 表示本次提交的说明,后面的为说明的内容,请写有意义的话


注意:可以add多次,一起commit

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

在这里插入图片描述
其中 命令行

git add test.txt
git commit test.txt -m"create test"

提交时,返回的[master 7337181]是本次提交的版本号,create test是本次提交的说明
1 file changed 就是有一个文件被修改了
2 insertions(+) 不太确定是啥意思,是不是说增加了两行?

2.3.2 git log

git log 显示从最近到最远的提交日志
git log --pretty=oneline 省略Author、data等信息,显示从近到远的提交日志
在这里插入图片描述
733718那一串是版本号(commit id)(上面commit时候的那串)
create test是我们提交的时候的说明


我对test文件进行更改,但是若没有commit,在git log中是没有的

2.3.3 git status

git status 查看修改状况


  1. 对文件内容进行如下更改在这里插入图片描述

  2. 只更改了文件,没有add在这里插入图片描述
    changes not staged for commit:(工作区有修改)有修改、修改未进入暂存区
    no changes added to commit:(暂存区无修改)暂存区无需要提交的修改

  3. 更改了文件,并且add了
    在这里插入图片描述
    changes to be commited:(暂存区有修改)暂存区有需要提交的修改

  4. 提交commit了,查看git status
    在这里插入图片描述
    nothing to commit, working tree clean:(暂存区无修改,工作区无修改)暂存区无需要提交的修改

2.3.4 git reset

git reset --hard HEAD^ 把当前版本回退到上一个版本

在回退时,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交2d8098…,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

git reset --hard 56ed96 回退到某一版本
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。


git log (我重新弄了一遍,所以版本号和前面不一样)
注意时间是由近及远,最上面的是最新的版本目前 回退到上一版本:
在这里插入图片描述
此时test的内容变成了上一个版本
在这里插入图片描述
此时再git log就只剩一个版本了
在这里插入图片描述
而如果想要回到刚才的add second,就要找到当时的那个版本号,找到了版本号就能回去
在这里插入图片描述
在这里插入图片描述
如果找不到版本号,可以用git reflog寻找每一条命令的版本号

2.3.5 git reflog

git reflog 记录每一次命令及其版本号
在这里插入图片描述
在这里可以看到,add second的版本号是2d80987…

git log可以查看提交历史,可以用来回退。用git reflog查看命令历史,可以回退后回到未来。

2.3.6 git diff

git diff HEAD -- test.txt 查看工作区和版本库里面最新版本的区别
在这里插入图片描述

2.3.7 git checkout

git checkout -- test.txt 用版本库里的版本替换工作区的版本(撤销修改,丢弃工作区的修改)

有两种情况
第一种:工作区文件修改了,但没add进暂存区,那check out就回到和版本库一模一样的状态。
第二种:文件在暂存区内,已经修改了,还没把修改后的add进暂存区,那check out就回到添加到暂存区后的状态。

git reset HEAD test.txt 把目前暂存区的文件给撤销掉


查看状态:此时暂存区有文件修改,待提交
在这里插入图片描述
当前文件:
在这里插入图片描述
我想撤销这个暂存区的修改,不想接下来暂存区的修改被提交掉,
在这里插入图片描述此时,test.txt 内的内容没有变化,但git status中,暂存区是干净的,工作区有修改。
在这里插入图片描述
再丢弃工作区的修改,那就全干净了
在这里插入图片描述

2.3.8 删除文件

场景1:需要删除文件
rm test.txt 在工作区删除文件(或者右键删除)
git status 查看哪些文件被删除了
git rm test.txt 从版本库里删除文件
git commit -m "remove test.txt" 提交删除文件

场景2:删错了
右键把文件删了,但是我不想删的,就可以把文件从版本库里找回来
git checkout -- test.txt 用版本库里的版本替换工作区的版本

3 GitHub

你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,需要将本地生成的SSH添加到Github上

3.1创建一个Git仓库

右上角
在这里插入图片描述
在这里插入图片描述
就创建了一个新的仓库,我建的名字叫test

3.2 添加远程库

git remote add origin git@github.com:AlingJia/test.git 添加远程库
AlingJia是我的GitHub账户名,test是仓库名,origin是远程库的名字
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

git push origin master 把本地库的所有内容推送到远程库上


在这里插入图片描述
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

3.3 查看/删除远程库信息

git remote -v 查看远程库信息

git remote rm origin 根据名字删除远程库,比如删除origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

3.3 从远程库克隆

git clone git@github.com:AlingJia/gitskills.git 从远程库克隆
gitskills是仓库名
在这里插入图片描述

4 分支管理

4.1 创建与合并分支

这个帖子讲的很好


git branch dev 创建dev分支
git checkout -b dev 创建dev分支,然后切换到dev分支
git switch -c dev 创建并切换到新的dev分支
git switch master 直接切换到已有的master分支
git branch 查看当前分支
在当前分支上进行更改以后也要add和commit
git checkout master 切换分支回master
git merge dev 合并分支,把dev和master合并
git branch -d dev 删除分支dev


git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支,git branch命令会列出所有分支,当前分支前面会标一个*号。
如下所示:
在这里插入图片描述
我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:
hahahahahahah
然后提交

git add test.txt 
git commit -m "branch test"

在这里插入图片描述
现在,dev分支的工作完成,我们就可以切换回master分支:git checkout master
此时再打开txt文件,之前的hahahahah就没了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。
现在,我们把dev分支的工作成果合并到master分支上:git merge dev
在这里插入图片描述
此时再打开txt文件,之前的hahahahah又出现了!
此时就可以删除dev分支了git branch -d dev
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

4.2 解决冲突

比如说有一个分支dev,一个分支master。
分支dev中的test.txt有更改,add了也commit了
master中的test.txt有更改,add了也commit了
这个时候如果合并分支是会产生冲突的,因为两个分支的修改无法合并,有冲突。
在这里插入图片描述
此时,利用cat test.txt 语句查看test.txt的内容
在这里插入图片描述在这里插入图片描述
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们根据不同修改后保存
修改后:
在这里插入图片描述
再进行add和commit,就可以成功了
在这里插入图片描述
用带参数的git log也可以看到分支的合并情况:

git log --graph --pretty=oneline --abbrev-commit

在这里插入图片描述
总的来说,
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
合并有冲突时,会将冲突的内容写入到你的文件中,你解决冲突就是改这个文件,然后 add commit ,这就完成了一次合并时冲突的解决过程
用git log --graph命令可以看到分支合并图。

4.3 分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。(?)

比如说 此时有一个新分支dev,在新分支上进行了修改,并且commit了。
再切换回master,想要合并两个分支:
准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

git merge --no-ff -m "merge with no-ff" dev

在这里插入图片描述
在这里插入图片描述
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

从指针的角度来讲,这里的–no–ff 模式其实就是相当于master指针new了一个跟dev指针一样的空间并且放了相同的内容然后指向这个空间。而原来的快速模式,就是简单将master指针指向dev指针指向的内容而已,并没有自己创造空间。这样的话,能保证master指针指向空间的稳定性(?)

而如果没有用–no–ff,就会是下面这样
在这里插入图片描述

4.4 Bug分支

在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

场景:现在在做dev分支上的工作,也就是说dev分支上的工作区和暂存区都有可能有东西。此时来了个bug,要先解决这个bug。

git stash Git提供的一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
git stash list 查看刚才保存的工作现场。

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:git stash apply stash@{0}

整体流程:
(1)git status 查看目前git的状态,此时暂存区还有修改未提交。
(2)git stash 保存当前工作现场
(3)git status 查看目前git的状态,此时工作区是干净的。
(4)git checkout -b bug1 创建bug分支
(5)在bug1分支下修改bug
(6)git add test.txt git commit test.txt -m"fix bug1" add commit一条龙
(7)git switch master 切换到master分支
(8)git merge --no-ff -m "merged bug fix 1" bug1 把master分支和bug1分支合并
(9)git branch -d bug1 删除bug1分支
(10)此时bug修好了,bug1分支也和master合并了,我要回dev继续干活了。
(11)git switch dev 回到dev分支
(12)git status 此时工作区是干净的
(13)git stash list 查看刚才保存的工作现场。
(14)工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删了
(15)git stash apply 恢复工作现场
(16)git stash drop 删除stash
(17)你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:git stash apply stash@{0}
在这里插入图片描述
(下面这里没看懂哈)
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
同样的bug,要在dev上修复,我们只需要把6084405 fix bug1这个提交所做的修改“复制”到dev分支。注意:我们只想复制6084405 fix bug1这个提交所做的修改,并不是把整个master分支merge过来。
为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
在dev分支下,git cherry-pick 6084405
Git自动给dev分支做了一次提交。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。
有些聪明的童鞋会想了,既然可以在master分支上修复bug后,在dev分支上可以“重放”这个修复过程,那么直接在dev分支上修复bug,然后在master分支上“重放”行不行?当然可以,不过你仍然需要git stash命令保存现场,才能从dev分支切换到master分支。

4.5 Feature分支

软件开发中,总有无穷无尽的新的功能要不断添加进来。添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

4.6 多人协作

查看远程库:
git remote 查看远程库的信息
git remote -v 查看更详细的信息

推送分支:
git push origin master 推送分支,把该分支上的所有本地提交推送到远程库
git push origin dev 推送dev分支

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

抓取分支:
…这里很复杂啊…因为暂时没有多人合作,所以我就先不学这里了。帖子见这里

4.7 标签

标签打在commit上
git tag v1.0 默认标签是打在最新提交的commit上的。
git tag v0.9 f52c633 要对commit id是f52c633的打标签
git tag -a v0.1 -m "version 0.1 released" 1094adb 创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag 查看标签(按字母排序)
git show v1.0 查看标签信息
git tag -d v0.1 删除标签(因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。)
git push origin v1.0 推送某个标签到远程
git push origin --tags 一次性推送全部尚未推送到远程的本地标签
git push origin :refs/tags/v0.9 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除 git tag -d v0.9。然后,从远程删除。

注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值