重学Git(2)

前言

上一文讲了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,这就形成了分支。如下图:
感谢https://juejin.im/book/5a124b29f265da431d3c472e
图来自掘金小册

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就会冲突报错,这时候我们有三个选择:

  1. git merge --abort 即放弃合并
  2. 手动检查冲突并修改
  3. 使用第三方工具修复merge

这部分比较好理解,就不展开了。

发布了362 篇原创文章 · 获赞 352 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43870742/article/details/104208212