前言
上一文讲了Git的一种多人协作模型,是有一些缺陷的,这一篇我们来着重讲讲分支。
HEAD
让我们回到git log
commit 1d14549cf3bd74544a975008e1570c71effa4e2d (HEAD -> master, origin/master, origin/HEAD)
Author: josem <starinsun@outlook.com>
Merge branch 'master' of https://github.com/starinsun/git-learning
可以看到上文的merge操作结束后,git log最上面一行的情况如上述,其中HEAD -> master, origin/master, origin/HEAD这一段应该引起我们的注意。HEAD这个东西其实代表指向当前 commit 的引用,如果我们再创建一个commit:
commit 2d3229cd53502b8c706e7dfeba54a8d6cfc5267d (HEAD -> master)
Author: josem <starinsun@outlook.com>
Date: Fri Feb 7 12:14:05 2020 +0800
another ano
commit 1d14549cf3bd74544a975008e1570c71effa4e2d (origin/master, origin/HEAD)
Merge: dda629d b343e6c
Author: josem <starinsun@outlook.com>
Date: Fri Feb 7 12:00:08 2020 +0800
Merge branch 'master' of https://github.com/starinsun/git-learning
可以看到HEAD->master也转移到了最新的commit上。
然后就可以引出branch的概念了,当我们想要创建一个新的分支时,我们使用:
git branch local
git checkout local
或者
git checkout -b local
都能创建分支并让Head指向新的分支。实质上这并没有创建一个新的分支,他只是新建了一个local标志并让HEAD指向这个commit,只不过master并不会随着HEAD一起移动,相反,他还呆在原地,这时我们再提交commit,master并不会移动,而HEAD随着local一起移动了:
❯ git log
commit 2435fdbdc7b2b0db43d6edc3630e7efecd2af13b (HEAD -> local)
Date: Fri Feb 7 16:17:14 2020 +0800
local
commit b343e6ce12d0c03cc374914c764613d67bd825dd (origin/master, origin/HEAD, master)
Author: josem <starinsun@outlook.com>
Date: Fri Feb 7 11:54:44 2020 +0800
而当我们再次
而使用:
git chechout master
HEAD头又会回到master的位置,最后如果我们再次提交:
❯ git log
commit d03f0668520f630eabe4ff8052bdd26e576f3288 (HEAD -> master)
Date: Fri Feb 7 16:20:45 2020 +0800
master
commit b343e6ce12d0c03cc374914c764613d67bd825dd (origin/master, origin/HEAD)
Author: josem <starinsun@outlook.com>
Date: Fri Feb 7 11:54:44 2020 +0800
this
可以看到这时HEAD随着master移动到了新的commit,这就形成了分支。如下图:
图来自掘金小册。
git push
这时候就要好好说说git push了,其实他还有两个参数,我们默认使用的git push大部分是:
git push origin master
origin即远程仓库,master即远程仓库的主分支,注意对于远程仓库,HEAD一般一直指向master分支。
因此如果我们需要发布branch,我们需要手动切换到分支,比如再次我使用如下命令:
❯ git checkout -b another
❯ vim branck_another.md
❯ git add .
❯ git commit -m 'another branch'
❯ git push origin another
结果会如下图所示
而master分支却波澜不惊。
了解了这个,关于merge的操作就不需要太多解释了,上文已经讲过pull也是一种merge,我们就可以看成是远程master和本地master分支merge的情况,因为远程commit是领先的,所以本地的commit就快速追赶上了远程的master。
当然这个歌操作也是可能会有冲突发生的,比如我们merge的时候同一份文件的同一行内容发生了不同的改变,merge就会冲突报错,这时候我们有三个选择:
- git merge --abort 即放弃合并
- 手动检查冲突并修改
- 使用第三方工具修复merge
这部分比较好理解,就不展开了。