13

何百もの php ファイルを含む MASTER ブランチにプロジェクトがあるとします。プロジェクトのバグ修正を行うために、別のブランチを作成します

git checkout -b bugfix

次に、3 つのファイル (index.php、register.php、login.php など) のバグを修正した後、マスター ブランチにマージします。

git checkout master
git merge bugfix

上記のコードは、変更を加えた 3 つのファイルすべてをマージしますが、GIT に login.php と register.php などの 2 つのファイルのみを強制的にマージさせることはできますか?

4

4 に答える 4

15

次の 2 つの方法があります。


アプローチ01

次のソリューションは、ブログ投稿から採用されています

チェックアウトもこの問題に役立つことが判明しました。これらの特定のファイルを別のブランチから呼び出す (チェックアウトする) ことができます。

# switch to the branch you want to be your merge destination
git checkout master

# checkout specific files from specific branch (e.g bugfix)
# format: git checkout <source branch> <file.1> <file.2> ... <file.N>
git checkout bugfix login.php register.php

# check the status
git status

# merge them in
git commit -m "your merge comment"

アプローチ02

これは簡単な代替アプローチですが、ファイルごとに 1 つのコミットがある場合にのみ機能します (ファイルを変更するたびに、1 つのコミットを行ってから次のファイルに移動したことを意味します)。この場合、これらの特定のコミットを他のブランチ (この場合はマスター ブランチ) に簡単に持ち込むことができます。

# get which commit you want to take to the other branch (first 7 characters will do)
git log

# switch to the branch you want to be your merge destination
git checkout master

# bring specific commit to this branch (replace the 63344f2 with your own 7 character commit ID)
git cherry-pick 63344f2
于 2015-08-24T00:27:50.973 に答える
1

Git で部分的なマージを記録する方法はありません。すべてのマージは、マージされるすべてのコミットのルート ツリー全体をマージする必要があります。

もちろん、親の 1 つからファイルの 1 つの変更されていないコピーを選択することで、そのマージを解決することを選択できますが、これは依然として「完全な」マージであり、そのファイルの変更はマージされたものと見なされます。関連するブランチ間のその後のリベースまたはマージ。

于 2013-06-07T08:20:53.307 に答える
0

いいえ、直接的な方法はありません。けれど; マージするブランチからファイルを選択し、マスター ブランチの既存のファイルに上書きできます。コマンドの順序は次のとおりです。

git checkout master
git show bugfix:login.php > login.php
git show bugfix:register.php > register.php
git add .
git commit -m "Select login and register from branch/bugfix"

わかりました、上記の方法はファイル履歴を「破棄」します。このメーリングリストには、同じことについての古い議論があります。

技術的な観点から言えば、履歴が問題になるのは (そして「日付順のコミットのセット」が役に立たない理由)、共通の祖先が得られるからです! そして、それが重要な唯一のことです。

では、ファイルごとの履歴を作成することの根本的な問題は何でしょうか?

さて、もしあなたがこの議論に従ったのなら、あなたは「ああ、当たり前だ!」と思うはずです。

たくさんの段落を無視します。あなたは回避策を見つけるでしょう:

git diff commit..othercommit filename | git-apply --index && git commit

あなたの場合、commit= あなたの HEAD/master ブランチのハッシュ。and othercommit= バグ修正ブランチのハッシュ。

于 2013-06-07T08:29:20.000 に答える