我一直在与另一个人合作我们在 github 上托管的一个 repo。每次我或他拉动时,git 都会强制我们进行合并提交(vim 打开一个提交描述),尽管我们正在处理不同的文件并且肯定没有冲突。
不应该在没有额外的合并提交的情况下添加新的提交吗?
把 git 的历史想象成一张图。您和您的同事都在进行基于提交 A 的新提交;让我们称你的 B 和他的 C。历史现在看起来像这样:
B C
\ /
\ /
A
有两种方法可以将其重新组合在一起。一是合并:
M
/ \
/ \
B C
\ /
\ /
A
另一个是变基(例如 via git pull --rebase
)。在以下示例中,您是要变基的人:
B -- C -- A
两者都有优点和缺点。作为一般规则,如果您尚未推送(或以其他方式共享)您的提交,rebase 工作正常,即您是唯一拥有 B 的人。如果不是这种情况,rebase 将导致非常非常烦人的问题,你会更好地合并。
由于每次提交都记录了整个树的状态,因此即使不同的分支没有修改任何相同的文件,也需要进行合并。
虽然在这种情况下保证不会有任何文本冲突,因此 git 总是能够自动合并来自不同分支的更改,但它不能保证不会有任何语义冲突。例如,一个分支可以修改库中的方法以要求附加参数,而另一个分支则引入对该方法的新调用;即使合并不会报告任何冲突,如果没有额外的更改,生成的代码也不会工作。要求某人进行显式合并提交会引入在进行非工作提交之前捕获此类冲突的机会。在实践中,任何人都不太可能在每次进行合并时检查这种类型的冲突,