【发布时间】:2015-07-22 18:24:11
【问题描述】:
案例: 分行 A 提交1->提交2->提交3->提交4
头部当前在 Commit4 中。
我想重置(不难)到 Commit1 并使用 Commit1 作为基础,只实现在 Commit4 中所做的任何更改。
所以最终结果是: 提交1 -> 提交4
有没有 git 命令可以做到这一点?或者我应该回滚到 Commit1 并手动实施在 Commit4 中完成的更改?
谢谢!
【问题讨论】:
案例: 分行 A 提交1->提交2->提交3->提交4
头部当前在 Commit4 中。
我想重置(不难)到 Commit1 并使用 Commit1 作为基础,只实现在 Commit4 中所做的任何更改。
所以最终结果是: 提交1 -> 提交4
有没有 git 命令可以做到这一点?或者我应该回滚到 Commit1 并手动实施在 Commit4 中完成的更改?
谢谢!
【问题讨论】:
根据您的问题, 对我来说很清楚,您希望提交 sequence 读取:
... <- C1 <- new-C4 <-- branch
(请记住,箭头总是指向过去的历史,而不是指向未来)。
我不清楚你是否希望你的新提交(我在上面称之为new-C4)保持源在旧@987654327中的方式@,或者您是否要放弃在C2 和C3 中所做的所有更改,同时只保留在C4 中所做的更改。
您可以使用git rebase 获得后一种结果,但请记住通常的警告,即您永远不应该对已发布的提交进行变基。要做到这一点,只需运行:
git rebase -i HEAD~4
这将打开一个编辑器会话,您可以在其中保留或丢弃特定的提交。请参阅Martin Konecny's comment 或Barry Gackle's answer 中的answer linked。
如果你想保留由C2和C3引入的更改同时丢弃提交本身,那么git reset --soft后跟git commit是正确的方法。见VonC's answer here。
【讨论】:
我会在这里做一个交互式变基。
假设 commit1 的哈希是 27af3(我在这里选择一个随机数来说明 -- 做一个 'git log' 来获取实际的哈希)
你可以这样做:
git rebase --interactive 27af3
这将为您提供一个显示提交列表的文本编辑器屏幕。删除包含 Commit2 和 Commit3 的行,保存退出。您将处于您指定的期望结束状态。
请注意,此过程会破坏提交 2 和 3,因此如果您想保留它们以供其他用途,请谨慎处理。
还要注意,如果您已经将这四个提交中的任何一个推送到任何地方的公共服务器,则不应这样做。变基通常只应用于树的严格局部部分。
【讨论】: