75

私はgit rebase最近使い始めましたが、正しく使用していると100%確信していません。質問のために、起源には2つのブランチがmasterありnext、はから分岐したものmasterです。

2つの間の最後の同期以降、2つのmasterコミットとnext6つのコミットがありました。

$ 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つのコミットmasterがありnextます:

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

質問:

  1. これは正しいアプローチですか?
  2. 実行さ8 and 6れるまで異なるコミットがあるのはなぜですか?pull --rebase
  3. フローを単純化することは可能ですか?

とても感謝しております :)

4

2 に答える 2

83

最初から始めましょう。これが元の状態の図です。

ABC(マスター、オリジン/マスター)
 \
  DEFGHI(次、オリジン/ネクスト)

チェックアウトしnextてにリベースnextするorigin/masterと、すでにオンになっている2つのコミットの後に6つの新しいコミットが作成されましたorigin/master。これらの新しいコミットには、(私の図の)元のC祖先ではなく、(私の図の)「マスターコミット#2」が祖先として含まれているため、ハッシュは異なります。これが、 8つの異なるコミットがある理由だと思います。2つのコミットと6つの「再ハッシュされた」コミットがありました。origin/masterorigin/nextAnextorigin/nextorigin/masterorigin/next

git checkout next ; git rebase -i origin/master、あなたはこれを持っているはずです:

ABC(マスター、オリジン/マスター)
 \\
  \ D'-E'-F'-G'-H'-I'(次)
   \
    DEFGHI(原点/次)

nextオンになっていないコミットが8つあり、オンorigin/nextになってorigin/nextいないコミットが6つあることがわかりますnext。確かに、これはコミットのSHA-1ハッシュによるものです。実際のコンテンツは、次の場合に非常に厳密に一致する必要があります。diffは、(図にラベル付けされているように)とgit diff origin/next nextからの変更を表示するだけです。BC

git pull --rebaseをオンにしたまま実行するnextと、ソース(リモートorigin/next)から変更をフェッチし、現在のブランチ(next)をそのリモートにリベースします。これにより、新しいブランチに含まれていたが含まれてnextないorigin/next変更が表示されます。次のようになります。origin/nextnext

ABC(マスター、オリジン/マスター)
 \
  DEFGHI(原点/次)
             \
              B'-C'(次)

これが履歴グラフの外観になりたい場合は、成功しています。

nextただし、特にプロジェクトの次の部分で作業している機能ブランチでありmaster、安定したコードと小さなバグ修正のためのものである場合は、真ん中の図のように見せたいと思っているのではないかと思います。もしそうなら、あなたはその逆ではなく、リモートにあなたのバージョンの履歴を反映させるgit push代わりにやるべきでした。git pull --rebase

于 2012-07-19T17:48:47.137 に答える
2

マスターを使用してブランチをリベースするための非常に簡単な手順から始めます。名前;

git-rebase

あらすじ;

git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
        [<upstream>] [<branch>]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
        --root [<branch>]
git rebase --continue | --skip | --abort | --edit-todo

説明; 次の履歴が存在し、現在のブランチが「サンプル」であると想定します。

 A---B---C sample
         /
    D---E---F---G master

この時点から、次のコマンドのいずれかの結果:

git rebase master
git rebase master sample

だろう:

A'--B'--C' sample
                 /
    D---E---F---G master

:後者の形式は、後にgit checkout sample続くの省略形ですgit rebase master。リベースが終了すると、サンプルはチェックアウトされたブランチのままになります。

アップストリームブランチに、行った変更がすでに含まれている場合(たとえば、アップストリームに適用されたパッチをメールで送信したため)、そのコミットはスキップされます。たとえば、次の履歴で'git rebase master`を実行します(A'とAは同じ変更セットを導入しますが、コミッター情報は異なります)。

A---B---C sample
         /
    D---E---A'---F master

結果は次のようになります。

 B'---C' sample
              /
D---E---A'---F master

これらはすべて、リベースプロセスの図式的な理解でした。入力後に見つかった競合を解決したら、競合を解決し、入力git rebase mastergit add -uて変更されたコードをリポジトリに追加します。その後、コマンドを実行しgit rebase --continue、競合の解決を続け、コマンドを繰り返します。

git add -u 

git rebase --continue 

競合が見つからなくなるまで。最後のコマンドは、

git push --force origin sample(your branch name)
于 2013-12-26T10:37:57.600 に答える