2016-05-20 6 views
0

変更をコミットしてプッシュすると、別のチェックインが発生して、他のユーザーからの前回のコミットがマージされます。たとえば、1つのファイルReadme.txtを変更してコミットした後、git pullを実行します。いくつかの変更が私のリポジトリに追加されます。それから私は自分の変更をプッシュします。変更をマージすると余分なチェックインが発生する

Merge branch 'mainline' of https://example.com into mainline 

どうすればよいですか?変更を確認するにはどうすればよいですか?これは、他の人がチェックインした重複したチェックインのようだと思われます。

答えて

3

説明している内容はmerge-commitと呼ばれています。

代わりのちょうど前方分岐ポインタを移動し、Gitはこの三方向のマージした結果、新たな スナップショットを作成し、自動的に が新しいのことをコミット作成:

This

は読むために非常に良いページですそれを指す。これは、 マージコミットと呼ばれ、複数の親を持つ点で特別です。

をマージコミットそれはそれは2人の親は、あなたの現在の仕事のための1つをコミットし、マージの反対側に1つずつ持っている意味、仕事の2行を一緒に持ってコミットしています。あなたがマージされているコードの上に再プレーあなたのコミットにリベースのようなツールを使用することができ、これらのコミットを避けるために

。これは複雑なトピックですので、私はあなたのベアリングを取得するには、いくつかのrebase tutorials次推薦まず、潜在的な落とし穴と同様に。

Hereは、マージコミットを避けるための記事です。

1

あなたが見ているのは、中央のリポジトリを介して他の人と協力しているときの通常の一般的な現象です。問題とはみなされません。あなたのコミットを押すチャンスがある前に、誰かがコミットをプッシュしたという事実を扱うのはgitのやり方です。それは単にタイミングの事故である。何もあなたがやっていることの間の衝突と何をプルダウンされ、これに対する通常の解決策は、プルリベースを使用することですがないと仮定すると、

+0

ケース2のようにそれを何にあなたの2つの支店を作るために使用することができますが、これを回避する方法があるはずです。特に両方のチェックインが同じ場合。 – KingKongFrog

0

git pull --rebase 

これが何をするかは、次のとおりです。

  • あなたのツリーにあなたのコミット
  • 適用の着信コミットを巻き戻し、リモート
  • からアップデートを取得
  • そして最後に、あなたの地元を再生するには(非プッシュ)後に入ってくるもの

を犯し、あなたがgit pullを行っていたかのように最終的な結果は、魔法瞬時にすべての変更を行い、その後、それらを約束しました。

ローカルコミットと着信コミットの間に矛盾がある場合、通常のマージ競合解決を行う必要があります。しかし、そうでない場合、これは一般的により洗練された履歴とより少ないマージコミットをもたらすでしょう。

Aをコミットして作るから、あなたが開始するとしましょう、あなたの地元のコミットB:あなたが引くと

A --- C --- D --- E 

A --- B 

一方、Aから始まる別の開発者がCD、およびE追加、何が起こるかは2つの発散する枝が合併されることです。あなたは最終状態、Fで終わる:

A --- C --- D --- E --- F 
\--- B ---------------/ 

あなたがgit pull --rebaseを使用する場合は、リモートのコミットになるだろう、と、あなたの地元のコミットはそれらの後を追加します。だからあなたはこれで終わり、マージコミットはありません。

A --- C --- D --- E ---- B 

(ここでも、マージ競合が発生しないと仮定。)

0

早送りマージコミットそのようなマージを避けることができました。ブランチAとブランチBの最後の共通コミットがブランチAの最後のコミットではなく、ブランチBの最後のコミットでない場合、BとAのマージは早送りマージです。すなわち、Aのコミットのシーケンスは、であり、Bのコミットのシーケンスの真のサブセットである。これらのケースを見てみましょう。すべての数字はコミットです。

  1. A:1-2-3-4、B:1-2-3-4。セット(A)=セット(B)。 AをBまたはBにAをマージすると、結果は得られません。
  2. A:1-2-3-4、B:1-2-3-4-5。集合(A)は集合(B)の真の部分集合である。 AとBをマージすると、何も起こりません。 BをAにマージします。早送りマージはデフォルトです。
  3. A:1-2-3-4、B:1-2-3-5。 set(A)の最後のコミット4はセット(B)になく、set(B)の最後のコミット5はセット(A)にありません。 AとBをマージするか、BをAにマージすると、どちらもあなたの場合のように高速ではない早送りマージにつながります。

git merge --no-ffは、マージが可能であれば、常に高速ではないフォワードマージを行います。 git merge --ff-onlyは、早送りマージにならないと常に失敗します。

あなたはgit rebasegit reset --hardgit cherry-pickは私がいることを理解

関連する問題