如何在不覆盖历史的情况下将更改从master分离到另一个分支?

时间:2011-02-23 22:45:14

标签: git branching-and-merging

最近我开始为我的项目实现新的实验性功能。不幸的是,我忘了在开始之前进行分支,并将多个提交推送到共享存储库服务器进入主分支。由于其他人可能已经检查过我的提交,我希望避免覆盖服务器上的历史记录。

由于我的更改,主人目前不稳定,这也不好。因此,我想恢复对master的更改,创建一个包含这些更改的单独分支,并且一旦它们足够稳定,仍然可以将它们重新引入(合并)到master。

2 个答案:

答案 0 :(得分:2)

这个答案使用命令行工具,并采用不同的方法来管理分支。它可能比使用多种口味的多次重置更容易混淆。

Git 1.7.2及更高版本中的revert命令可以在一个命令中恢复多个提交:

git revert last-stable..

这将在last-stable之后为每次提交创建恢复提交,包括当前HEAD提交(按相反顺序)。如果您正在处理许多不需要的提交,那么您可能希望在一次提交中将它们全部还原:

git revert -n last-stable..
git commit # edit the message to explain that you are reverting multiple commits

以下是如何将其与其他一些命令一起在恢复提交之上重新建立实验分支:
(假设共享分支名为master

# Make sure we have the latest shared master
git checkout master
git pull

# Mark the last experimental commit
git branch experimental

# Revert the experimental commits
git revert last-stable.. # optionally use -n and manually commit batched reverts

# Replay the experimental commits on top of the reverted commits
git checkout -B experimental master
git cherry-pick last-stable..experimental@{1}

答案 1 :(得分:1)

在我写这个问题时,我已经找到了问题的解决方案。我描述了解决方案,希望将来可能对某人有用。对于所有的变化我使用gitk和git-gui。我建议你做同样的事情,因为它比使用命令行要容易得多,你将对所发生的事情有一个直观的了解。以下是我采取的步骤:

  1. 执行硬重置到上一次稳定提交。这将从索引和工作目录中删除所有不稳定的更改。
  2. 对共享服务器上的最后一次提交执行混合重置。这会将索引重置为共享服务器上的当前提交,但会使工作目录保持稳定状态。
  3. 提交工作目录中的所有更改。然后,您将提交将取消主服务器上所有不稳定更改的提交。
  4. 在此提交中创建实验分支并检查它。此时实验分支将没有实验代码,所以让我们解决这个问题。
  5. Cherry挑选所有应该进入实验分支的提交。这样,您将在实验分支上重新引入这些更改。确保不要挑选我们刚刚提交的最后一次提交。如果使用gitk,它会显示一条警告,说明您正在尝试挑选已经在分支中的提交 - 忽略这些警告并继续。
  6. 中提琴。你完成了。
  7. 为了安全起见,我建议您在本地进行所有更改,并在完成后将其推送并确保一切正确。然后,如果出现错误,您可以随时删除存储库并从共享服务器再次克隆它。