web-dev-qa-db-ja.com

間違ったGitブランチへのコミットを修正するにはどうすればいいですか?

私はちょうど間違ったブランチに完全に良いコミットをしました。どうすれば私のマスターブランチで最後のコミットを元に戻し、それからそれらの同じ変更を行ってそれらをアップグレードブランチに入れることができますか?

546
mikewilliamson

まだ変更をプッシュしていない場合は、ソフトリセットを実行することもできます。

git reset --soft HEAD^

これはコミットを元に戻しますが、コミットされた変更をインデックスに戻します。ブランチが互いに関して比較的最新のものであると仮定すると、gitは他のブランチへのチェックアウトを可能にします、そこであなたは単にコミットすることができます:

git checkout branch
git commit

デメリットは、コミットメッセージを再入力する必要があることです。

845
Blair Holloway

あなたがきれいな(未修正の)作業コピーを持っているならば

1つのコミットをロールバックするには(次のステップのためにコミットのハッシュに注意してください)。

git reset --hard HEAD^

そのコミットを別のブランチに引っ張るには:

git checkout other-branch
git cherry-pick COMMIT-HASH

変更を修正または追跡していない場合

またgit reset --hard追跡されていない、変更された変更を削除しますあなたが持つかもしれないので、あなたが望むならそれらを持っているかもしれません:

git reset HEAD^
git checkout .
108
Michael Mrozek

4年遅れて話題になりましたが、これは誰かに役立つかもしれません。

コミットする前に新しいブランチを作成するのを忘れて、マスターですべてコミットした場合は、コミットの数に関係なく、次の方法が簡単です。

git stash                       # skip if all changes are committed
git branch my_feature
git reset --hard Origin/master
git checkout my_feature
git stash pop                   # skip if all changes were committed

これであなたのマスターブランチはOrigin/masterと等しくなり、新しいコミットはすべてmy_featureになります。 my_featureはローカルブランチであり、リモートブランチではないことに注意してください。

104
fotanus

変更をすでにプッシュしている場合は、HEADをリセットした後に次のプッシュを強制する必要があります。

git reset --hard HEAD^
git merge COMMIT_SHA1
git Push --force

Warning:ハードリセットをすると作業コピーのコミットされていない変更を元に戻しますが、強制プッシュするとリモートブランチの状態をローカルブランチの現在の状態で完全に上書きします。

念のため、(Bashではなく、Windowsコマンドラインを使用して)Windows上では、実際には1つではなく4つの^^^^なので、

git reset --hard HEAD^^^^
20
Igor Zevaka

私は最近同じことをしました、私が誤って他のブランチにコミットするべきだったときに、私は誤ってマスターに変更をコミットしました。しかし、私は何もプッシュしませんでした。

間違ったブランチにコミットし、それ以降何も変更しておらず、リポジトリにプッシュしていない場合は、次の手順を実行できます。

// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes. 
git reset HEAD~1 

// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash

// create other-branch (if the other branch doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// take the temporary commit you created, and apply all of those changes to the new branch. 
//This also deletes the temporary commit from the stack of temp commits.
git stash pop

// add the changes you want with git add...

// re-commit your changes onto other-branch
git commit -m "some message..."

注意:上の例では、1コミットをgit reset HEAD〜1で巻き戻していました。しかし、nコミットを巻き戻したい場合は、git reset HEAD〜nを実行できます。

また、間違ったブランチにコミットしてしまい、間違ったブランチにコミットしたことに気付く前にさらにコードを書くようになった場合は、git stashを使用して進行中の作業を保存できます。

// save the not-ready-to-commit work you're in the middle of
git stash 

// rewind n commits
git reset HEAD~n 

// stash the committed changes as a single temp commit onto the stack. 
git stash 

// create other-branch (if it doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// apply all the committed changes to the new branch
git stash pop

// add the changes you want with git add...

// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."

// pop the changes you were in the middle of and continue coding
git stash pop

注:私は参照としてこのウェブサイトを使用しました https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

13
Ali Mizan

あなたのシナリオがmasterにコミットしたがanother-branchにコミットすることを意図したものである(まだ存在していないかもしれません)があなたがまだプッシュしていないのなら、これは直すのがとても簡単です。

// if your branch doesn't exist, then add the -b argument 
git checkout -b another-branch
git branch --force master Origin/master

masterへのコミットはすべてanother-branchに行われます。

からの愛をもとに調達: http://haacked.com/archive/2015/06/29/git-migrate/

7
Lorcan O'Neill

移動するコミットが複数ある場合は、 この回答 について詳しく説明します。 developからnew_branch

git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
3
arsenius

この問題が発生し、Visual Studioを使用している場合は、次のことを実行できます。

ブランチを右クリックしてView Historyを選択してください。

enter image description here

戻りたいコミットを右クリックします。そして必要に応じて元に戻すかリセットします。

enter image description here

1
Trevor

変更を適用したいブランチが既に存在する場合(例えばbranchDevelop)、 fotanus)によって提供された指示に従ってください。 以下、そして:

git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature

そして明らかにあなたはtempbranchまたはmy_featureの代わりに他のブランチ名を使うことができます欲しいなら.

また、該当する場合は、ターゲットブランチでマージするまでスタッシュポップを適用(遅延)します。

1
fbicknel