git - 如何用普通提交压缩 merge 提交?

标签 git github merge commit squash

commit b0e5db36ed68d4562275adeb08001b1316a4da52
Merge: ea38baa 8220bb1

commit ea38baa3f46a48722987b8dd3892d2b8d81c4d1a

在这种情况下,我如何压缩这两个提交

我在用
git rebase -i HEAD~2

但这不起作用,因为它删除了 merge 提交并且不可用于挤压

最佳答案

所以这里要考虑两个因素:

一、几个方面rebase merge 提交并不总是很好。我会回到那几次。

其次,您期望的结果并不完全清楚。如果现在你有类似的东西

x -- x -- M -- C <--(master)
 \       /
  A --- B

你想结束
x -- x -- ABC <--(master)

或者
x -- x -- MC <--(master)
 \       /
  A --- B

如果您想要带有 ABC 的版本,很简单。虽然 M没有出现在 rebase 的 TODO 列表中,所有由 M 带入主线的提交| (即本例中的 AB)是。所以只需标记 BC为“ Squash ”。唯一要记住的是,这是历史重写,所以如果你已经推送了任何可以到达 A 的引用。 , B , M , 或 C然后可能需要进行一些清理(请参阅“从上游 rebase 恢复”下的 rebase 文档)。

如果您想要带有 MC 的版本,那么问题就很多了。不是说你不能得到它,但我认为你不能通过做 rebase 得到它。 ;还有,MC将是一个“邪恶的 merge ”,这可能会导致 future 出现问题 rebase也尝试(除其他外)。

默认 rebase尝试产生线性历史并且不会产生 merge 提交。您可以使用 --preserve-merges 生成 merge 提交。选项,但这与 -i 交互不佳(如果您尝试通过这样做来修改 merge ,我预计会出现几个可能的问题)。

如果你不担心在 merge 提交中 stash 更改的问题,并且真的想产生像 MC 这样的提交。 ,那么这样做的方法是:

首先,移动master引用回 M同时保留来自 C 的更改在索引中。
git checkout master
git reset --soft HEAD^

然后将更改直接重新应用到 merge 提交
git commit --amend

关于git - 如何用普通提交压缩 merge 提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888343/

相关文章:

git - 如何使用 Jenkins 为许多 repos 创建和推送新的 Github 分支?

git - 如何将 git diff 本地更改更改为不同的分支?

linux - Git 和 crontab

GitHub 凭证助手与 wincred 凭证助手冲突

github - 将 Codacy 问题导入 GitHub

javascript - 合并空单元格的 Extendscript 不适用于一页上的多个表格

ruby-on-rails - 无法推送到 heroku - 捆绑程序失败

git - 使用多个id_rsa文件(SSH-KEYGEN)在github上推送

python - 在 Python 中合并二维列表和一维列表的最佳方法?

r - 合并数据、设置 NA 值和替换 NA 值