Gitを使用する場合、バグが発生したり、やり直したりする必要があるため、コミットを削除する必要がある場合があります。
最後のコミットは非常に簡単です。実行するだけです:
git reset HEAD^
これにより、最新のコミットがポップされますが、ファイルへの変更はすべてそのまま残ります。
最後のコミット以外を削除する必要がある場合は、2つの方法を使用できます。 1つ目はリベースを使用することで、1つ以上の連続したコミットを削除できます。もう1つは、連続していないコミットを削除できるチェリーピックです。
例gitlog
番号 | ハッシュ | コミットメッセージ | 作成者 |
---|---|---|---|
1 | 2c6a45b | (HEAD)パブリックメソッドの追加保護されたメソッドにアクセスするには | トム |
2 | ae45fab | データベースインターフェイスの更新 | 請負業者1 |
3 | 77b9b82 | データベースインターフェイスの改善 | 請負業者2 |
4 | 3c9093c | 開発ブランチをマスターにマージ | トム |
5 | b3d92c5 | 新しいイベントCMSモジュールの追加 | ポール |
6 | 7feddbb | CMSクラスとファイルの追加 | トム |
7 | a809379 | Gitへのプロジェクトの追加 | トム |
リベースの使用
上記のgitログを使用して、次のコミットを削除します。 2 & 3(ae45fab & 77b9b82)。これらは連続したコミットであるため、リベースを使用できます。
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
たとえばコミットを削除するには2 & 3上記
git rebase --onto repair~3 repair~1 repair
チェリーピックの使用
ステップ1:コミット前にコミットを見つける削除するgit log
ステップ2:コミットするチェックアウトgit checkout <commit hash>
ステップ3 :現在のチェックアウトコミットを使用して新しいブランチを作成しますgit checkout -b <new branch>
ステップ4:削除されたコミットの後にコミットを追加する必要がありますgit cherry-pick <commit hash>
ステップ5:保持したい他のすべてのコミットに対してステップ4を繰り返します。
ステップ6:すべてのコミットが新しいブランチに追加されたらコミットされました。すべてが正しい状態にあり、意図したとおりに機能していることを確認してください。すべてがコミットされていることを再確認します:git status
ステップ7:壊れたブランチに切り替えますgit checkout <broken branch>
ステップ8:削除するブランチの前に、コミットへの壊れたブランチでハードリセットを実行しますgit reset --hard <commit hash>
ステップ9:マージしますこのブランチへの固定ブランチgit merge <branch name>
ステップ10:マージされた変更を元に戻します。警告:これにより、リモートリポジトリが上書きされます! git push --force origin <branch name>
ステップ2 & 3をステップ8に置き換えて、新しいブランチを作成せずにプロセスを実行できます。手順7を実行しない& 9.
例
コミットを削除するとします2 & 4リポジトリから。
-
git checkout b3d92c5
最後に使用可能なコミットをチェックアウトします。 -
git checkout -b repair
作業する新しいブランチを作成します。 -
git cherry-pick 77b9b82
コミット3を実行します。 -
git cherry-pick 2c6a45b
コミット1を実行します。 -
git checkout master
チェックアウトマスター。 -
git reset --hard b3d92c5
マスターを最後に使用可能なコミットにリセットします。 -
git merge repair
新しいブランチをマスターにマージします。 -
git push --hard origin master
マスターをリモートリポジトリにプッシュします。
最後のメモ
Gitリベース&チェリーピックは危険ですが強力です最後にのみ使用する必要があるソリューションオプションであり、彼らが何をしているのかを知っている誰かによってのみ着手されます。どちらのソリューションも、同じリポジトリ/ブランチで作業している他のユーザーに悪影響を与える可能性があることに注意してください。
最後に、注意して頑張ってください!