web-dev-qa-db-ja.com

特定のブランチに導入されたすべての変更をチェリーチェリーで選ぶ方法

背景情報:

既存のシステムではワークフローの制限があるため、やや非正統的なgitプロセスを設定する必要があります。

(patch)    A-B---F
             |   |
(hotfix)     C-D-E
                 |
(dev)      1-2-3-G

パッチブランチには、いくつかのコミットがあります。ここのファイルは似ていますが、devのファイルとは同じではありません(同期スクリプトは、多くのファイルの設定の順序を入れ替え、機能的には同じであるように見えます)。

このブランチでは修正プログラムが必要であるため、ホットフィックスブランチが作成され、作業が行われます。その後、このブランチはパッチにマージされ、これまでのところ非常に良好です。

これと同じ修正をdevブランチに展開する必要があるため、パッチと比較的同期が保たれますが、ホットフィックスブランチをマージしようとすると、gitはAおよびBからの関連のない「変更されていない」ファイルもマージしようとしますC、D、Eのみ.

質問:

チェリーピックは、選択したコミットからの変更のみを取得するという点で私たちが望むことをするようですが、毎回コミットIDを検索することなく、特定のブランチのすべてのコミットを一度にチェリーピックする方法が本当に欲しいです。

21
Valyrion

cherry-pickは選択したコミットからの変更のみを取得するという点で私たちが望むことをしているようですが、特定のブランチのすべてのコミットをコミットIDを検索せずに一度に選択する方法が本当に欲しいです毎回。


cherry-pickを使用

git cherry-pickを使用すると、他のブランチへのブランチで行ったコミットを選択できます。あなたの場合、マスターブランチをチェックアウトしてから、希望するブランチからのcherry-pickすべてのコミットをチェックアウトすることができます(cherry-pickは範囲をサポートするため、すべてのコミットをリストする代わりにコミットの開始と終了を指定できます)。

これにより、目的のブランチでコミットが表示される方法を制御できます。

例えば:

git cherry-pick ebe6942..905e279

# Find the range of commits you wish to re-add to your branch.
# then use cherry-pick to add them back to the branch
git cherry-pick start..end

# If you wish to include the start commit as well add the ^
# This will result in a cherry-pick of the start commit included as well 
git cherry-pick start^..end

ブランチの最初のコミットを見つける方法は?

git log

 # print out the latest commit (first one) of the given branch
 git log  --oneline | tail -1

merge-base

merge-baseコマンドを使用して、元のブランチからブランチが分割された場所を見つけます。

git merge-base A B
35
CodeWizard

あなたのブランチ(ターゲットブランチ)をチェックアウトして

git cherry-pick -m 1 hashCode

1
Alwin

ブランチdevからすべてのコミットをチェリーピックしたい場合。

試してください:

git cherry-pick ..dev

1
Linji

早送りのもう1つの方法です。

ケース:

newBranchを開始し、最初のコミットをコミットしてリセットしましたHard

その結果、空newBranchになりました。遅延コミットとgitツリーはHEADでクリーンではありません。あなたはブランチにいますnewBranch(gitブランチで確認できます)。

以下に2つのステップのアクションを示します。

  • 「ゴミ箱」にあるコミットのリストを取得する

git fsck --lost-found

  • 逃したコミットをブランチにコミットします:

git cherry-pick --ff 43a7a2d

0
AlexNikonov

これも機能するはずです。 HEAD(この場合はマスター)とブランチの間の分岐点を呼び出して、チェリーピックに渡します。

git merge-base Origin/dev_single_doc_fit HEAD | xargs git cherry-pick {}..HEAD^
0