背景情報:
既存のシステムではワークフローの制限があるため、やや非正統的なgitプロセスを設定する必要があります。
(patch) A-B---F
| |
(hotfix) C-D-E
|
(dev) 1-2-3-G
パッチブランチには、いくつかのコミットがあります。ここのファイルは似ていますが、devのファイルとは同じではありません(同期スクリプトは、多くのファイルの設定の順序を入れ替え、機能的には同じであるように見えます)。
このブランチでは修正プログラムが必要であるため、ホットフィックスブランチが作成され、作業が行われます。その後、このブランチはパッチにマージされ、これまでのところ非常に良好です。
これと同じ修正をdevブランチに展開する必要があるため、パッチと比較的同期が保たれますが、ホットフィックスブランチをマージしようとすると、gitはAおよびBからの関連のない「変更されていない」ファイルもマージしようとしますC、D、Eのみ.
質問:
チェリーピックは、選択したコミットからの変更のみを取得するという点で私たちが望むことをするようですが、毎回コミットIDを検索することなく、特定のブランチのすべてのコミットを一度にチェリーピックする方法が本当に欲しいです。
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
あなたのブランチ(ターゲットブランチ)をチェックアウトして
git cherry-pick -m 1 hashCode
ブランチdevからすべてのコミットをチェリーピックしたい場合。
試してください:
git cherry-pick ..dev
早送りのもう1つの方法です。
ケース:
newBranchを開始し、最初のコミットをコミットしてリセットしましたHard。
その結果、空newBranchになりました。遅延コミットとgitツリーはHEADでクリーンではありません。あなたはブランチにいますnewBranch(gitブランチで確認できます)。
以下に2つのステップのアクションを示します。
git fsck --lost-found
git cherry-pick --ff 43a7a2d
これも機能するはずです。 HEAD(この場合はマスター)とブランチの間の分岐点を呼び出して、チェリーピックに渡します。
git merge-base Origin/dev_single_doc_fit HEAD | xargs git cherry-pick {}..HEAD^