1. ホーム
  2. git

[解決済み] git merge: 別のファイルに移動したコードに変更を適用する

2022-04-25 05:20:32

質問

私は今、かなり手間のかかるgitのマージ操作を試みているところです。 ひとつ問題があって、私は自分のブランチにあるコードに変更を加えましたが、同僚がそのコードを自分のブランチにある新しいファイルに移動しました。 そこで、私が git merge my_branch his_branch git は新しいファイルのコードが古いものと同じであることに気付かず、そのため私の変更は何も残っていません。

新しいファイルのコードに私の変更を再度適用するには、どのような方法が最も簡単なのでしょうか。 どのコミットを再適用する必要があるのかを見つけるのに、それほど問題はないでしょう (私は単に git log --stat ). しかし、私が知る限り、git に新しいファイルへの変更を再適用させる方法はありません。 私が今見ている最も簡単な方法は、変更を手動で再適用することですが、これは良いアイデアとは思えません。

git がファイルではなく blob を認識することは知っているので、きっと "このコミットからのこの正確なコード変更を、それがあった場所ではなく、現在この新しいファイルのどこにあるかを除いて適用する" と伝える方法があるに違いありません。

解決方法は?

私も同じような問題がありましたが、ターゲットのファイル構成に合わせて自分の作業をリベースすることで解決しました。これは、gitがファイルの追跡を行うためです。 内容 そのため、リネームの上にリベースを行うことで、必要な変更が適用されます。

より正確には、例えば、以下のように変更したとする。 original.txt を自分のブランチで使用します。 local ブランチ)ではなく、master ブランチ上で行われます。 original.txt が別のものにコピーされ、例えば copy.txt . このコピーは、commit と名付けたコミットで行われました。 CP .

ローカルでの変更をすべて適用したい場合、コミット AB で作成されたもので、以下のとおりです。 original.txt を、新しいファイル copy.txt .

 ---- X -----CP------ (master)
       \ 
        `--A---B--- (local)
 

スローアウェイブランチの作成 move を使用して、変更の開始点に git branch move X . つまり move ブランチをコミット X は、マージしたいコミットの前のコミットです。おそらく、これは変更を実行するためにブランチアウトしたコミットでしょう。ユーザーとして ディゴリー・ドゥー は、以下のように書くことができます。 git merge-base master local を見つけるために X .

 ---- X (move)-----CP----- (master)
       \ 
        `--A---B--- (local)
 

このブランチで、以下のリネームコマンドを実行します。

git mv original.txt copy.txt

これはファイル名を変更します。ただし copy.txt は、この時点ではまだツリーに存在していません。

変更をコミットします(このコミットには MV ).

        ,--MV (move)
       /
 ---- X -----CP----- (master)
       \ 
        `--A---B--- (local)
 

の上にリベースすることができるようになりました。 move :

git rebase move local

これは問題なく動作するはずで、変更内容は copy.txt をローカルブランチに追加します。

        ,--MV (move)---A'---B'--- (local)
       /
 ---- X -----CP----- (master)
 

ここで、必ずしもコミットする必要はありません。 MV のコピー操作と衝突する可能性があるからです。 CP をメインブランチで使用します。

以下のように、move操作を破棄して、再度リベースすればよいのです。

git rebase move local --onto CP

... ここで CP はコミットで copy.txt が他のブランチで導入されました。 のすべての変更をリベースします。 copy.txt の上に CP をコミットします。 さて、あなたの local ブランチは、あたかも常に copy.txt であって original.txt そして、他の人とマージを続けることができます。

                ,--A''---B''-- (local)
               /
 -----X-------CP----- (master)
 

において変更を適用することが重要です。 CP または copy.txt は存在せず、変更は original.txt .

これが明確であることを望みます。 この回答は遅くなりましたが、これは他の誰かにとって役に立つかもしれません。