Git 重置(不难)然后快进合并某些提交

Git reset (not hard) then fast forward merging of certain commit

案例: 分支机构A Commit1 -> Commit2 -> Commit3 -> Commit4

头部当前在 Commit4 中。

我想重置回(不难)到 Commit1 并使用 Commit1 作为基础以仅实施在 Commit4 中所做的任何更改。

所以最后的结果是: 提交 1 -> 提交 4

是否有任何 git 命令可以做到这一点?或者我应该回滚到 Commit1 并手动实施在 Commit4 中完成的更改?

谢谢!

交互式变基是我在这里要做的。

假设 commit1 的哈希值是 27af3(我在这里选择一个随机数来说明——执行 'git log' 以获得实际的哈希值)

你可以这样做:

    git rebase --interactive 27af3

这将为您呈现一个显示提交列表的文本编辑器屏幕。删除包含 Commit2 和 Commit3 的行,然后保存并退出。您将坐在您指定的所需结束状态。

请注意,此过程将销毁提交 2 和 3,因此如果您想保留它们以供其他用途,请小心处理。

另请注意,如果您已经将这四个提交中的任何一个推送到任何地方的 public 服务器,则不应执行此操作。变基一般只应用于树的严格局部部分。

根据您的问题,我很清楚您希望提交序列读取:

... <- C1 <- new-C4   <-- branch

(记住,箭头总是指向过去的历史,而不是指向未来)。

清楚你是否希望你的新提交(我在上面称之为 new-C4 )保持源在 old C4,或者是否要放弃在 C2C3 中所做的所有更改,同时只保留 更改 C4.

制作

您可以使用 git rebase 实现后一个结果,但请记住通常的警告,即您永远不应该对已发布的提交进行变基。要做到这一点,只需 运行:

git rebase -i HEAD~4

这将打开一个编辑器会话,您可以在其中保留或放弃特定的提交。见 answer linked in , or .

如果您想保留C2C3引入的更改,同时丢弃提交本身, 然后 git reset --soft 后跟 git commit 是正确的方法。参见 VonC's answer here