0. 前言
这次是残酷的文档翻译机。
不得不说,git-scm 的东西已经写的很好了。只不过不记下来的话,之后还会忘。
话只说到我看得懂的程度而已,废话不多说了:
1. init
1 | mkdir merge_test && cd merge_test |
最后很明显可以得到:

如果我哪天连这些东西都看不懂,那就可以结束人生了。
2. —abort
我寻思最重要的一定是 --abort。
一开始使用 git 的时候,不免像个 sb 一样。就好似刚开始使用 Verilog HDL。不得不说我就是个 sb,但同时也是个懒汉,发现了问题,不会去花费很大力气解决问题,更不可能去探明问题的本质,而是避重就轻,选择 “尽量之后不去犯这个错”。
貌似是 19 年的 2 月 7 日,我第一次接触 git,到了今天 —— 2020/9/5,我是肯定不会再在两个 branch 上修改同一个文件,然后来 git merge 了。即便真实情况中遇到,肯定也是通过复杂的手段避免了。
今天就权当学习了:
1 | git checkout master |
此时 git 处于 MERGING 状态,具体表现为:(master|MERGING)。

如果想用 git switch 逃避的话,也会得到输出 error: you need to resolve your current index first。
所谓的 HEAD 代表 HEAD 所指的 master,由于我在 master 上 git merge another,所以 master 是 Current,another 是 incoming。个人以为这个还是很重要。
刚才自己多玩了几个参数,结果差点兜不住。
git 给的提示是很好的。让 restore 的地方就暴力点 restore .,让 restore --staged 的地方就 restore --staged .;说 Untracked files 就全都 rm 喽。
只要没进 MERGING,就不用 --abort 办事,不然反而会说 MERGE_HEAD missing。
3. —squash
还是刚刚那个情形:
都在第 2 次提交,master 上有 1.txt,another 上有 2.txt。
接下来是:
1 | git checkout master |

这里可以看到,2.txt 在 暂存区 了!
对 1.txt 处理冲突之后:
1 | git add 1.txt |
1 | git commit -m "Mg: another to master" |

这种量比较小的,我觉得还是比较适合 --squash,尽管 --squash 可以将很多 commit 浓缩成一个。
现在 master 还是 master,原本的 another 还是 another,二者井水不犯河水。
在 git merge --squash 操作的时候,也可以看到当时的 master 分支并没有处于 MERGING 状态,那么自然也不可能通过 --abort 解除了。
因为 --squash 的出现,使得 another 上的所有提交与 master 当前的 status 比较,最后给出了只需一个 commit 就能让原本 log 复杂的情况,变成 master 提交数目仅+1 的情况。
而有关 Merge 的信息,也只会在 master 上,也就是正操作的分支上留下。
4. others
试想如果几天前我就知道 --continue 可以用来让处理完冲突的直接继续 merge;如果几天前我就知道 --no-commit 可以让我好好处理提交,那该多好;同理 --squash,之前是不知道咋用,没想到这么好啊。
