2017-12-10 21 views
3

ここに状況があります:(Pはここの人を意味します)。git pullの代わりに何を使うのですか

P1とP2は、masterからdevP1とdevP2という独自のブランチを作成しました。 P2は作業を終了したので、ローカルマスターとマージしてから、リモートマスターリポジトリにプッシュします。すべてが順調。

しかし、P1も彼の仕事を終了させるので、彼は同じことをやっているので、ローカルのマスターと合併してからプッシュしようとしています。しかし明らかに、遠隔マスターは自分のローカルマスターよりも先行しており、彼はプッシュできません。

この場合、私はこの種の状況でマスターブランチを引っぱっていましたが、最近誰かが、私がマージコミットを作成していたため、非常に悪いと言いました。

これは彼が私を失ったときのことです。私はそのような状況で私が何をすべきか理解できませんでした。誰かがここで何をするべきか私に説明することができますか?何らかのリベースがありますか?しかし、私は実際にリモートブランチをリベースできません。

ご協力ありがとうございます。私はどこでもこれを見つけることができませんでした。

+0

ためgit fetch --all && git merge ...またはgit pull --rebaseのショートカットです - あなたはまだあなたの最後の枝がためにコミットアクセスできるように--hardとリベースとき場合には何かがゆがんで行きます変更のあるソフトrebase.- –

答えて

1

ではなく、マージのgit rebaseを使用して、実際にありました。リベースが何であるかを示す次の簡単な図を考えてみましょう。

master: ... A -- B -- D 
local: ... A -- B -- C 

上記の図はP1は彼の作品をプッシュしようとしたときのブランチの状態を表現しようとします。彼のlocalブランチとリモートmasterはコミットBまで同じです。しかしP2masterの上にDをコミットプッシュしているし、その後P1は、ローカルCをコミットしました。 P1が合併し、次に押し、リモートmasterを引っ張っていたならば、我々は次の図だろう:

master: ... A -- B -- D -- M' 
local: ... A -- B -- C -- M 

を今、私たちは両方localとリモートmaster枝がコミット(MM'としてラベル)をマージしていることを見ます。しかし、ここには別の方法があります。理由は何、ここ

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ブランチは、私が上で行った練習で書き直されませんでした。しかし、これは常にそうであるとは限りませんし、心に留めておくべきことです。

+0

ありがとう、これは私が探していたようです。 – Rockleader01

+0

質問があればお気軽にお問い合わせください。 1回のSO答えでもリベースを完全に説明するのは難しいです。 –

+0

私はすでにリベースを知っていましたので、それは問題ありません。私はちょうどこのマージコミットを引き出すのではなく、リベースを使うことを考えて "トリック"を見ていませんでした。 – Rockleader01

0

私が知る限り、2つの選択肢があります。 1.マスターを取り出し、devP1をマスターとプッシュマスターにマージします。 2. devP2を取得します。 devP1をdevP2にリベースします。 devP1をマスターとoushマスターにマージします。

編集: P1でもこれが可能です。ハードリセットマスターを元に戻します。マスターを引っ張りなさい。 devP1をマスターにリベースします。 devP1をマスターとプッシュマスターにマージします。私はあなたの対談が念頭に置いていたものを疑う

0

お持ちの場合は、同様pullで行うことができますマージないローカルマスタではなく、リモート・マスターと

git fetch --all 
git merge origin/master <--no-ff> 

それとも、あなたの仕事をリベースすることができ、

git fetch --all 
git rebase origin/master 

を行うことができますあなたがすべてのブランチをマージしていて、リモートブランチとマージしているというルールだが、誰かがプッシュであなたよりも速い場合、最後のマージをリセットしてもう一度やり直すことができる。

git reset --hard HEAD^ 
git merge.... 
git push origin master 

これを行う方法はいろいろあります。正しい方法はありません。一部の企業では、すべての変更をマスターにマージしなければならないというルールを--no-ffで強制している企業もあれば、リベースを使う企業もあります。 Botwの方法は正しいです、違いはあなたがgitの歴史から伝えることができるものです。

何かがうまくいかない場合は、以前のコミットを覚えておく必要はありません。いつでもgit reflogを実行できます。

PS:git pullは自分の枝がcommitid「記憶」してくださいgit fetch --all && git rebase ...

+0

説明をありがとう – Rockleader01

関連する問題