私には2つのgitブランチbranch1とbranch2があり、branch2のfile.pyをbranch1のfile.pyにマージし、そのファイルのみをマージしたいと考えています。
本質的には、branch1 の file.py で作業したいだけですが、merge コマンドを利用したいと考えています。これを行う最善の方法は何ですか?
それ自体はマージではありませんが、別のブランチにある別のファイルの内容全体が必要になることがあります。Jason Rudolph のブログ投稿は、あるブランチから別のブランチにファイルをコピーする簡単な方法を提供しています。次のようにテクニックを適用します。
$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py
今file.py
はbranch1にあります。
へのすべての変更はfile.py
、branch2
他のファイルへの変更とは別に、独自のコミットに含まれていますか? その場合は、次のように簡単cherry-pick
に変更できます。
git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>
それ以外の場合、merge
個々のパスでは動作しません...からおよびへの変更のgit diff
パッチを作成することもできます:file.py
branch2
git apply
branch1
git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch
最も簡単な解決策は次のとおりです。
git checkout ソース ブランチの名前と、現在のブランチに追加する特定のファイルへのパス
git checkout sourceBranchName pathToFile
branch2 からの変更のみをマージfile.py
するには、他の変更を削除します。
git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip
Merge は他のファイルを見ることさえありません。ツリーが十分に異なる場合は、チェックアウトを「-f」する必要があるかもしれません。
これにより、branch1 はあたかもその時点までの branch2 の履歴のすべてがマージされたかのように見えることに注意してください。これは、希望どおりではない可能性があります。上記の最初のチェックアウトのより良いバージョンは、おそらく
git checkout -B wip `git merge-base branch1 branch2`
その場合、コミットメッセージもおそらく
git commit -m"merging only $(git rev-parse branch2):file.py into branch1"