Git squash在从master分支中提取其他提交后提交

时间:2017-11-18 04:57:13

标签: git git-squash

假设我在本地分支A上进行了以下提交,然后将其推送到远程分支。

commit 1
commit 2
commit 3
commit 4

现在,我从远程主服务器中提取,提交历史记录如下所示 -

//From branch A
commit 1
commit 2
commit 3
commit 4
//From master
commit 5
commit 6

如果我现在想使用git rebase -i和git push -f来压缩提交2和3,那么重写是否会提交5和6?如果是的话,有没有办法可以压缩我之前的提交而不重写我从主分支中提取的提交?我是Git的新手,所以如果我错过了一些非常基本的东西,请原谅。

2 个答案:

答案 0 :(得分:2)

如果您在功能分支中并重新定位到主服务器上,则Rebase不会重写这些提交。如果您的rebase范围碰巧在提交5和6上运行,那么它们将被复制和修改,但您不会丢失任何东西。这是一个正常的操作,git不会就地提交提交,新的提交会随着任何必要的更改而创建。在功能分支内部运行git rebase -i master将复制功能分支的唯一提交,然后在分支的更新版本上重新应用它们。

假设提交6是您的HEAD,提交5和6基本上被删除,并在更新分支的基础时重新出现在提交1之前。然后根据你的指示重播提交1-4。

但是,如果提交1是您的HEAD,git rebase -i master将撤消提交1-4,并用您的壁球指令重播它们,从而产生新的历史:6< -5< -4< - 1',其中提交2和3被压扁,5和6不受影响。

有关变基的更多细节和更好的解释可以在here找到。

答案 1 :(得分:0)

如果你做了你的建议,那么提交56内容将保持不变(如果没有rebase冲突),但是他们的哈希将是不同的,因为他们的父母会改变。因此,它不再是提交56,而是具有相同内容的不同提交。当您确定没有其他人正在使用该远程分支时,强制推送是可以的,否则您将重写他/她已从remote中提取的内容。我个人不会在remote/master上这样做。