Reset と Revert を使用して Git でプッシュされたコミットを元に戻す

Ankit Raj Goyal 2023年1月30日
  1. git reset コマンドでプッシュされたコミットを元に戻す
  2. git revert コマンドでプッシュされたコミットを元に戻す
  3. git checkout コマンドでプッシュされたコミットを元に戻す
Reset と Revert を使用して Git でプッシュされたコミットを元に戻す

Git のリモートリポジトリからプッシュされたコミットを元に戻す 3つの方法を示します。これには、gitresetrevert、および checkout コマンドを使用します。

git reset を使用すると、不要なコミットの痕跡もリポジトリ履歴から削除されます。ただし、git revert を使用すると、元のコミットと元に戻すコミットの両方が履歴に残ります。

git checkout を使用すると、新しいブランチで変更を元に戻します。

git reset コマンドでプッシュされたコミットを元に戻す

undo_pushed_commits_local リポジトリを作成し、いくつかの正常な(適切な)コミットで埋めます。

mkdir undo_pushed_commits_local
git init

次に、ファイルを追加/変更します。

git add --all
git commit -m "Make healthy commit"

さらにファイルを追加/変更します。

git add -all
git commit -m "Make another healthy commit"

健全なコミットを行う

これらのコミットを GitHub の undo-pushed-commits-remote リポジトリにプッシュします。

git remote add undo-remote git@github.com:danielturidandy/undo-pushed-commits-remote.git

git push undo-remote master

リモートリポジトリのエイリアスを作成する

リモートリポジトリにプッシュ

リモートリポジトリには 2つのコミットがあります。

リモートリポジトリには 2つのコミットがあります

さて、悪いコミットをしましょう。

echo "This is a bad addition" >> file1.txt
echo "This is a bad addition" >> file2.txt
git add -all
git commit -m "Make a bad commit"

悪いコミットをする

このコミットをリモートリポジトリにプッシュします。

git push undo-remote

悪いコミットをプッシュ

私たちのリモコンには悪いコミットがあります:

リモートのコミットが悪い

これで、ローカルリポジトリの最後の適切なコミットにリセットされます。 --hard オプションを使用して、コミット履歴から不正なコミットの痕跡を削除します。

git log
git reset --hard  <SHA of the last good commit>

最後のグッドコミットにリセット

ローカルをリモートリポジトリにプッシュし、-f オプションを使用してプッシュを強制します。

git push -f undo-remote

不正なコミットがリモートリポジトリから削除されます

この方法は、プライベートリポジトリまたは小さなチームのリポジトリで最適に機能します。

悪いコミットをプッシュした後、良い状態にリセットする前に一部の開発者がリモートをローカル環境にプルすると、大規模なチームが問題に直面する可能性があります。リポジトリを修正するための不正なコミットの情報を含むコミット履歴はありません。

git revert コマンドでプッシュされたコミットを元に戻す

ここでは、4つの不正なコミットをリモートリポジトリにプッシュしました。

リモートにプッシュされた 4つの不正なコミット

revert を使用して、単一の不正なコミットまたは一連の不正なコミットを元に戻すことができます。

revert は、不要なコミットを元に戻す新しいコミットを作成します。元のコミットと逆にされたコミットの両方がリポジトリの履歴に残ります。

revert を使用してシングルプッシュコミットを元に戻す

git revert <SHA of the commit we want to revert>

古い悪いコミットを元に戻す新しいコミット

この変更をリモートリポジトリにプッシュします。競合が発生しないことを確認するために、-f フラグを使用することを忘れないでください。

git push -f undo-remote

これで、リモートリポジトリに、不正なコミットを元に戻す新しいコミットが追加されました。

リモートリポジトリの新しい復帰コミット

revert を使用して、プッシュされたコミットの範囲を元に戻する

git revert <SHA of the oldest commit to revert>..<SHA of the newest commit to revert>

コミットの範囲を元に戻す

これにより、指定された範囲内のすべてのコミットが元に戻ります(最も古いコミットは含まれませんが、使用するバージョン/プラットフォームによっても異なります)。

提供された範囲のコミットは、新しいコミットで取り消されます

ここで、-f フラグを使用して変更をリモートにプッシュします。

git push -f undo-remote

リモートリポジトリには復帰コミットがあります

この方法は、大規模なチームが作業しているパブリックリポジトリに最適です。不正なコミットと元に戻すコミットの両方が履歴に残っているため、開発者はローカルリポジトリをすべての不正なプッシュ/復帰で更新し続けることができます。

git checkout コマンドでプッシュされたコミットを元に戻す

このテクニックは、悪いコミットなしで新しいブランチをフォークするクイックハックです。小さなコードベースや時間が足りない場合に最適です。

最初にチェックアウトして最後の適切なコミットを行います。

git checkout <SHA of last known good commit>

次に、リポジトリ履歴で最後に既知の正常なコミットで、切り離された HEAD 状態に到達します。

ここで、この状態から新しいブランチをフォークします。

git checkout -b branch_without_badcommits

次に、それをリモートの新しいブランチにプッシュします。

git push -f undo-remote branch_without_badcommits

悪いコミットなしで新しいブランチを作成してプッシュする

リモートリポジトリには、不正なコミットがない新しいブランチがあります。

リモートリポジトリには、不正なコミットのない新しいブランチがあります

関連記事 - Git Undo