[解決済み] あるブランチからすべてのコミットを引き出し、指定したコミットを別のブランチにプッシュする
質問
以下のようなブランチがあります。
-
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 つのスクリプトについて、私はよく理解していません。おそらく、物事が混乱しないように別の質問として、それをより詳細に説明することができますか?
関連
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] Git でブランチからコミットを削除する
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] Git フェッチ リモートブランチ
-
[解決済み] 2つのリビジョン間でどのファイルが変更されたかを表示する
-
[解決済み] リモートにないトラッキングブランチを削除
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み】別のブランチから1つのファイルだけを取得する方法は?
-
[解決済み】ブランチを指定せずにgit pushした場合のデフォルトの動作
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
gpg: "xxx" をスキップ: 秘密鍵のための1つの解決策が利用できない
-
Git がエラーを報告しました。現在のブランチの先端が遅れているため、更新が拒否されました。
-
[解決済み] Git で特定のコミットをマージする方法
-
[解決済み] ローカルの git コミットの一部だけをプッシュするにはどうしたらいいですか?
-
[解決済み] GitHubで2つのブランチの差分を取るには?
-
[解決済み] 対話式リベースを中断する方法(--abort が効かない場合)?
-
[解決済み] プル前にローカルとGitHubのリポジトリの差分を確認する方法 [重複]について
-
[解決済み] git add --patch' で新しいファイルをインクルードする?
-
[解決済み] Git Repo から既存のファイルを削除する
-
[解決済み] どのブランチとマージしたいかを言わずにpullするように言われました。