Reset と Revert を使用して Git でプッシュされたコミットを元に戻す
Git のリモートリポジトリからプッシュされたコミットを元に戻す 3つの方法を示します。これには、gitreset
、revert
、および 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つのコミットがあります。
さて、悪いコミットをしましょう。
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つの不正なコミットをリモートリポジトリにプッシュしました。
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
リモートリポジトリには、不正なコミットがない新しいブランチがあります。