web-dev-qa-db-ja.com

公開されたブランチに誰かがリベースまたはリセットをプッシュした後、どのように回復/再同期しますか?

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

これは、リポジトリが既知の(できれば少人数の)人々のグループによってのみ複製される場合にのみ実際に実行可能であり、リベースまたはリセットをプッシュする人が誰でも次回に注意する必要があることを他の全員に通知できるようにすることに注意してくださいフェッチ(!)。

fooに対するローカルコミットがなく、リベースされる場合、私が見た1つの明白な解決策は機能します。

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

これは、リモートリポジトリの履歴を優先して、fooのローカル状態を破棄するだけです。

しかし、もしその支部に大きなローカルな変更を加えた場合、その状況にどう対処するのでしょうか?

86

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

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を調べてそれを使用すれば、ブックマークなしでこれを行うことができます。

これは、ブックマークの作成を忘れた場合の対処方法beforeフェッチでもあります。何も失われません–リモートブランチのreflogを確認するだけです。

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

これにより、履歴を変更した最新のフェッチの前にOrigin/fooがポイントしたコミットIDが出力されます。

その後、簡単にできます

git rebase --onto Origin/foo $commit foo
74

私はgit-rebaseのmanページの 上流のrebaseからの回復 セクションがこれのほとんどすべてをカバーしていると思います。

自分のリベースから回復するのとまったく同じです。ブランチを1つ移動し、履歴にあるすべてのブランチを新しい位置にリベースします。

11
Cascabel