別の回答へのコメントに基づいて、開発は次のようになります。
C2 --- C3 --- C4 --- F2 --- C5 <-- master, origin/master (or similar)
\
W1 --- FX --- W2 --- W3 --- W4 --- W5 <-- workbranch
FX
数週間前に作業ブランチに修正を書き、W1
を介してコミットしW5
ました。彼ら (誰が管理しているorigin/master
か、origin/feature
またはあなたがブランチで作業しているものは何でも) は、おそらく上記の他のコミット (C3
を介してC5
) と一緒に、最終的にそれをコミットするようになりました。これは別のコミットであるため (変更内容は同じですが)、 というラベルを付けましたF2
。
上にブランチをリベースできますが、必要に応じて、少なくともF2
からの変更を取得する必要があります。それが必要な場合は、次のようにします。C3
C4
C5
$ git rebase -i master
あなたがあなたの中にいる間workbranch
。修正FX
は既に含まれているため (現在は と呼ばれています)、引き継ぐ変更のリストからF2
それ (リベースを開始するときに編集しているファイル内の行) を削除してpick
から、対話型リベースを実行します。もちろん、別のコミット (上記の ) に基づいているため、各コミットW1
がW5
引き続き独自に機能することも確認する必要があります。C5
そうでない場合は、別の作業を行いrebase -i
、必要に応じて各コミットを修正する必要があります。また、リベースで競合が発生する可能性があり、手動で解決する必要があります。しかし、これがすべて機能すると仮定すると、次のようになります。
C2 --- C3 --- C4 --- F2 --- C5 <-- master, origin/master (or similar)
\
W1' --- W2' ... --- W5' <-- workbranch
'
(数学表記から借用した一重引用符は、これらがコミット、などと単に「同じことを行う」新しいコミットであることを示します。これは、コミットの既存のチェーンを取得し、新しいチェーンを作成することです。古いチェーンと「同じことをする」別の場所から開始するコミットの、古いチェーンからラベル (この場合は <code>workbranch) を削除し、それを新しいチェーンに貼り付けます。)W1
W2
rebase
運が良ければ、「余分な」コミット (C3
およびそれC4
以上) はありません。作業ブランチがコミット C2 から外れると、リモートの「メイン ライン」の次のコミットは修正 F2 になります。コミットW1
が修正で問題なく機能する場合は、次のようにします。
$ git rebase -i <sha1-of-F2>
その内容は と同じであるpick
ため、 commitの行を再度削除します。この場合、次のようなコミット ツリーが得られます。FX
F2
C2 --- F2 --- C5 <-- master, origin/master (or similar)
\
W1' --- W2' --- W3' --- W4' --- W5' <-- workbranch
いずれの場合も、ここでのポイントは同じです: 変更の新しいチェーン (あなたの "作業" ork) を作成し、origin/whatever
"彼ら" がバグ修正コミットを commit として配置した時点または後にFX
ポイントをハングアップさせますF2
。ここでの問題も同じです.C2から分岐したときに作業をテストし、新しいワークチェーンが他のコミットから分岐したため、作業の一部またはすべてが微妙に壊れている可能性があります.
注: リベース作業を行う場合、元の作業にラベルを貼り付けておくことができます。これにより、元の一連のコミット ( W1
、FX
、W2
、 ... 上記) に簡単にアクセスできます。次のようにします。
git branch original-workbranch workbranch
リベースを開始する前に。「新しい」バージョンですべて問題ないことに満足したら、余分なラベルを削除できます。
git branch -D original-workbranch
この「保存」ステップを忘れた場合、または気にせず、後で元の作業ブランチを回復したい場合は、事後 (通常は約 90 日間) に「参照ログ」を介して実行できます (「参考文献」を参照git reflog --help
)。その時点でより多くの仕事。