2009-09-10 7 views
74

は、このシナリオを取る:GITを使って、別のフォークの変更をどのように選択的にプル/マージできますか?

  1. 私は「フォーク」にgithub.comのコードベースを決定し、そして私の日常をやって起動:編集 - コミット - プッシュ。別名ハックハックハック
  2. 私はいくつかの変更を加えた後、別の人が同じプロジェクトで行ったいくつかの変更を見て、私はそれらが好きです!
  3. 私はそれらを私のものにマージしたいと思う。問題は、彼が作ったいくつかのコミットのうち、ある特定のコミットの「部分」だけです。変更のこれらの選択量を得るための最も効率的な方法だろう何

、私の「フォーク」にマージ?

答えて

112

IRCの世界の波をトローリングした後、誰かが優れたソリューション与えた:

git cherry-pick SHA1 --no-commit 
git add --patch 

うまくいけば、同じ質問を他の誰に役立ちます!

編集:OK、それほど単純ではないかもしれません。ここでは、完全な手順は次のとおりです。

  1. まずあなたは、あなたのリポジトリにする必要があなたの作業ディレクトリを取得する-ing必要cdを行います。

  2. これで、リモートブランチを追加し、それをフェッチする必要があります。することでこれを行います。

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. あなたは今、あなたは「部分的」にマージしたいコミットSHA1を見つけるために、このようなgit log someUser/masterなどのコマンドを実行することができます。あなたはSHAを持っていたら

  4. は、あなたが実行できるようになりました:

    SHA1は当たり前、SHAをコミットしている

    git cherry-pick -n SHA1

  5. コミットの経過時間とプロジェクトの特定の領域が変更される頻度によって、競合が発生する可能性があります。申し訳ありませんが、信頼できるエディタで手動で解決する必要があります。だから、VIMやその他のものを取り出して、あなたが変更が好きな段階に入るまで、競合を解き放つようにしてください。

  6. あなたは今、あなたは、あなたが望むものに変更選ぶと選択する信頼できるGIT add --patchコマンドを使用することができ、HEADリビジョンにインデックスをリセットする必要があります。

    git reset HEAD

    git add --patchまたはgit add -p

  7. Yay!時間をコミット:

    git commit -m "I merged a select amount of changes"

  8. 混乱(あなたがgit add --patch中にノーと言ったもの)をクリーンアップのみ実行し、作業リポジトリで選択した変更を維持するには:

    git reset --hard HEAD

    明らかにgit checkout -fも別のオプションです。

+0

'git add -p'が見つかりました。それは非常に強力です。あなたがすでにコミットしている場合(チェリーピックで '--no-commit'を使用しなかった場合や、コミットの1つである場合など)、' git reset HEAD^'を使用してコミットのインデックスを巻き戻すことができます変更を 'git add -p'で追加して、ステップごとにコミットします。コミットがブランチの先端にない場合は、 'git rebase -i'を使って問題のコミットを編集することができます。 – Cascabel

+0

これは本当にありがとう! –

+1

いいウォッシュスルー。 ** git cherry-pick SHA1' – Hulvej

1

コミットのポートだけが必要な場合は、必要なコミットをチェリーピックアップし、手を触れたくないファイルをリセットするのが最も良いでしょう。もちろん

git cherry-pick SHA1 
git checkout HEAD file1 file2 ... fileN 

、あなたはファイル内のいくつかの修正部分を持っているだけでそれらのいくつかは、あなたが選択の余地があるが、その変化を切り出し、手動でファイルを編集しておきたい場合。

+2

ここでチェックアウトが必要ですか?チェリーピックコマンドは変更を作業ディレクトリに入れませんか? –

2

私はあなたが何を望むのかはっきりしていません。他のフォークから特定のコミットだけをインポートする場合は、git cherry-pick SHAを使用できます。 gitreadyに関する詳しい説明。

+0

私は特定のコミットの「部分」/「セクション」/「数行」の後で、私のリポジトリにマージされます。特にファイル固有のものではありません。 – Tim

+0

その場合、git format-patch SHA、git apply はオプションです – hgmnz

2

私はTimのソリューションが本当に好きですが、時々私はvimdiffで微妙に変わってしまいます。この問題に対する私の解決策は粗末ですが、私はvimが好きなので私のために働きます。

私はブランチのdiffはvimdiff私difftoolとして設定している、その後、選択的にマージする:

git difftool <branch> <file> 

は、その後、私は現在のブランチのバージョンとのペインに移動し、時には(vimの中で、このISNを元に編集を「tは必要な、時にははvimdiff/tmpにバージョンを開きます)と、読み取り専用モードを無効にします。

:e <file> 
:set readonly! 

今、私は私が欲しいものを適用するために、このようなdodpとしてVimのパッチツールを使用し、他の少しを行うことができます私が行くように編集。私が完了したら、ファイルを保存し、vimから抜け出し、通常の編集のようにgitでファイルをステージングしてコミットします。

私が言ったように、これはあまり洗練されていませんが、非常に強力で、まだ完全にコマンドラインにあります。 gitは自動的にマージメッセージを表示しないので、明確なコミットメッセージを必ず追加してください。

vimdiff example http://j.mp/1dZVllt

+0

私は、この回答が独立した本格的な答えとなるにふさわしいとは思えません。有用な情報ですが、特に重要ではありません。 (なぜこれが答えの先頭にあるの?) –

関連する問題