Git,如何对 "force"进行 squash rebase

标签 git git-merge git-rebase

我需要将一些提交“压缩”在一起。通常我习惯于做这样的事情:

git rebase -i HEAD~10

但是,现在我收到以下错误:

error: could not apply 2009972... fixes

When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".

如您所见,git 假装我解决了所有冲突。现在,我不想也无法解决任何冲突。

我需要的是一种方法来告诉 git 类似:“嘿,我不想 merge 任何东西:只获取这个分支中的所有跟踪文件——因为它们出现在最后一次提交中/HEAD,丢弃/删除最新提交之前的前 10 次提交,最后“应用”这些文件作为新提交”:

例如,假设这是所有提交哈希的列表:

1-2-3-4-5-6-7-8-9-10-11-12,其中 HEAD 指向 12。

我想压缩/删除/不管这个操作叫什么,包括 2-11 中的所有提交,以便 git log 之后的最终结果给出:

1-12

其中操作前后的文件必须相同

获取所需内容的命令是什么?

最佳答案

最简单的解决方案(在中止当前 rebase 之后)是:

$ git reset --soft HEAD~10

现在,您的 HEAD 已将十次提交后移,但您的文件都没有更改:它们都将显示为要提交的新更改。

然后,像往常一样提交它们。


这种方法的缺点是您在编写新提交消息时无法访问中间提交消息。

另一种方法是通过指定他们的冲突解决策略,让原始的rebase -i 命令为您工作:

$ git rebase -i -s theirs HEAD~10

虽然首先知道您是如何设法解决冲突会很有趣,rebase -i 通常应该干净地应用。除非这十个提交中的一些本身就是 merge ?

关于Git,如何对 "force"进行 squash rebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293376/

相关文章:

git - 当 `git diff` 显示更改但 `git merge` 不执行任何操作时 merge 分支的正确方法是什么

git - 使用 git rebase --edit-todo 修复脚本后要做什么?

git - 如何将 2 个主题分支 rebase 到一个新分支上?

git - 获取有关特定目录中行贡献的 Git 统计信息

git - 为什么 "git status"不显示分支中未推送的提交?

git - 有 git-merge --dry-run 选项吗?

git - 如果没有冲突则自动远程 merge

Git - merge 与 rebase

Git pull bundle 文件给出 'fatal: Couldn' t find remote ref HEAD'

javascript - 将项目翻译到我的 editorconfig