web-dev-qa-db-ja.com

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

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

  • master
  • production

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

  • Origin/master
  • Origin/production

Origin/masterブランチをフェッチし、前回のフェッチ(log -p master..Origin/master)から変更されたものの差分を取得するスクリプトがあります。次に、Origin/masterをマージします。

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

成功したコミットをプッシュし、それらだけを本番ブランチにプッシュし、そしてもちろんOrigin/productionにプッシュします。

どうすればできますか?

また、2つのスクリプトを実行しています。Origin/masterからフェッチするスクリプト、データベースに詳細をプッシュしてコミットするスクリプト、および現在コミットしているコミットをプッシュするスクリプトです。

競合状態/マージの競合を回避しながら、これら2つのスクリプトを実行したいと思います。私は指定されたコミットでのみ作業したいので、たぶん不要なコミットを取り除く方法がありますか?

92
Sylvain

あなたが探していると思う用語は「チェリーピック」です。つまり、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番目の質問を理解できません。おそらく、物事を混乱させないための別の質問として、もっと詳しく説明できますか?

289
bdonlan

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

したがって、新しい回答:機能ブランチとプルリクエストを使用します。

これは次のようになります。fAは機能Aのコミットで、fBは機能Bのコミットです。

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

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

1
MattJenko