【问题标题】:Squash first N commits of git history / keep the rest as is [duplicate]压缩 git 历史的前 N ​​次提交/保持其余部分不变 [重复]
【发布时间】:2016-05-06 01:55:38
【问题描述】:

考虑以下问题:

  • 在早期阶段包含一些凭据的私人项目
  • 我们想要开源
  • 我们需要摆脱历史中的凭据
  • 凭据不在单个文件中,而是在代码中
  • 包含多个合并、拉取请求等的复杂历史记录。

我想做什么:

将所有从 root 提交到具有 clean 状态的任意提交压缩到一个大的“初始提交”。

当我这样做时:

git rebase -i --root

然后将第一次提交压缩在一起:

pick Initial commit \
fixup dirty1        |
fixup dirty2        | Squash these to one, to remove credentials.
fixup dirty3        |
fixup clean1        /
pick clean2
pick clean3
...
...

我必须重新设置所有内容并在此之后再次解决所有合并冲突。

我怎样才能压缩前 N 次提交,而不必解决整个历史记录,包括 N + 1 次提交后的合并冲突。

【问题讨论】:

  • 不幸的是,没有办法重写整个历史。这是因为当 clean2 获得它的新父级(被压扁的提交)时,它的哈希值发生了变化。这意味着 clean3 有一个新的父级,它会更改其哈希值,依此类推。
  • 这样就好了。我只是不想再次手动解决每个合并冲突。
  • 我赞成你的问题,但我认为你必须为历史中的每个后续提交处理冲突解决方案。虽然我从未使用过它,但我怀疑这将是 kernel.org/pub/software/scm/git/docs/git-rerere.html 的用例
  • 嗯。我读了这个。而且我认为它不适用。在重新定位的分支上工作,rerere 的提交永远不会被解析,对吧?
  • 我找到了另一个解决方案:davidverhasselt.com/…。我用占位符替换凭据。

标签: git rebase


【解决方案1】:

您可以使用git-rerere 重复使用相同的冲突解决方案。

唯一的缺点是您必须在启用 rerere 之后再解决一次,然后它才能自动重用这些解决方案。

【讨论】:

    【解决方案2】:

    您可以使用git rebase -Xtheirs -i --root。 将第一个提交保留为选择(就像您所做的那样)并将第二行到第 N 行的第一个单词更改为 squash

    -Xtheirs 将为您管理合并问题,我想这就是您要在这里寻找的。​​p>

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 2021-04-25
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多