私はGitHubのリポジトリからブランチを分岐させ、私に特有の何かをコミットしました。今、私はオリジナルのリポジトリがHEAD
にある良い機能を持っていることがわかりました。
前回のコミットなしでマージしたいのですが。私は何をすべきか?全てのコミットをマージする方法を私は知っています:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git Push
' git cherry-pick
'があなたの答えです。
既存のコミットによって導入された変更を適用します。
この記事でチェリーピッキングの結果についての bdonlan の答えを忘れずに読んでください。
[ - ____。] "すべてのコミットをブランチから引き、特定のコミットを別のコミットにプッシュする" 、ここで:
A-----B------C
\
\
D
になります:
A-----B------C
\
\
D-----C'
このコミットの問題は、gitがコミットの前にすべての履歴を含めることをコミットに考慮していることです。
C 'が別の
SHA-1
IDを持つ場合。
同様に、あるブランチから別のブランチへのコミットをチェリーで選ぶことは基本的にパッチを生成し、それからそれを適用することを含み、それによって同様に歴史を失います。このコミットIDの変更は、gitのマージ機能を破壊します(控えめに使用されている場合、これを解決するためのヒューリスティックがあります)。
しかしもっと重要なことに、 それは機能的な依存関係を無視します - Cが実際にBで定義された関数を使ったならば、あなたは決して知ることがないでしょう 。
Git cherry-pickを使って、現在のブランチに単独でコミットを適用することができます。
例:git cherry-pick d42c389f
例を挙げて理解しましょう。
master のようにX <commit-id>を指すブランチがあり、Y <sha1>を指す新しいブランチがあります。
Y <commit-id> = <master>ブランチがコミット - わずかなコミット
それではYブランチについて、マスターブランチと新しいブランチの間のコミットをギャップクローズする必要があるとしましょう。以下は私たちが従うことができる手順です:
ステップ1:
git checkout -b local Origin/new
localはブランチ名です。任意の名前を付けることができます。
ステップ2:
git merge Origin/master --no-ff --stat -v --log=300
マスターブランチから新しいブランチへのコミットをマージし、マージされている実際のコミットのうち<n>個の実際のコミットからの1行の説明を含むログメッセージのマージコミットも作成します。
Gitマージの詳細とパラメータについては、以下を参照してください。
git merge --help
特定のコミットをマージする必要がある場合にも使えます。
git cherry-pick <commit-id>