質問の更新を確認した後、使用状況に応じて、以下の 2 つのオプションのいずれかが機能する場合があります。
最初の (そしてより単純な) ケースは、未公開の作業が常に単一の一連のコミットであり、公開された作業が同じブランチにありますが、少し遅れている場合です:
- あなたには
unpublished
枝とpublished
枝があります。後者は前者に含まれています (つまり、いくつかのコミットが遅れています)。
- 保存アクションは、
abcdef
からのハッシュunpublished
が の HEAD になることを意味しpublished
ます。
- 実行し
git checkout published && git merge --ff-only abcdef
ます。
- これにより
published
、そのコミットに早送りされます。
2 つ目は、公開できるコミットが必ずしも線形シーケンスではない場合です。コミットの順序を変更すると、発生する競合を解決する必要がある場合があるため、これはもう少し複雑になります。私は次の方法でそれを解決します:
unpublished
およびpublished
分岐があると再び仮定します。
- 保存アクションは、 からのいくつかのハッシュで構成されます
unpublished
。
publish-2013-04-15-001
現在のブランチからのように、新しい一時的なブランチを作成する必要がありますpublished
(新しいブランチの名前は、一意/新しい限り、ほとんど関係ありません)。
git cherry-pick <hash>
保存する必要があるハッシュごとに実行します。(複数のコミットがある場合、ここで競合が発生する可能性があり、何らかの方法で解決する必要がある場合があります。)
- 完了したら、
published
ブランチをチェックアウトします。
- 実行し
git merge --squash -m 'Publish version <n>' publish-2013-04-15-001
ます。
- (オプション) 一時ブランチを削除します。
2 番目のオプションはより複雑になるため、公開されたプロセスのデバッグを容易にするために考慮すべき他のオプションがあります。
- 追跡/ロギングのために一時的なブランチを保持する必要がありますか?
- マージされたブランチで個々のコミットを別々に保持できますか (除外
--squash
)?
- その場合は、マージ コミットを強制することで、保存を特定できます (
--no-ff
)。
EDIT : を使用した例を次に示し--no-ff
ます。各バージョン$N
は次のことを行います。
git checkout -b publish-$N published
# cherry-pick commits
git checkout published && git merge --no-ff publish-$N -m "Publish version $N"
