[解決済み] git merge: 別のファイルに移動したコードに変更を適用する
質問
私は今、かなり手間のかかる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
.
ローカルでの変更をすべて適用したい場合、コミット
A
と
B
で作成されたもので、以下のとおりです。
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
.
これが明確であることを望みます。 この回答は遅くなりましたが、これは他の誰かにとって役に立つかもしれません。
関連
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] Git フェッチ リモートブランチ
-
[解決済み] Git にファイルモード (chmod) の変更を無視させるには?
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git, fatal: リモートエンドが予期せずハングアップしました。
-
[解決済み】fatal: 有効なオブジェクト名ではない: 'master'
-
[解決済み】gitが「変更をコミットするか、マージする前にstashしてください」と言うのを解決するには?
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
[解決済み] [email protected] へのいくつかの参考文献のプッシュに失敗しました。
-
[解決済み】ローカルGitブランチとそのリモートブランチを比較する方法
-
[解決済み】gitの「not something we can merge」エラーの解決方法
-
[解決済み】マージが終了していません(MERGE_HEADは存在します)。
-
[解決済み] Git - node_modules フォルダをどこでも無視するようにしました。
-
[解決済み] git: あるレポのコミットによる変更を別のレポに適用する