39 | 集成ブランチへの強制的な push -f 操作の禁止#
-f /--force:強制的な更新
シナリオ:ローカルとリモートが fast-forwards 関係ではない場合、ローカルはリモートにプッシュすることは許されていませんが、git push -f
コマンドを使用すると、ローカルをリモートに強制的に更新することができます。
デモ:リモートのコミットを強制的に削除します。
まず、現在のリモートのコミット履歴を確認してみましょう:
そして、ローカルのコミット履歴を確認してみましょう:
この時点で、ローカルのバージョンを以前のコミット(例:f21c98a)にリセットし、git reset --hard f21c98a
を実行し、再びローカルのコミット履歴を確認してみましょう:
以降のコミット履歴が消えていることに気付きます。
この状態でプッシュを行ってみます:
単純に git push
ではうまくいきませんが、-f
を追加すると成功します。そして、リモートのコミット履歴を確認してみましょう:
いいえ!もしもあなたがリモートの別の開発者なら、ここでどのような感じになるでしょうか?
では、このような操作を防ぐためのメカニズムはありますか?自分で検索してみることができますが、Github と Gitlab はそれぞれ対応する保護メカニズムを提供しています。
📢さらに、git reflog
を使用して削除したブランチを取り戻すこともできます。以下の画像の赤枠を参照してください:
そして、git reset --hard HAED@{n}
を利用して復元できます~
40 | 集成ブランチへの変更履歴操作の禁止#
チーム内の共有ブランチでは rebase 操作を禁止します
例えば:
同僚 A は rebase を使用してコミットのメッセージを変更し、リモートにプッシュしました:
同僚 B は彼が変更する前に、すでに origin/temp ブランチをベースに test_rebase_inter ブランチを作成し、2 つの新しいコミットを提出しました:
この時、同僚 B は自分の更新をプッシュしようとすると問題が発生します。
そして、test_rebase_inter ブランチで開発している他の開発者も同じ問題に直面し、彼らは再び rebase を使用して処理する必要があります。これにより、不必要なトラブルが発生します。
または、同僚 A を見つけて元に戻すように依頼し、具体的な方法は前のセクションで言及した git reflog
を参照してください。
rebase の適用シナリオの一つ:まだリモートにプッシュされていない場合、自分のローカルの複数のコミットを rebase を使用して 1 つのコミットにまとめ、それをプッシュします。
統合開発では、2 つのポイントを忘れないでください:push -f しないこと;リモートの履歴を変更しないこと。