Git 从 master 分支拉取其他提交后压缩提交

Git squash commits after pulling other commits from master branch

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

commit 1
commit 2
commit 3
commit 4

现在,我从远程 master 拉取,提交历史如下所示 -

//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?如果是,有没有一种方法可以在不重写从 master 分支中提取的提交的情况下压缩我之前的提交?我是 Git 的新手,所以如果我遗漏了一些非常基本的东西,请原谅。

如果您在功能分支中并变基到主分支,则变基不会重写这些提交。如果你的变基范围碰巧 运行 超过提交 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

如果你按照你的建议去做,那么 content 的提交 56 将保持不变(如果没有 rebase 冲突),但是他们的散列会不同,因为他们的 parents 会改变。所以它不再是 56 的提交,而是具有相同内容的不同的提交。强制推送是可以的,当你确定没有其他人正在使用那个远程分支时,否则你重写一些已经从 remote 中提取的东西 he/she。我个人不会在 remote/master.

上这样做