web-dev-qa-db-ja.com

Gitで特定のコミットをマージする方法

私は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
896
netawater

' git cherry-pick 'があなたの答えです。

既存のコミットによって導入された変更を適用します。

この記事でチェリーピッキングの結果についての bdonlan の答えを忘れずに読んでください。
[ - ____。] "すべてのコミットをブランチから引き、特定のコミットを別のコミットにプッシュする" 、ここで:

A-----B------C
 \
  \
   D

になります:

A-----B------C
 \
  \
   D-----C'

このコミットの問題は、gitがコミットの前にすべての履歴を含めることをコミットに考慮していることです。

C 'が別のSHA-1 IDを持つ場合。
同様に、あるブランチから別のブランチへのコミットをチェリーで選ぶことは基本的にパッチを生成し、それからそれを適用することを含み、それによって同様に歴史を失います。

このコミットIDの変更は、gitのマージ機能を破壊します(控えめに使用されている場合、これを解決するためのヒューリスティックがあります)。
しかしもっと重要なことに、 それは機能的な依存関係を無視します - Cが実際にBで定義された関数を使ったならば、あなたは決して知ることがないでしょう

1066
VonC

Git cherry-pickを使って、現在のブランチに単独でコミットを適用することができます。

例:git cherry-pick d42c389f

630
bdonlan

例を挙げて理解しましょう。

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>
24
Upen