-1

私はブランチに「実験」と言ってもらいました、そしてそれは数日前に押し戻されました。これでマスターが更新されました。マスターにリベースした後、もう一度実験をプッシュする必要があります。しかし、マスターにリベースすると、マスターの上に実験のパッチが表示されません。私の実験ブランチはマスターを指しています。

何が間違っている可能性がありますか?この実験ブランチがすでにマスターか何か他のものと合併しているからでしょうか?

Gitステータス

$ gitstatus
ブランチ実験時追跡されていないファイル:(コミットされるものに含めるには「 gitadd ...」を使用) a.txt コミットには何も追加されませんが、追跡されていないファイルが存在します(追跡するには「gitadd」を使用)



Gitログ

$gitログ実験
コミットbc6c71d5ec6d8798aa283c9feaec844cd03edc60
作成者:ssrivastava
日付:火11月27日12:15:37 2012+0530
[実験]プレーヤーのステータスにインデックスを追加

マスターへのリベース

まず、頭を巻き戻して、その上で作業を再生します...
マスターするための早送りの実験。

通常、リベースを適用すると、ベースブランチの上にある現在のブランチに最新の変更が適用されますが、ここには何も表示されません。

4

1 に答える 1

1

一般に、リベースする場合、Gitは、どのコミットが何も行わず、それらを除外するかを検出するのに十分なほど賢いです。したがって、実験ブランチのコミットと同じことを行うマスターの変更がある場合、何も変更されないため、そのコミットはスキップされます。この動作は、リベースを確認するときに混乱する可能性がありますが、あなたの場合はそうではありません。

リベースは、両方のブランチの共通の祖先を見つけることによって機能します。その後、古いベースとして使用されます。あなたの場合、実験ブランチの変更をマスターブランチにマージしたので、共通の祖先はそのマージコミットです。これで、コミットはマスターが現時点で指しているものと同じであり、実際には実験ブランチの子です(マージ前に実験ブランチの親を指します)。

B --- * --- O --- M       B ~ old base, O ~ old master
 \               /        M ~ current master (the merge commit)
  * --- * ----- E         E ~ experiment branch

したがって、masterにはすでに完全な実験ブランチが含まれており、Mは実際には1回のコミットで実験ブランチよりも進んでいます。Gitが実験ブランチのコミットをマスターの上で再生する場合、それらは空であるため、それらのコミットをスキップします。すべての変更はすでにマスター内にあります。したがって、本質的には早送りになります。さて、Gitは賢いので、それらがすべてスキップされることを確認するために、マスターの上にそれらすべてのコミットを適用しようとする必要はありません。マスターは実験ブランチの前にいるので、これは常に当てはまります。したがって、実験ブランチを早送りして直接マスターすることができます。

于 2012-12-12T07:29:03.947 に答える