Git Revertの使い方


107

使い方はgit revert

これは重複した質問のように聞こえるかもしれませんが、人々がそれを尋ねるとき、応答はしばしばGitのSHAハッシュによるコミットに戻すように使用git resetれますか?

次に、誰かがgit reset人々の使用方法を尋ねるgit revertと、Gitに従って使用する必要があると返信します-ロールバックする方法

あなたがそれを知る前に、8人の異なる人々がOPのお尻を保存するための独自の方法で登場しました。

では、ブリーフを貼り付けて、ダミーガイドをに書いてみましょうgit revert

シナリオ:マスターとその悪いことに2度コミットした。あなたがプッシュし、他の人があなたの悪い変化を持っています。

元に戻したい。自分でコードで手動で元に戻すことはできません。たとえば、ウィザードやパッケージマネージャーがいたるところに大量の変更を加えたとしましょう。元の状態に戻すだけです。

これがソース管理のすべてです。きっと簡単でしょう。

さて、あなたは使うつもりですgit revertが、どうやって?

そして走った後、git revertあなたはその後何か他のことをしなければなりませんか?元に戻した変更をコミットする必要がありますか、それともリポジトリに直接コミットしますか?

もちろん、もう一度プッシュして、おそらくチームにボールアップをアナウンスする必要があります。

回答:


119

git revertは新しいコミットを行います

git revert 単に、既存のコミットと反対の新しいコミットを作成します。

元に戻されたコミットが存在しなかったかのように、ファイルを同じ状態のままにします。たとえば、次の簡単な例を考えてみます。

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

この例では、コミット履歴には2つのコミットがあり、最後のコミットは誤りです。git revertの使用:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

ログには3つのコミットがあります。

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

そのため、何が起こったかの一貫した履歴がありますが、ファイルは、不正な更新が発生しなかったかのようです。

cat README.md 
Initial text

履歴のどこで元に戻すかは関係ありません(上記の例では、最後のコミットが元に戻されます。どのコミットでも元に戻すことができます)。

閉会の質問

あなたは後に何か他のことをしなければなりませんか?

A git revert単なる別のコミットです。たとえば、リモートにプッシュして、他のユーザーが変更をプル/フェッチ/マージして、完了します。

行った変更をコミットする必要がありますか、それともリポジトリに直接コミットしますか?

git revert コミットです-単一のコミットを元に戻すことがあなたがやりたいことであると想定して、追加の手順はありません。

明らかに、もう一度プッシュして、おそらくチームに発表する必要があります。

確かに-リモートが不安定な状態の場合-修正(元に戻すコミット)を取得するためにプルする必要があるチームの他のメンバーと通信することは、正しいことです:)。


確認のために、ここの最初のステートメントと、それがどのように機能するかについて疑問に思った同じことを疑問に思っている人の両方に対して、元に戻すことができます。元に戻した後、いくつかの新しいコミットがあります。したがって、本当に元に戻すとは、元に戻すコミットの反対のコミットにすぎません。もちろん、衝突するかもしれませんが...それは別の話です。
GG2

私はいつもそれが良いだけで最初の変更を確認し、私の使用して、それをコミットを避けるために見つける、git revert -n <commitToRevet> または git revert --no-commit <commitToRevet>
Eklavyaa

2
何年もスタックオーバーフローを経験した結果、これが今まで出会った中で最高の答えの1つになると思います。素晴らしい例と説明。ありがとう。
user3344977


1
@wviana見つけた情報が不十分な場合は、回答を書き込んでください。スタックオーバーフローは公式ドキュメント(リンクしているようであり、この質問よりもはるかに広い範囲をカバーしている)の代わりにはなりません。
AD7six

35

git revertを次のように使用します。

git revert <insert bad commit hash here>

git revertロールバックされた変更を含む新しいコミットを作成します。git reset新しいコミットを作成する代わりに、git履歴を消去します。

その後の手順は、他のコミットと同じです。


「コミットを元に戻す」と「コミットを元に戻す」の違いは非常に微妙なので、このコマンドに何年も取り組んできました。あなたの説明は私のためにそれを即座に解決しました。ありがとう!
claviska

24

同じ会話の中で頻繁に出てくる理由resetとそのrevert傾向は、バージョン管理システムが異なるとそれらを使用して異なることを意味するためです。

特に、ファイルへのコミットされていない変更を破棄したいSVNまたはP4に慣れている人々はrevert、実際に欲しいと言われる前に手を伸ばすことがよくありますreset

同様に、revert他のVCSで同等のrollbackものと呼ばれることもよくありますが、「ロールバック」は「最後の数回のコミットを完全に破棄したい」ことを意味する場合もresetありrevertます。したがって、人々が何をしたいのかを知っているが、そのためにどのコマンドを使用する必要があるのか​​が明確でないという混乱がたくさんあります。

元に戻すことに関する実際の質問については...

さて、あなたはgit revertを使うつもりですが、どうやって?

git revert first-bad-commit..last-bad-commit

そして、git revertを実行した後、何か他のことをする必要がありますか?元に戻した変更をコミットする必要がありますか、それともリポジトリに直接コミットしますか?

デフォルトでgit revertは、コミットメッセージの入力を求め、結果をコミットします。これは上書きできます。私はマニュアルページを引用します

-編集

このオプションを使用すると、git revertを使用すると、復帰をコミットする前にコミットメッセージを編集できます。これは、端末からコマンドを実行する場合のデフォルトです。

-コミットなし

通常、コマンドはいくつかのコミットを自動的に作成し、どのコミットが元に戻されたかを示すコミットログメッセージが表示されます。このフラグは、名前付きコミットを作業ツリーとインデックスに戻すために必要な変更を適用しますが、コミットは行いません。さらに、このオプションを使用する場合、インデックスはHEADコミットと一致する必要はありません。元に戻す操作は、インデックスの開始状態に対して行われます。

これは、行のインデックスに対する複数のコミットの効果を元に戻すときに役立ちます。

特に、デフォルトでは、元に戻すコミットごとに新しいコミットが作成されます。を使用revert --no-commitして、個別のコミットとしてそれらの変更をコミットすることなく、それらすべてを元に戻す変更を作成し、自由にコミットできます。


git revert first-bad-commit..last-bad-commit:私はこれはそうあるべきだと思いますgit revert parent-of-first-bad-commit..last-bad-commit
user1071847

9

質問はかなり古いですが、元に戻すことはまだ私を混乱させる人々です

初心者として、いくつかの試行錯誤(試行よりも多くのエラー)の後、私は重要なポイントを持っています。

  • git revert削除したいコミットのIDを履歴に保持する必要があります

  • git reset保持したいコミット必要であり、その結果、その後履歴からすべてが削除されます。

つまりrevert、最初のコミットIDで使用すると、空のディレクトリと追加のコミットが履歴に表示されますが、リセットするとディレクトリがリセットされます。最初のコミットに戻ると、履歴はあたかも取得されます。最後のコミットは行われませんでした。

さらに明確にするために、次のようなログを使用します。

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

git revert cb76ee4will を使用すると、デフォルトでファイルが01b56c6に戻り、履歴にさらにコミットが追加されます。

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 代わりに、ファイルを01b56c6に戻し、その後、履歴から他のコミットをクリーンアップします。

01b56c6 test
2e407ce first commit

私はこれらが「基礎」であることを知っていますがrevert、最初のID(「最初のコミット」)で実行することにより、私にとっては非常に混乱しました。最初のファイルを見つけることを期待していました。 「最初のコミット」として、次のIDを使用する必要があります。


私は同じことを観察しました。本当に混乱しますが、知っておくことがとても重要です。つい最近、私は同僚を助けなければならず、これを忘れていました。それは少し恥ずかしかったです。
ExOfDe

1

次のような「git revert commit id」を実行して、いくつかのコミットを元に戻しました。

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

次に、復帰をコミットするように求められました(「git commit」を実行するときと同じように)。私のデフォルトの端末プログラムはVimなので、実行しました:

:wq 

最後に私は変更をリポジトリにプッシュしました:

git push
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.