2012-03-12 64 views
2

我遇到了问题。我已经完成了对master的几次提交。但我犯了一个错误。我需要在branch_a上进行这些提交。我如何取消master上的提交并将它们移动到branch_a。如何取消对提交的提交并将其移动到分支

+0

branch_a是否已经存在?在master上是否有不在branch_a上的不想移动到branch_a的提交? branch_a是否提交了那个主控程序没有的提交? – 2012-03-12 01:53:50

+0

啊,内脏;这可能有助于http://stackoverflow.com/questions/927358/git-undo-last-commit,如果我将是你我会恢复这些变化,然后重做我的功能分支(在你的情况下可能branch_a)并提交变化,希望这有助于,欢呼 – 2012-03-12 01:54:58

+0

Tats_innit似乎有权利。你想做一个'git revert'和'git cherry-pick'的组合。 – Borealid 2012-03-12 01:56:04

回答

2

假设没有其他人已经看到你的变化,掌握和建立在它们之上的东西:

git checkout branch_a 
git cherry-pick <commit sha> # for each commit you want on branch a 
git checkout master 
git reset <commit sha you want to move master back to> 

如果有人您意外高手顶部已建成的东西提交,那么你会想要git revert而不是使用reset

2

如果你只是有几个提交,然后樱桃采摘它们可能是最简单的选择。您可以通过git log master找到提交的哈希值。然后执行以下操作。

git checkout branch_a 
git cherry-pick COMMIT_HASH_1 
git cherry-pick COMMIT_HASH_2 
... 
git checkout master 
git reset --hard COMMIT_HASH_BEFORE 

所有COMMIT_HASH_#你想移动到branch_aCOMMIT_HASH_BEFORE的提交是从你的错误提交之前提交哈希值。 (请注意,这会丢弃工作目录中的任何未提交的更改。)

请注意,如果您已将更改推送到master,并且其他人可能已使用此分支,则您将改为git revert同样承诺你樱桃采摘,否则你会为在分支上工作的其他人造成问题。 (恢复只是创建一个新的提交,撤消了以前的提交。)

1

最好的事情是重置主分支,但保持您的更改。使用樱桃挑选会用新的提交来玷污回购。假设你已经两次提交:

git checkout master 
git reset --soft HEAD~2 
git checkout branch_a 
git commit -m "foo" 

与--soft重置意味着你的更改将保持上演,它将把混帐的状态,因为它看起来你做的提交之前,所以你只需要切换分支并重新提交您的更改。

相关问题