Git 合并 Fast-Forward 与 Git Rebase
Git Merge Fast-Forward vs Git Rebase
快进 git merge
和 git 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 等。
快进 git merge
和 git 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 等。