82

次のシナリオを考えてみましょう。

  1. 私は github.com でコードベースを「フォーク」することに決め、次のルーチンを実行し始めます。編集 - コミット - プッシュ。別名ハックハック。
  2. 私がいくつかの変更を加えた後、別の人が同じプロジェクトに加えたいくつかの変更を見て、私はそれらが気に入りました!
  3. 私はそれらを私のものにマージしたいと決めました。問題は、彼が行ったいくつかのコミットのうち、特定のコミットの「部分」だけが欲しいということです。

これらの選択した量の変更を「フォーク」にマージする最も効率的な方法は何でしょうか?

4

4 に答える 4

119

IRCの世界の波を荒らした後、誰かが素晴らしい解決策を与えました。

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

うまくいけば、それは同じ質問を持つ他の人を助けるでしょう!

編集:わかりました、多分それはそれほど単純ではありません。完全な手順は次のとおりです。

  1. まず、リポジトリにいる必要があります。必要なcd-ingを実行して、作業ディレクトリにアクセスします。

  2. ここで、リモートブランチを追加してから、それをフェッチする必要があります。これを行うには:

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

    git fetch someUser

  3. git log someUser/masterこれで、「部分的に」マージするコミットSHA1を見つけるなどのコマンドを実行できます。

  4. SHAを入手したら、次を実行できます。

    git cherry-pick -n SHA1

    SHA1コミットSHAはどこにありますか?

  5. コミットの古さや、プロジェクトの特定の領域が変更される頻度によっては、競合が発生する可能性があります。申し訳ありませんが、信頼できるエディタを使用してこれらを手動で解決する必要があります。したがって、VIMやその他の使用するものをすべて引き出し、変更が気に入った段階に到達するまで競合をハックします。

  6. ここで、インデックスをHEADリビジョンにリセットする必要があります。次に、trusty GITadd --patchコマンドを使用して、必要な変更を選択できます。

    git reset HEAD

    git add --patchまたgit add -p

  7. わーい!コミット時間:

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

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

    git reset --hard HEAD

    どうやらgit checkout -f別のオプションもあります。

于 2009-09-10T13:05:46.133 に答える
3

私はティムのソリューションが本当に好きですが、時々vimdiffをいじるのが好きです。この問題に対する私の解決策は大雑把ですが、私は vim が好きなのでうまくいきます。

vimdiff を difftool として設定し、選択的にマージするためにブランチを比較します。

git difftool <branch> <file>

次に、現在のブランチのバージョンのペインに移動し、vim でオリジナルを編集し (これが必要でない場合もありますが、vimdiff が /tmp でバージョンを開く場合もあります)、読み取り専用モードを無効にします。

:e <file>
:set readonly!

doこれで、やなどの vim のパッチ ツールを使用して、dp必要なものを適用し、その他の小さな編集を行うことができます。完了したら、ファイルを保存し、vim を終了してから、通常の編集と同じように git でファイルをステージングしてコミットします。

前述したように、これは特に洗練されたものではありませんが、非常に強力であり、純粋にコマンド ラインで実行できます。git は自動的にマージ メッセージを含めないため、明確なコミット メッセージを必ず追加してください。

vimdiff の例

于 2014-01-18T05:03:20.557 に答える
2

あなたが何を望んでいるのかはっきりしません。他のフォークから特定のコミットのみを取り込みたい場合は、git cherry-pick SHA. gitreadyに関する完全な説明。

于 2009-09-10T12:40:31.123 に答える
1

コミットのポートだけが必要な場合は、必要なコミットを選択して、変更したくないファイルをリセットするのがおそらく最善の方法です。

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

もちろん、ファイルにいくつかの変更部分があり、それらの一部のみを保持したい場合は、ファイルを手動で編集して変更を切り取るしかありません。

于 2009-09-10T12:38:25.357 に答える