4

私は、git を使用して時々コミットを行うノード モジュールを作成しました。コミットを 1 つのコミットにグループ化した方が良いと考えると、"git rebase -i" を使用してそれらを 1 つにまとめたいと思います。

ただし、スカッシュはインタラクティブ モードでのみ可能です。つまり、「git rebase -i」が呼び出されたときにポップアップするエディターで行を手動で編集する必要があります。このプロセスをプログラムで実行できるかどうかを知りたいですか? たとえば、ユーザーが「保存」関数を呼び出すと、モジュールは一連のコミットを作成し、それらを自動的にまとめます。

アップデート

私がやっていることをより正確に言うと、「保存」関数が呼び出されると、「公開」される一連のコミットが渡されます。私のモジュールは、それらのコミットを選択して「公開」ブランチに入れます。これは単一の「発行」アクションですが、「発行」ブランチで一連のコミットが生成されます。私がやりたいのは、発行時にコミットを押しつぶすことです。そのため、「git log」を実行すると、発行アクションごとに 5 または 10 個のコミットではなく、「バージョン 1 の発行」、「バージョン 2 の発行」などが表示されます。

4

1 に答える 1

2

質問の更新を確認した後、使用状況に応じて、以下の 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"

ティググラフの例

于 2013-04-15T21:08:07.087 に答える