如果我没有在分支中进行任何本地提交,git 合并(不是 squash)和变基是否相同?



我想如果我没有进行任何本地提交,那么两者的提交历史记录会是相同的吗?

答案是肯定和否定。

假设您已经为Git克隆了Git存储库的副本(例如。,https://github.com/git/git.git)。您使用自己的mastermain(它们都存在,并且现在总是在GitHub上标识同一个提交,或者无论如何都是这样(,并且没有进行新的提交,但Junio添加了一些现在在GitHub上的提交,所以您运行:

git fetch origin

然后:

git merge

或:

git rebase

origin/mainorigin/master合并或重新建立基础,具体取决于您喜欢这两个。(也就是说,无论M是主还是主,你的M的上游都是你的原点/M。(

  • 默认情况下git merge将对上游执行快进操作。这将使您的分支与远程跟踪名称匹配。

  • 在所有情况下git rebase将检查上游的提示提交,然后";重放";(cherry-pick(您所做的提交,这些提交根本不是提交,然后将分支名称重置为指向此处。这将使您的分支与远程跟踪名称匹配。

所以这里的答案是肯定的。

但请注意上面的短语默认情况下。假设您运行:

git config merge.ff false

或:

git config --global merge.ff false

在过去的某个时刻。那么你的git merge命令就不会使用默认的快进;相反,它将创建一个新的合并提交。所以现在这两个命令给出了不同的结果。

(你确实——正确地——注意到git merge --squash也不会快进,因此可能会做一些你不想做的事情。(

如果将merge.ff配置为only,则普通的git merge将等效于git merge --ff-only,即将尝试快进操作,但如果不可能,则将完全失败。在这种模式下,git mergegit rebase在这种情况下都会做同样的事情,但当您有自己的提交时,git rebase会做一些事情(而git merge --ff-only会失败(。

最新更新