このシナリオを見てください:
これらの選択された量の変更を取得し、「フォーク」にマージする最も効率的な方法は何ですか?
IRC世界の波をトローリングした後、誰かが素晴らしい解決策を与えました:
git cherry-pick SHA1 --no-commit
git add --patch
うまくいけば、それは同じ質問を持つ他の人を助ける!
編集:OK、多分それはそれほど単純ではありません。完全な手順は次のとおりです。
最初にリポジトリにいる必要があり、必要なcd
- ingを実行して作業ディレクトリに移動します。
ここで、リモートブランチを追加してからフェッチする必要があります。これを行う:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
git log someUser/master
などのコマンドを実行して、「部分的に」マージするコミットSHA1を見つけることができます。
SHAを取得したら、次を実行できます。
git cherry-pick -n SHA1
ここで、SHA1
はコミットSHAです。
コミットの年齢や、プロジェクトの特定の領域が変更される頻度に応じて、競合が発生する可能性が非常に高くなります。申し訳ありませんが、信頼できるエディターでこれらを手動で解決する必要があります。だから、VIM、またはあなたが使用する他のものを引き出し、あなたが変更が好きな段階に到達するまで競合をハックします。
インデックスをHEADリビジョンにリセットする必要があります。その後、信頼できるGIT add --patch
コマンドを使用して、必要な変更を選択できます。
git reset HEAD
git add --patch
またはgit add -p
わーい!コミット時間:
git commit -m "I merged a select amount of changes"
混乱(git add --patch
でノーと言ったもの)をクリーンアップし、選択した変更のみを作業リポジトリに保持するには、次を実行します。
git reset --hard HEAD
どうやらgit checkout -f
も別のオプションです。
私はティムのソリューションが本当に好きですが、時にはvimdiffをいじるのが好きです。この問題に対する私の解決策は粗雑ですが、私はvimが好きなので私にとってはうまくいきます。
Difftoolとしてvimdiffを設定し、選択的にマージするためにブランチをdiffします:
git difftool <branch> <file>
次に、現在のブランチのバージョンを使用してペインに移動し、vimでオリジナルを編集し(必要ではない場合がありますが、vimdiffが/ tmpでバージョンを開くことがあります)、読み取り専用モードを無効にします。
:e <file>
:set readonly!
これで、do
やdp
などのvimのパッチツールを使用して、必要なものを適用したり、他の小さな編集を行ったりすることができます。完了したら、ファイルを保存してvimを終了し、通常の編集のようにgitでファイルをステージングしてコミットします。
先ほど言ったように、これは特に洗練されたものではありませんが、非常に強力であり、純粋にコマンドラインにあります。 gitには自動的にマージメッセージが含まれないため、明確なコミットメッセージを必ず追加してください。
私はあなたが何を望むか明確ではありません。他のフォークから特定のコミットのみを取り込みたい場合は、git cherry-pick SHA
。 gitready の詳細な説明。
コミットのポートのみが必要な場合は、必要なコミットをチェリーピッキングし、不要なファイルをリセットすることをお勧めします。
git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN
もちろん、ファイル内に複数の変更されたパーツがあり、それらの一部のみを保持したい場合は、ファイルを手動で編集して変更をカットする以外に選択肢はありません。