サーチ…


マージを元に戻す

まだリモートにプッシュされていないマージを元に戻す

まだリモートリポジトリにマージをプッシュしていない場合は、微妙な違いがありますが、コミット元に戻すのと同じ手順に従います。

マージコミットとブランチから追加されたコミットの両方を元に戻すので、リセットは最も簡単なオプションです。しかし、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~

注意: reflogresetを使用して破棄されたコミットを回復できますが、コミットされていない変更は回復できません。 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コマンドを使用しますここに画像の説明を入力



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow