web-dev-qa-db-ja.com

ファイル/ディレクトリを移動しても、変更を簡単にマージしますか?

gitは名前の変更/移動を明示的に追跡せず、同一の(または状況によっては類似した?)ファイルを探すことを好むというさまざまなFAQを読みました。それは素晴らしいことですが、この状況に対処できます。友人のリモートリポジトリには、debian/po/*.poにいくつかの新しいファイルを含む新機能(i18n)があります。私はこのプロジェクトの独自のフォークを持っており、この機能をマージしたいのですが、ファイルをpo/*.poだけに配置します(2つのコミット、または必要なものとしてそれを行うことができます)。リモートリポジトリは引き続き機能の更新を受信することを期待しています。これらのコミットをマージ/チェリーピックして、新しい場所のファイルに適用したいと思います。 gitは、おそらく「これらのファイルはここに移動しました」という何らかのマッピングを使用して、それを行うことができますか?それとも、それは価値があるよりも苦痛であり、リポジトリで少し奇妙なdebianパスを受け入れる必要がありますか?

20
Chris Boyle

使用する git mvそしてすべてがAOKになります。

尋ねる代わりに試してみませんか? gitではいつでも簡単にリセットできます。 :)

45
Pod

Gitには、2つのプロジェクト/ブランチ間で差分を行うときにpathの名前変更と更新があることを期待することを示すメカニズムがありません。

さまざまなfile名前変更オプション(-Mや--patienceなど)が利用可能ですが、時間がかかる場合があります。

すでに述べたように、パスの名前変更は、コンテンツ(blob)と構造(ツリーノード)のスナップショットであるため、リポジトリ自体には影響しません。行ったすべてが追加のトップレベルディレクトリに追加された場合、以下のすべてのツリーとBLOBは変更されず、追加のストレージは必要ありません。必要なのは、コミット用の1つのツリーノードと新しいTLD用の1つのツリーノードだけです。簡単に死ぬ。 Gitはその部分を問題なく処理します。

重要なのは、比較(およびパッチ)を実行したい場合のみです。パスの名前変更を期待していることを示す-Pオプションを指定して、diffが簡単に対処できるようにすると便利です。 200個のファイルが削除されて200個の新しいファイルが表示されるのは良くありません;-)

-Pオプションを追加する方法を見つけることは、私の「やること」リスト項目のもう1つです(少し時間があればいいのですが)。

3
Philip Oakley

または、mvを使用してファイルの名前を変更し、git add --allを呼び出して、すべての削除操作をステージングし、追跡されていないファイル(新しいファイル名)を追加します。 --allがない場合は、削除操作と新しいファイル名を別々に明示的にステージングする必要があります。 git add --updateも使用しないでください。これにより、すべての削除操作がステージングされますが、新しいファイル名は追加されません。

これらの操作をローカルブランチで実行して、誤って友人のマスターブランチにPushしたり、友人がマスターにpullしたりしないようにする必要があることに注意してください。ブランチ。

2
Derek Mahar