七、分支管理
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
案例:
第一步:创建dev分支,然后切换到dev分支:
$ git checkout -b dev 等价于:$ git branch dev $ git checkout dev第二步:查看当前分支:
$ git branch第三步:在当前dev分支上,编写文件test.txt,并提交到dev分支:
$ git add test.txt第四步:切换分支到master:
$ git checkout master此时,在master分支上并不能看到test.txt文件
$ git merge dev第六步:删除dev分支:
$ git branch -d dev
八、解决冲突
第一步:创建新分支,并在此分支上修改test.txt文件,然后提交:$ git checkout -b feature1修改test.txt文件
$ git add test.txt -m "change text on feature1"第二步:切换到master分支,修改test.txt文件,然后提交:
$ git checkout master修改test.txt文件
$ git add text.txt -m "change text on master"第三步:将feature1分支合并到master
$ git merge feature1此时,由于冲突报错了,现需要修改其中一分支下的文件,然后重新提交,合并!
查看分支合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
$ git merge --no-ff -m "merge with no-ff" dev合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而默认的fast forward合并就看不出来曾经做过合并。
九、BUG分支
当正在dev分支上开发新任务时,测试组给提了一个线上的bug需及时修复,这是就需要在master分支上创建新分支来进行修复,但是开发的现场又需要保存下来!第一步:查看当前分支信息,当前分支dev上还有未完成待提交的文件,并保存现场:
$ git status $ git stash第二步:切换到master分支,并创建bug分支,进行bug修复:
$ git checkout master $ git checkout -b issue-bug001 $ git add text.txt $ git commit -m "resolve bug001"第三步:切换到master分支,合并提交,然后删除临时分支:
$ git checkout master $ git merge --no--ff -m "merge bug001" issue-bug001 $ git branch -d issue-bug001第四步:切换到dev分支,恢复现场,继续工作:
$ git checkout dev $ git status $ git stash list $ git stash apply $ git stash drop恢复现场的两种方式:
1. 恢复现场:$ git stash apply 删除现场:$ git stash drop 2. 恢复的同时删除:$ git stash pop
恢复指定的stash:$ git stash apply stash@{0}没有被合并的分支,删除时会报错:
$ git branch -d <name>使用-D进行强行删除:
$ git branch -D <name>
十、多人协作
1. 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin查看远程库的信息:git remote 查看详细远程库信息:git remote -v2. 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
推送master分支:$ git push origin master 推送dev分支:$ git push origin dev3. 抓取分支,
获取远程分支:$ git clone git@github.com:381510688/learningGit.git 创建远程origin的dev分支到本地:$ git checkout -b dev origin/dev 把dev分支修改的文件push到远程:$ git commit -m "add modify file" $ git push origin dev 如本地没有与远程dev建立连接,需建立连接: 指定本地dev分支与远程origin/dev分支的链接:$ git branch --set-upstream dev origin/dev 把最新的提交从origin/dev抓下来:$ git pull 然后手动修改冲突,合并后再提交
十一、标签管理
Git的标签是版本库的快照,其本质是指向某个commit的指针。1. 创建标签
切换到需要打标签的分支上:$ git checkout master 打标签:$ git tag v1.0 查看所有标签:$ git tag2. 在历史的commit id上打标签
查看历史commit id:$ git log --pretty=oneline --abbrev-commit 指定commit id打标签:$ git tag v1.1 6224966 带说明的标签:$ git tag -a v1.2 -m "version 1.2 released" 62249673. 查看标签信息:
$ git show v1.14. 用PGP签名标签:
git tag -s <tagname> -m "blablabla..."5. 推送某个标签到远程:
$ git push origin v1.0推送全部标签到远程:
$ git push origin --tags6. 删除本地标签:
$ git tag -d v1.2删除远程标签:
$ git tag -d v1.1 $ gti push origin :refs/tags/v1.1