这个答案已经被修改,因为我的理解、图表和结论是错误的。
git pull
会导致合并提交,因为 git 在合并。这可以通过将分支设置为使用 rebase 而不是 merge 来改变。在进行拉取时使用 rebase 而不是 merge 可以提供更线性的历史记录到共享仓库。另一方面,合并提交显示了分支上并行的开发工作。
例如,两个人正在同一个分支上工作。该分支初始状态为:
...->C1
第一个人完成了他们的工作并推送到分支:
...->C1->C2
第二个人完成了工作并想要进行推送,但由于需要更新,所以无法推送。第二个人的本地仓库如下:
...->C1->C3
如果设置为合并(pull),第二个人的代码库(repository)将会是这个样子。
...->C1->C3->M1
\ /
->C2->
其中M1是一个合并提交。这个新分支历史将被推送到仓库。如果改为使用变基(pull --rebase),本地仓库将如下所示:
...->C1->C2->C3
没有合并提交。历史记录已经变得更加线性。
这两种选择都反映了分支的历史。Git允许您选择喜欢的历史记录。
确实有一些情况下,rebase可能会导致远程分支出现问题。但这不是这种情况。我们更喜欢使用rebase,因为它可以简化本来就很复杂的分支历史,并显示相对于共享仓库的历史版本。
您可以设置branch.autosetuprebase=always,让Git自动将您的远程分支建立为rebase而不是master。
git config --global branch.autosetuprebase always
这个设置会让git自动为每个远程分支创建一个配置项:
branch.<branchname>.rebase=true
对于已经设置好的远程分支,您可以自己进行设置。
git config branch.<branchname>.rebase true
我要感谢@LaurensHolst对我之前的说法提出质疑并追究。我确实学到了更多有关git与pull和merge commits如何工作的知识。
如果想了解更多关于merge commits的信息,您可以在ProGit-Book的Contributing to a Project一章中进行阅读。其中的Private Small Team部分展示了merge commits的用法。
git log --no-merges
命令可以查看没有合并记录的日志。 - wjandrea