【问题标题】:How do I cleanup Git Commits messed up by Rebase如何清理被 Rebase 搞砸的 Git 提交
【发布时间】:2015-03-26 14:52:16
【问题描述】:

这是我搞砸之前提交历史的样子:

A B C [master]
     \
      D E F G H I [refactor]

这是我当前的提交历史的样子:

A --------------- E B C F D [master branch]
 \
  B C D E F G H I [refactor branch]

这是我想要的样子:

A B C D F G       [master branch]
           \
            E H I [refactor branch]

我没有完全理解 rebase 命令要做什么,所以我现在有点混乱。这给我留下了两个问题:

  1. 有没有办法轻松撤消最后一个 rebase 命令的影响 你跑了? (因为我可能会再次搞砸。)

  2. 我应该使用什么系列的命令将我带到我想去的地方 是?我怀疑我想使用 rebase 和 cherry_pick,但不想再把事情搞砸了。

感谢您的时间和帮助。

【问题讨论】:

  • 在我用 rebase 搞砸之前添加了历史的外观。
  • 从您的图表中不清楚发生了什么。

标签: git commit rebase undo


【解决方案1】:

不应该有任何挑选樱桃的需要——你想要的结果是一个似乎已经存在的单个分支(重构)。编辑:我刚刚意识到它并不完全相同。我会在最后添加一个注释。

请注意,您的第一个图表不可能真正存在:您不能在不同的分支中拥有完全相同的提交(您可能有不同的提交哈希,但它们中的更改相同)。

另外请注意,您正在做的事情会使 master 与您可能已经推送到的任何存储库不兼容 - 如果您已经与其他人共享 master,那么重新设置 master 通常不是您想要的。通常,您会将分支重新设置在 master 之上(然后将分支合并到 master 中)。

无论如何,这应该满足您的要求,假设“重构”中的提交是好的:

git branch old-master master # just so you don't lose anything...
git checkout refactor
git branch -d master
# git rebase --interactive D # commit D is the one in refactor branch
git branch master G # commit G is the one in refactor branch

我添加了 rebase 命令,在中间注释掉了:如果你真的想重新排序 E、F 和 G,这将很有用,如图所示。在 rebase 编辑器中,您可以根据需要对提交进行重新排序,git 会尝试这样做——但是当被问到时,您可能需要手动修复。

就“撤消变基”而言,这是可能的,但需要更深入地研究 git:参见例如this answergit reflog 输出。

【讨论】:

  • 你是对的,对于两个分支之间似乎共享的提交,SHA1 哈希值不同。不过,它们的相关内容似乎确实相同。
  • 我要试试这个。什么可能出错? :)
  • 似乎 git rebase --undo 命令可能是一个有价值的补充。
【解决方案2】:

很难知道“撤消”您所做的事情的最佳选择是什么。 你应该指出你的分支在你的 rebase 之后的样子以及你实际输入的命令。

假设你的初始状态是:

A --------------- E B C F D [master branch]
 \
  B C D E F G H I [refactor branch]

你想要的

A E B C F D       [master branch]
           \
            B' C' D' F' E' H' I' [refactor branch]

请注意,B 变成 B',C 变成 C',等等。

那么你应该这样做:

$ git rebase <upstream> <branch>

$ git rebase master refactor

如果您想将提交 B'、C' 等压缩到一个提交中,您可以使用 rebase 命令的 -i 选项执行此操作,以便最终获得:

A E B C F D [主分支] \ B" [重构分支]

其中 B" 是来自 B、C 等的最终 squash 提交 请看git rebase documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多