【问题标题】:Squashing Git commits after merging合并后压缩 Git 提交
【发布时间】:2015-11-04 01:29:27
【问题描述】:

我有一个有几个提交的功能分支(见下文)。自分支以来,master 中也添加了一些提交。

所以我将master 合并到feature 分支中。

git checkout feature
git merge master

这导致feature 分支上的以下日志历史记录:

*    E (HEAD) merging master into feature
|\
| *  D feature commit 2
| |
| *  C feature commit 1
* |  B master commit 2
|/
*    A master commit 1

实际上,功能路径上的提交数量很大(100+),我想将它们全部压缩。

有没有办法只压缩功能分支上的提交,同时保留 master 行上的提交?

【问题讨论】:

  • 你还是希望结果在 feature 分支上有一个提交并与 master 合并,还是希望你的所有工作都应用到 master 上而不分支?
  • 我认为是第一个(如果我理解正确的话)。基本上在上图中,C 和 D 应该被压缩为一个提交,并且应该保留从 master (A, B) 中提取的提交。这样我就可以从这个分支将 C->D->E 直接合并到 master 中。再次感谢!
  • 另一个问题 - 您在功能分支上的历史记录是完全线性的,还是有传入或传出合并?

标签: git branching-and-merging git-rewrite-history


【解决方案1】:

是的,你可以。所以你想把你问题中的提交图变成这个新图:

*    E (HEAD) merging master into feature
|\
| *  D feature commit (squashes 1 and 2)
* |  B master commit 2
|/
*    A master commit 1

程序:

  1. 确保您的工作树是干净的。没有未提交的更改,没有分阶段的更改,没有未跟踪的文件。
  2. 确保您在功能分支上。
  3. git reset --hard *Hash of D on feature branch*
  4. git reset --soft *Hash of A on master*
  5. git commit 提供您想要的信息。
  6. git merge master

【讨论】:

  • 不要忘记在 #4 之后进行更改
  • @CodyStott 不过,软重置已经暗示了分期
  • 啊,好点,我以前从未使用过soft 选项。很高兴知道。
  • 在 #6 之后仍然缺少“B”和“E”之间的链接,Tha 分支主控仍然在“B”上。要完成这项工作,请使用 git checkout mastergit reset --hard feature
【解决方案2】:

如果问题只是针对所有提交都存在于本地存储库中的情况,则问题(除了我的评论)已解决。如果仅涉及语言环境 git 存储库,则相当于:

git checkout feature
git rebase -i
      // mark all commits to be squashed
git merge master

但您应该将 masterbranch 重置为 E 以发布您的更改:

git checkout master
git reset --hard feature

或者(如果你真的更喜欢和comitish一起工作)git reset --hard *Hash of E*。如果C 已经被推送到远程存储库,我将检查git reset 的使用是否有效。

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 2018-11-05
    • 2017-09-26
    • 2012-01-24
    • 2018-11-29
    • 2016-02-08
    • 2015-01-28
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多