【发布时间】:2014-03-09 05:51:01
【问题描述】:
我将我所有的东西都提交给了 feature/1234 这样的特殊分支。一个我们认为已经完成的功能随后被合并到 master 中。 此功能需要再次返回开发,但 master 中还有其他提交需要立即上线。
我怎样才能从 master 中获取这些单个提交并仍然将它们保留在 feature/1234 中?
编辑:来自 feature/1234 的提交不是最新的。
【问题讨论】:
我将我所有的东西都提交给了 feature/1234 这样的特殊分支。一个我们认为已经完成的功能随后被合并到 master 中。 此功能需要再次返回开发,但 master 中还有其他提交需要立即上线。
我怎样才能从 master 中获取这些单个提交并仍然将它们保留在 feature/1234 中?
编辑:来自 feature/1234 的提交不是最新的。
【问题讨论】:
了解问题后再编辑
git rebase 是你的朋友。只需运行git rebase -i commit-id,其中commit-id 是您要删除的三个之前的一个,然后,当默认编辑器打开时,只需删除您不希望在 master 上的三个提交,保存并关闭。
旧版本,误解如果我理解了,你的第二个请求应该没有问题:如果你没有删除分支,提交仍然在feature/1234。
至于第一个请求,去掉commit,直接运行
git reset --hard HEAD~1 会将 HEAD 移回一个提交。
如果你想通过它的 id 返回一个特定的提交,你可以运行git reset --hard commit-id。
有关重置的更多信息:http://git-scm.com/blog/2011/07/11/reset.html 和 https://www.kernel.org/pub/software/scm/git/docs/git-reset.html
【讨论】:
git push -f,强制推送到远程。但是,请注意 Magnus 的说明!如果您认为您的任何同事拉错了主人,您应该让他们force-pull清理他们的历史。抱歉耽搁了,我正在开会
如果你可以重新设置你的分支,那么这有时是删除提交的最干净的方法——它的所有痕迹都会消失。缺点是在有问题的提交进入和您删除提交之间从您的主分支获取的任何分支都将具有与主分支不同的历史记录。如果您不能保证这没有发生(例如,如果您已将您的 repo 发布给其他人),那么最好使用git revert 恢复提交。这将在您的 master 之上产生一个新的提交,从而撤消旧提交的更改。历史因此不断向前发展,子分支可以像往常一样简单地变基到最新。
【讨论】:
If you can rebase your branch