【问题标题】:Squashing latest commits into last merge commit将最新提交压缩到最后一次合并提交
【发布时间】:2020-11-25 07:27:17
【问题描述】:

这是我的结构:

* - commit 2
|
* - commit 1
|
* - Merge commit (feature #1)
|\  
| * - Feature #1 commit 
|/
*

我以前搞砸了,现在我的历史看起来不像我想要的那样干净。

我想知道是否有一种简单的方法可以将 'commit 1' 和 'commit 2' 压缩到 'Merge commit (feature # 1)',所以我最终会得到这样的结果:

* - Merge commit (feature #1)
|\  
| * - Feature #1 commit 
|/
*

rebase -i 似乎无法识别合并提交,并且似乎会将所有内容压缩到 'Feature #1 commit' 中,这是不可取的。
谢谢

【问题讨论】:

  • 我不得不质疑结果是否令人满意。为什么要在合并提交中进行不在“功能 #1 提交”中的其他修改?
  • 我完全同意@j6t。你为什么要努力为你未来的自己(如果不是同事)制造谎言?历史不会反映真实发生的事情。不过,您可能有特定的原因。这里没有评判,只是试图理解。
  • 我同意你们的观点,这似乎有点掩饰。在这种特殊情况下,我是目前唯一一个在 repo 上的人(忙着准备它以供其他人使用),只是为了我的缘故,我希望历史记录尽可能干净。两次提交中的更改并不重要,也不与任何特定的工作相关,所以我只是想如果它不是太复杂的话,我就把它们压扁。

标签: git merge rebase squash


【解决方案1】:

确保您没有上演任何内容 (git added)。然后就做

git reset --soft HEAD~2       # go back across the two commits
git commit --amend            # squash into the merge commit

git reset --soft 不会更改您在工作目录中的内容,也不会更改您已暂存的内容。因此,如果您在“提交 2”之后有 git added 内容,那么 git commit --amend 也会提交这些暂存内容。因此,您必须确保在开始时没有任何内容。 git status 应该会告诉你是不是这样。

【讨论】:

  • 额外强调“确保您没有上演任何内容”或自提交 #2 以来修改的任何形式。 git stash 或 git checkout -- . 在开始壁球之前是值得考虑的选择。此外,这不是严格意义上的壁球:您正在改写历史。现在,有了壁球,我是certain,保留了 3 个“旧”提交。使用 git reset 我不太确定,ref
  • @DaemonPainter 当然,压缩总是会改写历史。在您提到的情况下,这没有什么不同。漂亮的图片很好地隐藏了这一事实。
  • 他们都重写了历史,但是 squash 在旧提交的 SHA 存储库中保留了知识,我不太确定重置。
  • 因此,在我上面的示例中,我提到压缩 * 似乎将 3 个提交压缩为一个提交,在它提交到功能分支的点(即在合并提交之前)。这是否意味着我最终会在主分支上进行一次提交,从而获得线性历史记录?或者它是否保留了 3 个提交“在单独的分支上”然后与合并提交合并的事实。
  • 顺便说一句,感谢@j6t 的帮助。正是我想要的。
猜你喜欢
  • 2023-01-12
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2011-03-26
  • 2019-09-26
  • 2016-05-22
  • 1970-01-01
相关资源
最近更新 更多