2012-07-19 13 views
28

私は最近git rebaseを使用して開始し、私は右のそれをやっている100%確かではないよいます。疑問のために、masterとの2つの枝がmasterから分岐しています。私はnextをチェックアウトし、git rebase -i origin/masterを実行すると、私は次取得Gitのリベースの基本

$ 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 

:やった後

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

そして最後に2間の最後の同期以来

masterは2つのコミットとnext 6を持っていましたgit pull --rebasemasterから2つのコミットがnextにあります。

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

質問:

  1. は、この正しいアプローチですか? pull --rebaseが実行されるまで、なぜ8 and 6異なるコミット
  2. がありますか?
  3. フローを簡略化できますか?多くの義務が

:)

+1

こんにちはデビッド、あなたはgitの代わりに、 'gitの--pull'をリベースの--rebase'引っ張っ'意味したでしょうか? – MikeSep

+0

@MikeSepあなたは正しい、修正されました、ありがとうございます。 –

答えて

39

最初から始めるのをしてみましょう。ここにあなたの元の状態の図があります:あなたがnextをチェックアウトし、それがorigin/master上に既にある2後6つの新しいコミットを作成しorigin/masternextをリベース

 
A-B-C (master, origin/master) 
\ 
    D-E-F-G-H-I (next, origin/next) 

。そのハッシュは異なるものになりますので、これらの新しいコミットを持って、彼らの祖先、origin/masterorigin/nextが発散していない元の祖先(私の図でA)として(私の図でC)「マスターは#2をコミット」。 origin/masterから2とorigin/nextにあったコミット「再ハッシュ」6:私はあなたがnextorigin/nextから8種類のコミットを持っていることがわかります、なぜこれがあると信じています。

git checkout next ; git rebase -i origin/masterした後、あなたはこれを持っている必要があります。

 
A-B-C (master, origin/master) 
\ \ 
    \ D'-E'-F'-G'-H'-I' (next) 
    \ 
    D-E-F-G-H-I (origin/next) 

あなたはnextorigin/next上にない8つのコミットをしていないことを確認することができ、かつorigin/nextnext上にない6つのコミットをしていません。これはコミットのSHA-1ハッシュだけに従っていることが認められています。 (図中の標識のような)diffはちょうどBCからの変化を示す必要があります - あなたはgit diff origin/next next場合、実際の内容は非常に密接に一致している必要があります。

まだnextにしながら、あなたがgit pull --rebaseを行うと、それはソース(リモートorigin/next)から変更を取り出し、そのリモート上に現在のブランチ(next)をリベース。これにより、nextではなくの変更がorigin/nextでなく、新しいnextブランチのorigin/nextの後に表示されます。これは次のようになります。

 
A-B-C (master, origin/master) 
\ 
    D-E-F-G-H-I (origin/next) 
      \ 
       B'-C' (next) 

これが履歴グラフのように見えた場合は、成功しました。

しかし、特にnextがプロジェクトの次の部分で作業するフィーチャーブランチであり、masterが安定したコードと小さなバグ修正のためのものである場合は、中間の図のように見えると思っています。その場合は、git pull --rebaseの代わりにgit pushを実行して、リモートに自分の履歴のバージョンを反映させる必要があります。

+0

'git rebase --pull'は' git pull --rebase'によく似ています。それはフェッチを行い、次に 'git rebase @ {u}'です。それは嘘ですが、それについて考えるのは簡単な方法です。しかし、ポイントはローカルブランチが@ {u}にリセットされ、すべてのローカルが古いブランチにコミットしてから、リセットがアップストリームの上に再生されることです。これにより、簡単な早送りプッシュアップストリームが可能になります。 –

+0

'git rebase --pull'がタイプミスで' git pull --rebase'だったはずだとすれば、 'next'を' D'-E'-F'-G'-H'-私はB'-C''です。それは正しいと思いますか?もしそうなら、私はそれに応じて私の答えを編集します。 – MikeSep

+1

'git pull --rebase'の後にA-D-E-F-G-H-I-B'-C 'が得られます。 g-p-rはローカルブランチ(next)に@ {u}(origin/next)のすべてのコミットを含むように強制し、次にユニークなものはすべて上に(おそらくチェリーピックで)再生されます。 g "-E" -F "-G" -H "-I" –

0

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

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のちょうど短手であり、その後にはが続きます3210。リベース出口サンプルは、チェックアウトされたブランチのままになります。

アップストリームブランチに変更が既に含まれている場合(たとえば、アップストリームに適用されたパッチを郵送したため)、そのコミットはスキップされます。例えば、「(及びA変更の同じセットを導入するが、異なるコミッター情報を持っているGitはAがする)は、以下の履歴にmaster`をリベース」実行:

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

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

をもたらします

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

git add -u 

git rebase --continue 

が発見されています。 は、最後の最後のコマンドは、

git push --force origin sample(your branch name) 
+0

は、https://www.kernel.org/pub/software/scm/git/docs/git-rebase.htmlに従います。 –

関連する問題