ブランチからすべてのコミットをプルし、指定されたコミットを別のコミットにプッシュします


102

次のブランチがあります。

  • master
  • production

および次のリモートブランチ:

  • origin/master
  • origin/production

origin/masterブランチをフェッチし、最後のフェッチ(log -p master..origin/master)からの変更点の差分を取得するスクリプトがあります。その後、私はマージしorigin/masterます。

見つかったコミットはコードレビューツールにプッシュされます。

成功したコミット(そしてそれらのみ)を本番ブランチにプッシュし、次にもちろんにプッシュしたいと思いorigin/productionます。

どうすればできますか?

また、2つのスクリプトを実行しています。1つはからフェッチしorigin/master、コミットの詳細をデータベースにプッシュし、マージします。もう1つは現在書いているスクリプトで、成功したコミットをプッシュする必要があります。

競合状態/マージの競合を回避しながら、これら2つのスクリプトを実行したいのですが。特定のコミットのみを操作したいので、不要なコミットを削除する方法があるのでしょうか?


「成功したコミット」とはどういう意味ですか?
bdonlan 2009年

確認され、成功とマークされたもの。ここでは特に問題ではありませんが、重要なのは、保持して別のブランチにプッシュしたいコミットと、無視/無視したいコミットがあることです。
シルヴァン、

回答:


312

あなたが探していると思う用語は「チェリーピック」です。つまり、1つのブランチの中央から1つのコミットを取り、それを別のブランチに追加します。

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

なる

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

もちろん、これはgit cherry-pickコマンドで実行できます。

このコミットの問題は、gitがコミットの前にすべての履歴を含めると見なすことです。つまり、次のような3つのコミットがある場合、

A-----B-----C

そしてBを取り除こうとすると、次のようにまったく新しいコミットを作成する必要があります。

A-----------C'

C 'には別のSHA-1 IDがあります。同様に、あるブランチから別のブランチへのコミットを選択するチェリーでは、基本的にパッチを生成してから適用するため、同様に履歴が失われます。

このコミットIDの変更により、gitのマージ機能が停止します(ただし、控えめに使用すると、これについて説明するヒューリスティックが存在します)。さらに重要なのは、関数の依存関係を無視することです。Cが実際にBで定義された関数を使用したとしても、それは決してわかりません。

おそらく、これを処理するより良い方法は、より細かい粒度のブランチを持つことです。つまり、単に「マスター」、「featureA」、「bugfixB」などを持つのではなく、一度にブランチ全体に対してコードレビューを実行します。各ブランチは1つのことだけに集中しており、それをマージします。完了したら1つのブランチ。これはgitが設計されたワークフローであり、それが得意なものです:)

パッチのレベルで物事を扱うことを主張する場合は、darcsを確認することをお勧めします。リポジトリはパッチのセットと見なされるため、チェリーピッキングが基本的な操作になります。ただし、これには非常に遅いなどの独自の問題があります:)

編集:また、2つのスクリプトについての2番目の質問を理解しているかどうかはわかりません。多分あなたはそれをより詳細に、おそらく混乱を避けるために別の質問として説明できますか?


2番目の質問については、変更をフェッチするプロセス(最初のスクリプト)と特定のコミットを別の場所にプッシュするプロセス(2番目のスクリプト)が、異なるブランチで作業しているときに競合状態やマージの競合なしに機能することを確認したいだけです。しかし、結局私は2つのスクリプトを1つにマージして、2つのスクリプトが同時に機能しないようにすることができるので、大した問題ではないと思います:)
Sylvain

9
「このコミットIDの変更は、とりわけgitのマージ機能を壊します」 @bdonlanマージ機能がどのようにブレーキをかけられるかを説明してください。どういう意味ですか?
Narek、2013

5
@Narek彼はおそらく、2番目のブランチをマージするときに、コミットC 'の変更がコミットCの同じ変更と衝突することを意味します。それは歴史が背後C.コミット失うことの結果だ
bytefu

1
「そしてBを取り除こう」-なぜBを取り除こうとしているのですか?
d512 2015

3
@ user1334007、彼はそれが以前はABCだった前を意味します。さて、チェリーピックのCにより、ブランチはAD-Cになり、Bは含まれなくなりました。
AnneTheAgile 2015

1

これは古い質問ですが、ここで参照されています:Gitで特定のコミットをマージする方法

したがって、新しい答えは、機能ブランチとプルリクエストを使用することです。

これはどのように見えるか、fAは機能Aのコミット、fBは機能Bのコミットです。

            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

プルリクエストはGitHubの機能に関連付けられていますが、実際には、誰かが機能ブランチをマスターにマージする責任があるということです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.