0%

Git Amend Cause Bifurcation

今学长拿着下面的这几张图问了我一个问题,为什么他用 git commit --amend 之后就会出现分支分叉的情况

我们先来了解一些 gitamend 指令是干什么的

简单来说,它就是会修改你上一次的 commit。直观上看,修改的是上一次 commit 中写的提交信息;但是隐性的说,在你上一次 commit 之后再做的修改也会被包含到这次的 commit --amend

我问学长要了他 git 分叉的两条路径节点的信息

可以看到,蓝色的分支里 Branches 的信息为 master | origin,而粉色分支的信息为 origin/master。来看看 origin 指代的是什么意思

可以把他理解成一个起别名为 origin 的指针,指向了某一个远端的 git 服务器地址。关于这一点,可以参考 .git/config 文件,这里我以博客仓库中的为例

如果你是使用 HTTPS 协议作为 git 的传输协议,那么在 [branch "master"] 中应该看到的是

1
2
3
[branch "master"]
remote = origin
merge = ...

相比 SSH 协议的写法,HTTPS 版本看的更加明显。remote 指向了 origin 别名,而 origin 又指向 [remote "origin"] 部分

同样,如果我们添加一个 mirror,用它来指向一个新的仓库地址,HTTPS 版本的写法就可以大概写为

1
2
3
4
5
6
7
8
9
10
11
[core]
...
[remote "origin"]
url = ...
fetch = ...
[remote "mirror"]
url = ...
fetch = ...
[branch "master"]
remote = origin
merge = ...

这时如果 git push 就只会发 origin,想要给 mirror 发送就需要写成 git push mirror master(大概是,没试过
如果此时修改 remote = mirror,你省略写法 git push 就会发给 mirror 指向的仓库

回到正题,实际上导致学长 git 的分支分叉的流程是
change file -> git add & commit -> git push -> change file -> ‘git add & commit –ammend’ -> git push

发送到远端的服务器之后,又通过 amend 修改了本地上一次的提交,这就导致了本地和远端出现分叉的情况

事实上,如果提交够规范,每一次 commit 都是一次功能实现或更新,amend 只能说是为了提交更规范的一种补救措施。学长考虑的是维护 git 提交更干净,所以才想到用 git commit --amend 替换 git commit 的做法,而在规范提交的情况下,就没有必要再花费精力去维护提交干净了


另外,代码块好像不能识别 .ini 文件,也可能是 markdown 的代码块不应该写 ini 格式。借着这个机会还顺便了解了一点几种配置文件的区别,尤其是 ini 和 TOML


Reference

Welcome to my other publishing channels