18

git のすべてのサブブランチでブランチをリベースすることは可能ですか?

特定のコミットをマークするために、ブランチをクイック/可変タグとしてよく使用します。

* master
*
* featureA-finished
*
* origin/master

今、コミットを変更/言い換えるために、rebase -i master上に行きたいorigin/masterfeatureA-finished^

git rebase -i --onto origin/master origin/master master、私は基本的に履歴を次のようにしたい:

* master
*
* featureA-finished
* (changed/reworded)
* origin/master

しかし、私が得るものは:

* master
*
* (same changeset as featureA-finished)
* (changed/reworded)
| * featureA-finished
|.* (original commit i wanted to edit)
* origin/master

それを回避する方法はありますか、または新しいリベースされたコミットでブランチを再作成することに固執していますか?

4

4 に答える 4

5

git のオブジェクト モデルによると、コミットのメタデータ (つまり、コミット メッセージ) のみを変更し、その中に含まれる基になるデータ (「ツリー」) を変更しない場合、ツリー ハッシュは変更されません。

コミットメッセージの編集とは別に、リベースも実行しています。これにより、履歴内の各コミットのツリーハッシュが変更されます。これは、プルされた変更がorigin/master、書き換えられた履歴内のファイルに影響を与えるためです。つまり、一部のファイル ( blob) が変更されたことを確認します。

そのため、やりたいことを確実に実行する方法はありません。

とはいえ、コミットを編集しrebase -iても、通常はコミットのタイムスタンプと作成者は変更されないため、これを使用して、リベース操作の前後でコミットを一意に識別することができます。

リベースを行う前に、これらの "timestamp:author" 識別子に対してすべてのブランチの開始点を記録するスクリプトを作成し、同じ "timestamp:author" ID で書き換えられたコミットを見つけて、ブランチをリベースする必要があります。

残念ながら、今はこのスクリプトを自分で書いてみる時間がないので、幸運を祈ります!

編集:次を使用して、作成者の電子メールアドレスとタイムスタンプを取得できます。

$ git log --graph --all --pretty=format:"%h %ae:%ci"
* 53ca31a robert.meerman@gmail.com:2010-06-16 13:50:12 +0100
* 03dda75 robert.meerman@gmail.com:2010-06-16 13:50:11 +0100
| * a8bb03a robert.meerman@gmail.com:2010-06-16 13:49:46 +0100
| * b93e59d robert.meerman@gmail.com:2010-06-16 13:49:44 +0100
|/
* d4214a2 robert.meerman@gmail.com:2010-06-16 13:49:41 +0100

そして、コミット ハッシュに基づいて、これらのそれぞれのブランチのリストを取得できます。

$ git branch --contains 03dda75
* testbranch

コミットごとに複数のブランチに注意してください。共通の祖先d4214a2は両方のブランチに属しています!

于 2010-06-16T13:11:01.947 に答える
2

どれだけ正確にそこにたどり着いたかはわかりませんが、次のようになります。

git branch -f (same changeset as featureA-finished)

featureA-finished正しい履歴でブランチをリセットするのに十分なはずです。

于 2010-04-28T17:53:48.180 に答える
2

この機能はゆっくりと git に取り込まれているようです。私の元の答えが尋ねたことを正確に行うrebaseオプションを得るでしょう。--rebase-refs提案されたパッチ シリーズについては、gmane のスレッドリベース: コマンド "ref" およびオプション --rewrite-{refs,heads,tags}を参照してください。

于 2011-06-27T07:39:42.070 に答える
1

私がお勧めするのは、最初にリベースfeatureA-finishedすることです。origin/master次に、言い換え手順を実行します。その後、 にリベースmasterfeatureA-finishedます。これにより、必要な最終結果が得られます。

両方のリベースで使用する必要があり、2 番目のリベースで-i元のコミットからすべてのコミットを削除する必要がある場合があることに注意してください。必要に応じて、中間ブランチを保存し、それを新しいバージョンfeatureA-finshedのリベースのベースとして使用することで、これを排除するスクリプトを作成できます。--onto正しく記述すれば、そのような「サブブランチ」のシーケンスを処理することもできます。あなたが助けを必要とするなら、私はそれを強打しようとすることができます.

于 2010-06-15T17:31:29.783 に答える