ではなく、マージのgit rebase
を使用して、実際にありました。リベースが何であるかを示す次の簡単な図を考えてみましょう。
master: ... A -- B -- D
local: ... A -- B -- C
上記の図はP1
は彼の作品をプッシュしようとしたときのブランチの状態を表現しようとします。彼のlocal
ブランチとリモートmaster
はコミットB
まで同じです。しかしP2
master
の上にD
をコミットプッシュしているし、その後P1
は、ローカルC
をコミットしました。 P1
が合併し、次に押し、リモートmaster
を引っ張っていたならば、我々は次の図だろう:
master: ... A -- B -- D -- M'
local: ... A -- B -- C -- M
を今、私たちは両方local
とリモートmaster
枝がコミット(M
とM'
としてラベル)をマージしていることを見ます。しかし、ここには別の方法があります。理由は何、ここ
master: ... A -- B -- D
local: ... A -- B -- D -- C' (C' labelled as such because it is a new commit)
ご注意:図はリベースした後のようになります。今ここに
git checkout local
# do a fetch if not up to date already
# git fetch origin
git rebase origin/master
:P1
はは、この経由して、遠隔master
ブランチ上彼のローカルブランチをリベースしている可能性がリベースはロールバックにある行っている最新の共通のlocal
ブランチはB
をコミットしている、自分自身との間でmaster
コミット。次に、を再生します。master
からコミットします。この場合、コミットするのはD
です。最後に、local
ブランチに固有のコミット、この場合はコミットC
を適用します。
git push origin master
これはこのように見ている図を残して:
あなたがうまく行けば見ることができるこの、のいいところは、今だけ通常のgit push
を行うことができますP1
リモートmaster
にコミット彼の持っていることです:
ここで、リモートmaster
ブランチにマージコミットはありません。
通常、リベースはブランチの履歴の書き換えを伴い、書き直されているブランチがすでに公開されている場合には複雑になります。 P2
の場合、彼のlocal
ブランチが彼によってのみ使用されている場合、それを再配置するためのペナルティはありません。リモートのmaster
ブランチは、私が上で行った練習で書き直されませんでした。しかし、これは常にそうであるとは限りませんし、心に留めておくべきことです。
ため
git fetch --all && git merge ...
またはgit pull --rebase
のショートカットです - あなたはまだあなたの最後の枝がためにコミットアクセスできるように--hardとリベースとき場合には何かがゆがんで行きます変更のあるソフトrebase.- –