Git 合并 Fast-Forward 与 Git Rebase

Git Merge Fast-Forward vs Git Rebase

快进 git mergegit rebase 有什么区别?难道两者都不能保持历史线性并且没有合并提交吗?如果是这样,为什么一个人会使用一个而不是另一个?如果不是,我认为这是真的,我没有看到的整个故事是什么?

谢谢!

当你领先于主人时,两者做同样的事情。

如果您领先并落后于 master,则快进合并是不可能的,因为 master 上有更新的提交。但在这种情况下,您 可以 变基,根据 master 之前的提交创建新的提交。

当你领先于大师时:

            *E-*F-*G-*H-*I    BRANCH
           /
*A-*B-*C-*D                   MAIN

当你进行快进合并时,主指针向前移动到分支的尖端。当你变基时,分支的每个提交都被移动到 MAIN 的头部之后。最终结果是一样的:

*A-*B-*C-*D-*E-*F-*G-*H-*I MAIN | BRANCH

当您领先或落后于 MAIN 时:

            *E-*F-*G-*H-*I    BRANCH
           /
*A-*B-*C-*D-*J-*K             MAIN

那么你不能快进合并 E..I 到 main 中,因为 J..K 在路上。所以在这种情况下快进是不可能的。

但是你可以将 E..I 变基到 K:

*A-*B-*C-*D-*J-*K-*E'-*F'-*G'-*H'-*I'             MAIN | BRANCH

但是会发生一个新的提交,其中包含 E 的更改并附加到 main,然后一个新的提交包含 F 的更改并附加到 main...等等,直到所有提交来自分支已在另一个分支上“移动”/“重播”。结果又是一条历史记录,没有分支和合并。

因为必须重新应用提交并且可能会解决冲突,所以实际提交将发生变化,生成新的提交 ID 等。