1. ホーム
  2. git

[解決済み] 誰かが公開ブランチにリベースやリセットをプッシュした後、どのように回復/再同期しますか?

2023-04-17 13:44:50

質問

公開した作品をリベースしてはいけない、危険だ、などという話を聞いたことがあります。しかし、リベースが行われた場合にどのように対処するかについて、レシピが投稿されているのを見たことがありません。 が公開された場合にどのように対処するかについてのレシピは投稿されていません。

リベースやリセットをプッシュした人が、次回フェッチするときに注意を払う必要があることを他の全員に知らせることができるようにです。

私が見たことのあるひとつの明白な解決策は、ローカルコミットがないときに foo にローカルコミットがなく、それがリベースされた場合に有効です。

git fetch
git checkout foo
git reset --hard origin/foo

これは単に foo のローカルな状態を捨て、リモートリポジトリの履歴を優先します。

しかし、そのブランチ上でかなりのローカルな変更をコミットしていた場合、どのように対処するのでしょうか?

どのように解決するのでしょうか?

プッシュされたリベースの後に同期を取り戻すのは、ほとんどの場合それほど複雑なことではありません。

git checkout foo
git branch old-foo origin/foo # BEFORE fetching!!
git fetch
git rebase --onto origin/foo old-foo foo
git branch -D old-foo

つまり、まずリモートブランチが元々あった場所をブックマークしておき、それを使ってその時点からのローカルコミットをリベースされたリモートブランチに再生するのです。

リベースは暴力のようなものです。それが問題を解決しないなら、もっと必要なだけです。

もちろんブックマークがなくても、リベース前を調べれば可能です origin/foo のコミット ID を調べて、それを使えば。

これはまた、ブックマークを作り忘れた場合の対処法でもあります。 の前に を忘れてしまった場合の対処法でもあります。リモートブランチの reflog をチェックすればよいだけなので、何も失われることはありません。

git reflog show origin/foo | awk '
    PRINT_NEXT==1 { print $1; exit }
    /fetch: forced-update/ { PRINT_NEXT=1 }'

これは、コミットIDを表示します。 origin/foo が指したコミット ID を表示します。

そうすると、単純に

git rebase --onto origin/foo $commit foo