249

私には2つのgitブランチbranch1とbranch2があり、branch2のfile.pyをbranch1のfile.pyにマージし、そのファイルのみをマージしたいと考えています。

本質的には、branch1 の file.py で作業したいだけですが、merge コマンドを利用したいと考えています。これを行う最善の方法は何ですか?

4

12 に答える 12

144

それ自体はマージではありませんが、別のブランチにある別のファイルの内容全体が必要になることがあります。Jason Rudolph のブログ投稿は、あるブランチから別のブランチにファイルをコピーする簡単な方法を提供しています。次のようにテクニックを適用します。

$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py

file.pybranch1にあります。

于 2013-08-07T23:46:44.927 に答える
18

へのすべての変更はfile.pybranch2他のファイルへの変更とは別に、独自のコミットに含まれていますか? その場合は、次のように簡単cherry-pickに変更できます。

git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>

それ以外の場合、merge個々のパスでは動作しません...からおよびへの変更のgit diffパッチを作成することもできます:file.pybranch2git applybranch1

git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch
于 2013-08-07T23:39:00.660 に答える
4

最も簡単な解決策は次のとおりです。

git checkout ソース ブランチの名前と、現在のブランチに追加する特定のファイルへのパス

git checkout sourceBranchName pathToFile
于 2020-10-23T09:46:40.627 に答える
2

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"
于 2013-08-08T02:03:21.467 に答える