Gitで特定のコミットをあるブランチから別のブランチにマージするにはどうすればよいですか?


回答:


233

このgit cherry-pick <commit>コマンドを使用すると、(任意のブランチから)1つのコミットを取得し、基本的には作業中のブランチでそれをリベースできます。

Pro Gitブックの第5章では、図などを使用して私ができるよりもよく説明しています。(リベースの章も良い読み物です。)

最後に、別のSOの質問で、チェリーピッキングとマージとリベースについていくつかの良いコメントがあります。


1
質問:コミットAが分岐していて、masterそれにいくつかの作業を行って、をB介して子コミットを作成するとしEます。たとえばE、から1行だけ追加されたとしましょうD。あなたの場合git cherry-pick Emaster、それが適用されないすべての変更をA通じEmaster支店、またはそれがないだけに変更を適用DするE、すなわち、それはにのみその1行を追加しますかmaster?前者の場合、どうすれば後者を達成できますか?(手動でのコピーと貼り付けは別として)
chharvey 2014年

7
git cherry-pick -n <commit>チェリーが不要な場合は、自動コミットを選択します。
ベン・フリン

6

BranchAがリモートにプッシュされていない場合はrebase、次にを使用してコミットを並べ替えることができますmerge。それは使用することが好ましいですmerge以上rebase、それは重複コミットを作成していないため、可能な場合。

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]

2

出典:https : //git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

導入された作業をあるブランチから別のブランチに移動するもう1つの方法は、それをチェリーピックすることです。Gitのチェリーピックは、単一のコミットのリベースのようなものです。コミットで導入されたパッチを取得し、現在のブランチに再適用しようとします。これは、トピックブランチに多数のコミットがあり、そのうちの1つだけを統合したい場合、またはトピックブランチに1つだけのコミットがあり、リベースを実行するのではなくチェリーピックしたい場合に便利です。たとえば、次のようなプロジェクトがあるとします。

ここに画像の説明を入力してください

commit e43a6をmasterブランチにプルしたい場合は、

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

これはe43a6で導入された同じ変更を引き出しますが、適用される日付が異なるため、新しいコミットSHA-1値を取得します。これで、履歴は次のようになります。

ここに画像の説明を入力してください

これで、トピックブランチを削除して、プルインしたくないコミットを削除できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.