4

ブランチ マスターとトピックが次のようにある場合:

A -- B -- C -- D (master)
     \
      W -- X -- Y -- Z (topic)

そして、さまざまなフィックスアップ、スカッシュ、修正などで「トピック」のコミットを操作する必要があります。通常、「トピック」をチェックアウトして実行しますgit rebase -i。これを実行して、Z を Y に押しつぶすと、一意のコミットとして消えてしまいます。デフォルトでは、マスターのgit rebase -i頭にリベースするため、次のようになります。

A -- B -- C -- D (master)
               \
                W -- X -- YZ

さて、多くの場合、master の新しいコミットが自分のトピック ブランチに表示されることを実際に望まないことがあります (たとえば、コストのかかる再コンパイルが発生する可能性があります)。

これを行うための推奨される方法git rebase -i HEAD~4は、「トピック」で発行することです。Y と Z は押しつぶされ、トピックはまだ 'B' から始まっています。

A -- B -- C -- D (master)
     \
      W -- X -- YZ (topic)

ただし、これが気に入らないのは、トピック内のコミット数を手動でカウントする必要があることです。これは大きくなる可能性があり、確実に変更されるため、シェルの履歴から再実行することはできません。これを行うたびに、「git log」の実行、コミットのカウント、コマンドの編集などを行う必要があり、常に「rebase -i」を実行しています。

「HEAD~N」を合成するためにトピックブランチのコミットを手動でカウントする必要なく、どうすれば同じ効果を達成できますか? つまり、マスターのヘッドに移行することなく、現在のトピック ブランチのすべてのコミットを対話的にリベースすることを意味する、コンテキストに依存しないコマンドが必要です。

必要に応じてこのコマンドにエイリアスを付けるか、履歴から復元する予定なので、これが形式である場合は問題ありgit rebase -i $(git ...)ませんが、可能であれば、トピックブランチの名前について言及しないことをお勧めします。コンテキストに依存し、トピック ブランチを変更するときに編集する必要があります。

4

1 に答える 1

4

topicブランチが作成されたコミットを取得できます

git merge-base topic master

したがって、1 つのコマンドで、これは

git rebase -i `git merge-base topic master`

の開始コミットからインタラクティブにリベースしtopicます。

これにブランチ名を含めず、上流のブランチを正しく設定したい場合は、これも使用できます。

git rebase -i `git merge-base HEAD @{u}`
于 2013-02-27T18:51:08.783 に答える