1. ホーム
  2. git

[解決済み] あるブランチからすべてのコミットを引き出し、指定したコミットを別のブランチにプッシュする

2022-09-28 02:57:15

質問

以下のようなブランチがあります。

  • master
  • production

と、以下のリモートブランチがあります。

  • origin/master
  • origin/production

を取得するスクリプトがあります。 origin/master ブランチを取得し、前回のフェッチから何が変更されたかの diff を取得するスクリプトがあります ( log -p master..origin/master ). そして origin/master .

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

私は成功したコミットを - そして彼らだけを - 本番用ブランチにプッシュしたいのですが、もちろんそれは origin/production .

どうすればいいのでしょうか?

また、私は2つのスクリプトを実行しています。 origin/master から取得し、コミットの詳細をデータベースにプッシュし、マージするものと、成功したコミットをプッシュする現在書いているものです。

レースコンディションやマージ競合を避けながら、これら2つのスクリプトを実行させたいと考えています。 指定されたコミットだけを扱いたいので、もしかしたら不要なコミットを取り除く方法があるのでしょうか?

どのように解決するのですか?

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

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 で定義された関数を実際に使用した場合、あなたは決して知ることができません。

おそらく、これを扱うより良い方法は、より細かいブランチを持つことでしょう。つまり、単に「master」を持つのではなく、「featureA」、「bugfixB」などを持つようにします。ブランチ全体に対して一度にコードレビューを行い、各ブランチが一つのことだけに集中するようにし、終わったらそのブランチをマージする。これが git のワークフローであり、git が得意とするところです :)

パッチのレベルで物事を扱うことにこだわるのであれば、darcs を見てみるとよいかもしれません。しかし、これには非常に遅いなど、独自の問題点があります :)

編集: また、2 つ目の質問、2 つのスクリプトについて、私はよく理解していません。おそらく、物事が混乱しないように別の質問として、それをより詳細に説明することができますか?