サーチ…
マージを元に戻す
まだリモートにプッシュされていないマージを元に戻す
まだリモートリポジトリにマージをプッシュしていない場合は、微妙な違いがありますが、コミットを元に戻すのと同じ手順に従います。
マージコミットとブランチから追加されたコミットの両方を元に戻すので、リセットは最も簡単なオプションです。しかし、SHAをどのようにリセットするかを知る必要があります。これは、 git log
に両方のブランチからのコミットが表示されるようにすると難しくなります。間違ったコミット(例えば、別のブランチ上のコミット)にリセットすると、コミットされた作業を破棄することができます。
> git reset --hard <last commit from the branch you are on>
または、マージが最も最近のコミットであると仮定します。
> git reset HEAD~
復帰は、コミットされた作業を破棄しないという点でより安全ですが、復帰を元に戻す必要があるため、ブランチを再度マージすることができます(次のセクションを参照)。
リモートにプッシュされたマージを元に戻す
あなたは新しい機能(add-gremlins)をマージして、
> git merge feature/add-gremlins
...
#Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
501b75d..17a51fd master -> master
その後、マージしたばかりのフィーチャが他の開発者のためにシステムを壊してしまったことが判明しました。すぐに元に戻す必要があります。フィーチャ自体を修正するには時間がかかります。
> git revert -m 1 17a51fd
...
> git push
...
17a51fd..e443799 master -> master
この時点で、gremlinsはシステムから外れており、あなたの仲間の開発者はあなたに叫んでいません。しかし、まだ完了していません。 add-gremlins機能で問題を修正したら、元に戻す前に元に戻す必要があります。
> git checkout feature/add-gremlins
...
#Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
この時点であなたの機能は正常に追加されました。ただし、このタイプのバグは、マージ競合によって導入されることが多いため、ブランチ上のマージ競合を修正できるため、若干異なるワークフローが役立つことがあります。
> git checkout feature/add-gremlins
...
#Merge in master and revert the revert right away. This puts your branch in
#the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
#Now go ahead and fix the bug (various commits go here)
> git checkout master
...
#Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
reflogを使用する
あなたがrebaseを台無しにした場合、もう一度開始するオプションはコミットに戻ることです(pre rebase)。これは、 reflog
を使用して行うことができます(これは過去90日間行ったすべての履歴があります - これは設定可能です):
$ git reflog
4a5cbb3 HEAD@{0}: rebase finished: returning to refs/heads/foo
4a5cbb3 HEAD@{1}: rebase: fixed such and such
904f7f0 HEAD@{2}: rebase: checkout upstream/master
3cbe20a HEAD@{3}: commit: fixed such and such
...
リベースがHEAD@{3}
前にコミットを見ることができます(ハッシュをチェックアウトすることもできます):
git checkout HEAD@{3}
今度は新しいブランチを作成するか、古いブランチを削除するか、もう一度rebaseを試してみてください。
また、 reflog
ポイントに直接リセットすることもできますが、100%確実にしたい場合は、これを行うだけです。
git reset --hard HEAD@{3}
これは、現在のgitツリーを、その時点での状態に合わせて設定します(「変更を元に戻す」を参照)。
これは、別のブランチでリベースされたときにブランチがどのくらいうまく動作するかを一時的に見ているが、結果を保持したくない場合に使用できます。
直前のコミットに戻る
以前のコミットに戻るには、まずgit log
を使ってコミットのハッシュを探しgit log
。
一時的にそのコミットに戻るには、次のコマンドで頭を切り離します。
git checkout 789abcd
これはあなたをコミットする789abcd
ます。頭の上にあるブランチに影響を与えることなく、この古いコミットの上に新しいコミットを作成できるようになりました。 branch
またはcheckout -b
いずれかを使用して、適切なブランチに変更することができます。
変更を保持したまま前のコミットにロールバックするには:
git reset --soft 789abcd
最後のコミットをロールバックするには:
git reset --soft HEAD~
特定のコミット後に行われた変更を永久に破棄するには、以下を使用します。
git reset --hard 789abcd
最後のコミット後に行われた変更を永久に破棄するには:
git reset --hard HEAD~
注意: reflog
とreset
を使用して破棄されたコミットを回復できますが、コミットされていない変更は回復できません。 git stash; git reset
使うgit stash; git reset
代わりにgit reset --hard
すると安全です。
変更を元に戻す
変更を作業コピーのファイルまたはディレクトリに戻します 。
git checkout -- file.txt
現在のディレクトリから再帰的にすべてのファイルパス上で使用され、作業コピー内のすべての変更を元に戻します。
git checkout -- .
変更の一部だけを元に戻すには--patch
使用し--patch
。それぞれの変更について、元に戻すかどうかを尋ねられます。
git checkout --patch -- dir
インデックスに追加された変更を元に戻す。
git reset --hard
--hard
フラグがなければ、これはソフトリセットを行います。
まだリモートにプッシュしていないローカルコミットを使用すると、ソフトリセットを行うこともできます。したがって、ファイルをコミットしてからコミットすることができます。
git reset HEAD~2
上記の例では、最後の2つのコミットを解き、ファイルを作業コピーに戻します。その後、さらに変更と新しいコミットを行うことができます。
注意:これらの操作はすべて、ソフトリセットとは別に、変更内容を完全に削除します。より安全なオプションを使用するには、 git stash -p
またはgit stash
をそれぞれ使用します。 stash pop
元に戻したり、 stash drop
永遠に削除することができstash drop
。
既存のコミットを元に戻す
これらのコミットがリモートリポジトリにプッシュされている場合は、git revertを使用して既存のコミットを元に戻します。いくつかの新しいコミットを記録して、以前のコミットの効果を取り消します。これは、履歴を書き換えずに安全に押すことができます。
あなたがそのリポジトリの他の全てのユーザの脅威を下げたくない限り、 git push --force
使用しないでください 。公開履歴を書き換えないでください。
たとえば、バグを含んでいるコミットをプッシュアップした後、それを取り消す必要がある場合は、次のようにします。
git revert HEAD~1
git push
今度は、あなたのコードをローカルに戻し、コードを修正し、良いコードをプッシュすることは自由です:
git revert HEAD~1
work .. work .. work ..
git add -A .
git commit -m "Update error code"
git push
元に戻すコミットがすでに履歴に戻っている場合は、単にコミットハッシュを渡すことができます。 Gitは元のコミットを元に戻すカウンタコミットを作成します。このコミットをリモートに安全に送ることができます。
git revert 912aaf0228338d0c8fb8cca0a064b0161a451fdc
git push
一連のコミットの元に戻す/やり直す
たくさんのコミットを取り消したいと思っており、それらのうちのいくつかだけを望むとします。
git rebase -i <earlier SHA>
-iはリベースを「対話モード」にします。上で説明したrebaseのように開始しますが、コミットを再生する前に一時停止して、再生中の各コミットを静かに変更できます。 rebase -i
はデフォルトのテキストエディタで開き、コミットのリストが次のように適用されます。
コミットをドロップするには、エディタでその行を削除してください。あなたのプロジェクトに悪いコミットがもう必要ない場合は、上記の行1と3-4を削除することができます.2つのコミットを結合するには、 squash
コマンドまたはfixup
コマンドを使用します