2012-03-12 99 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重置意味着你的更改將保持上演,它將把混帳的狀態,因爲它看起來你做的提交之前,所以你只需要切換分支並重新提交您的更改。

相關問題