1. ホーム
  2. git

[解決済み] リベースの後、変更した内容は失われましたか?

2022-12-31 07:16:17

質問

最近、私が作業していたブランチをリベースしました。ツリーの履歴は次のようなものでした。

1 = 2 = 3 = 4
     \
      5 = 6 = 7
           \
            8

私は自分の変更点(図の8番)をmasterブランチにリベースしたいと思いました(現在、図のコミット4まで)。そこで、次のようにしました。

git checkout my_branch
git rebase master

競合を解決するためにgit mergetool/git rebase --skipを多用する >

実行すると今だけ。

git checkout my_branch
git diff master

差分がゼロになりました。私はブランチを失っていませんが (保存したパッチから私の変更をまだ再作成できます)、私が行ったマージ/リベースが見つかりません。私は何か間違ったことをしたのでしょうか?リベースはまだどこかにあり、私の変更がマスターにマージされているのでしょうか、それとももう一度やらなければならないのでしょうか?

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

何も変化がない場合、変更内容が失われている可能性があります。 おそらく git reflog を使ってリベース前のブランチを特定し、そのブランチに対して git reset --hard <my-branch-tip-before-rebase> を使って元のブランチを取り戻します。 そして、そうです、もう一度このプロセスを実行する必要があります :-(

でも、どうして同じように見えるようになったのか、よくわかりません。 私は、あなたが与えたコマンドで次のように表示されることを期待していました。

1 = 2 = 3 = 4              (master)
     \       \
      \       5' = 6' = 8' (my_branch)
       \
        5 = 6 = 7

この場合、おそらくは rebase --onto :

git rebase --onto master <commit id for 6> my_branch

そうすると、次のようなグラフになったはずです。

1 = 2 = 3 = 4              (master)
     \       \
      \       8'           (my_branch)
       \
        5 = 6 = 7

変更を失うことに関しては、特にほとんど同じに見えるいくつかの大きなブロックがある場合、マージの衝突を処理するのに少し練習が必要です。 私はいつも、コミットによってもたらされた実際の差分を見ること、そしてその変更点を見つけ出し、適切な方法ですでにブランチにあるものとマージすることに頼っています。 あなたの変更がそこに紛れ込んでしまったことは容易に想像がつきます。

覚えておくべきことがひとつあります。 ソースが十分に分岐していないと感じるため、多くのマージ競合を期待していない場合、競合を見ることは何か間違ったことをしているという警告フラグです。 バックアップを取るのは良いことです。 git rebase --abort を行い、ブランチを調査し、衝突が予想される場合は再度チェックするのが良いでしょう。 コンフリクトが発生した場所を必ず記録しておいてください (通常、rebase がコマンドラインにキックする直前に "Applying ..." があります)。 これは通常、開始するのに最適な場所です。

時には、コンフリクトは避けられないものであり、それを解決するのは面倒です。 しかし、練習を重ねれば、この問題に遭遇することは少なくなると思います。

ブランチ間の変更の移植に関するより詳しい情報は git rebase のマニュアルページをご覧ください。 rebase --onto" で検索してください。 最初のヒットで、変更を別のブランチに移植する方法について説明しているセクションにたどり着けるはずです。