如何撤消提交并将更改提交到Git中的其他分支?

时间:2010-01-20 11:10:01

标签: git version-control branch

我在git中犯的常见错误是

  1. 不检查我在哪个分支
  2. 将更改提交到错误的分支(在分支B上,认为我在A上,对功能A进行更改)
  3. 如何取回,并将编辑提交到正确的分支?

3 个答案:

答案 0 :(得分:4)

rebase --onto可以在这里提供帮助,特别是如果你有一系列的提交可以撤回。

不要忘记git stash来保存与“wrongBranch”(正确应用提交的那个)相关的当前未提交的更改,以便在结束时弹出它们。过程

基本上,您需要应用提交或提交范围to another branch(此处称为“rightBranch”):

# Checkout the right branch where the commit should have been applied
git checkout rightBranch

# Checkout a new temporary branch at the current location
git checkout -b tmp

# Move the rightBranch branch to the head of patchset which should have been on rightBranch
git branch -f rightBranch last_SHA-1_of_commits_for_rightBranch

# Rebase the patchset onto tmp, the old location of rightBranch 
git rebase --onto tmp first_SHA-1_of_commits_for_rightBranch~1 rightBranch 

first_SHA-1_of_commits_for_rightBranch~1first_SHA-1_of_commits_for_rightBranch的父提交,即提交右侧分支的所有提交都被错误地应用的提交。

rightBranch将再次位于顶部:

  • 右分支的所有旧提交(由tmp分支指出)
  • 以及所有相关提交的范围均为wrongBranch,刚刚在tmptmp是之前的rightBranch HEAD)重播。

然后,您可以将wrongBranch重置为之前的某些提交。

git checkout wrongBranch
git reset --hard some_older_commit

# if needed, re-apply what you were working on vefore this all proccess
git stash pop

警告:

  • 采摘樱桃或改变 - 有后果(见this question
  • 如果wrongBranch已经发布(推送到公共回购站),对于那些拉动该回购的人来说可能会很尴尬(必须在“新”分支之上修改所有更改)

答案 1 :(得分:0)

签出提交所在的错误分支

git checkout wrong_branch

在错误的分支中,重置为上一次提交:

git reset --hard HEAD^

注意:指示前一次提交的^运算符,删除多次提交使用~N,其中N是提交次数

结帐到提交应该在

的分支
git checkout right_branch

使用cherry-pick

重新提交提交
git cherry-pick wrong_branch@{1}

注意:wrong_branch @ {1}是执行git reset命令之前的最后一次提交wrong_branch ,例如,在这种情况下也可以使用HEAD @ {2}

要移动多个提交,您可以使用多次调用git cherry-pick或只执行一次git rebase:

git rebase --onto right_branch wrong_branch@{1}~N wrong_branch@{1}

(在这种情况下,重置的相应参数将是HEAD~N)

答案 2 :(得分:0)

简单回答?

git checkout branch_with_wrong_tip
git reset HEAD~1 (or whatever number of commits you want to go back)
git checkout correct_branch
git commit ...etc

请注意重要部分,即软重置(保留更改),而不是任何硬重置,这可能会让您失去更改位置。

这也会将您重置的所有提交恢复为您必须单独或作为一组重新发送的更改。例如。如果你git重置HEAD~10,你将不得不提交所有那些在10次提交中提交的文件,或者将它们整合到一个全新的提交中。当然,这就是你使用这种方法。