1. ホーム
  2. git

[解決済み] git rebaseの基本

2022-03-06 15:55:38

質問

を使い始めました。 git rebase 最近、この方法が正しいかどうか100%確信が持てません。質問のために、オリジンには2つのブランチがあります。 masternext から枝分かれした master .

2つの間の最後の同期以来。 master は2回コミットされ next 6:

$ git log --oneline origin/next..origin/master
59b5552 master commit #2
485a811 master commit #1

$ git log --oneline origin/master..origin/next
4ebf401 next commit #6
e9b6586 next commit #5
197ada0 next commit #4
4a2c3c6 next commit #3
040a055 next commit #2
84537bf next commit #1

チェックアウトするとき next を実行し git rebase -i origin/master , 以下のようになります。

$ git status
# On branch next
# Your branch and 'origin/next' have diverged,
# and have 8 and 6 different commits each, respectively.

そして最後に git pull --rebase の2つのコミットは masternext :

$ git log --oneline origin/next..next 
8741d09 master commit #2
485a811 master commit #1

質問です。

  1. このやり方は正しいのでしょうか?
  2. なぜ 8 and 6 まで異なるコミット pull --rebase が実行されるのですか?
  3. フローを簡略化できないか?

ありがとうございました。)

解決方法は?

では、最初から説明しましょう。これはあなたの元の状態の図です。

A-B-C (マスター、オリジン/マスター)
 \
  D-E-F-G-H-I (ネクスト、オリジン/ネクスト)

チェックアウトしたとき next をリベースし next の上に origin/master にある 2 つのコミットの後に、新たに 6 つのコミットが作成されました。 origin/master . これらの新しいコミットには、 "マスターコミット #2" ( C を先祖とするものであり、元の先祖である origin/masterorigin/next が分岐している( A のように、ハッシュが異なります。そのため、以下のようなことがわかると思います。 next とは8つの異なるコミットがあります。 origin/next の2つです。 origin/master にあった 6 つのコミット、そして origin/next .

その後 git checkout next ; git rebase -i origin/master であれば、このようになります。

A-B-C (マスター、オリジン/マスター)
 \ \
  \ D'-E'-F'-G'-H'-I' (次)
   \
    D-E-F-G-H-I (オリジン/ネクスト)

を見ることができます。 next にないコミットが 8 件あります。 origin/next そして origin/next にない 6 つのコミットがあります。 next . もちろん、これはコミットの SHA-1 ハッシュ値によるものです。実際の内容は git diff origin/next next -- の変更点のみを表示します。 BC (図中のラベルの通り)。

をすると git pull --rebase を実行したまま next からの変更点を取得します(リモートの origin/next ) を作成し、現在のブランチをリベースします ( next ) をそのリモートの上に置く。これによって next しかし ではなく origin/next の後に表示されるように origin/next 新しい next ブランチを作成します。このように表示されるはずです。

A-B-C (マスター、オリジン/マスター)
 \
  D-E-F-G-H-I (原点/次点)
             \
              B'-C'(ネクスト)

履歴のグラフがこのようなものであれば、成功です。

しかし、本当は真ん中の図のような形にしたかったのではないでしょうか、特に next はフィーチャーブランチで、プロジェクトの次のピースを作っているところです。 master は安定したコードと小さなバグフィックス用です。もしそうなら、あなたは git push ではなく git pull --rebase を使うと、リモートにあなたのバージョンの履歴を反映させることができます。