2012-02-08 3 views
22

私はブランチで作業していますので、いくつかの変更を行い、git merge masterを実行してください。何らかの理由で、私がやったファイルの束がではない touch(ただし、マスターで更新されています)が私のリストを突然入力します。 msgstr "変更をコミットする"。Gitのマージの競合の後、私が触れていないファイルの多くは、コミットする変更になります

これはなぜですか?そして私はこれをどのように修正するのですか?私はこれらの非公開の変更がコミットされることを望んでいません。

+0

rebase not mergeを使用してください。 –

+1

[http://stackoverflow.com/questions/457927/git-workflow-and-rebase-vs-merge-questions](http://stackoverflow.com/questions/457927/git-workflow-and-rebase-vs) -merge-questions) - これはあなたが見なければならないものです –

+7

Rebaseとmergeは異なるワークフローを提供します。この「問題」を「解決」するためにマージする代わりに、ブラインドでリベースを使用することは正しいアプローチではありません。 –

答えて

0

マージを試みると、自動的にマージできるすべてのファイル(ローカルブランチに変更はないが、ソースブランチで変更されたファイルなど)は自動的にマージされ、ステージングされます。自動的にマージできなかったファイルは、作業領域内で競合マーカーで更新され、修正する必要があります。

Gitは常に、コミットする前にステージング領域に新しいコミットをアセンブルします。マージは同じことをします。ソースブランチからのすべての変更を含む新しいコミットがステージング領域に作成されます。競合が発生した場合、ステージング領域を更新するこのプロセスは中断され、制御が与えられます。だからこれが起こるのです。コミットすると、ソースブランチとターゲットブランチの両方を親として持つリポジトリに「マージコミット」が作成されます。

"私はこれらの非公開の変更がコミットされることを望んでいません。"という理由で、変更を望まない場合はどうしてマージしましたか?

+7

「どうしてマージしたの?質問はOPの質問に対する答えではありません。 –

+3

他の人が公開するブランチからマージすると、自分で行っていない変更がブランチに入ります。それはあなたがマージから期待するものです。 「not-by-me」の変更を望まない場合は、マージしないでください。それはとにかく私にとって論理的に思えることです。 –

+2

"...自動的にマージできるすべてのファイルが自動的にマージされ、ステージングされます。"これのポイントは何ですか?私がファイルをローカルに変更していない場合、これらの変更をコミットすることは私を混乱させること以外には何の効果もありません(これはgitの主な目的です)。 –

2

私はこのGITのやり方での問題は、コミット後に "プッシュ"が実行されることだと思います。 「プッシュ」には、「プッシャー」が触れていないファイルを含む、すべてのコミットされたファイルが含まれます。これにより、追跡が非常に複雑になりました。

3

これが起こった理由は、あなたがやろうとしていたことの反対の可能性が最も高いからです。

作業ブランチがtopic-branchとしましょう。代わりにやっての

は:

$ git merge master

あなたが行っている可能性:英語で

$ git checkout master 
$ git merge topic-branch 

、代わりにあなたがmastertopic-branchを合併している可能性がtopic-branchmasterブランチをマージします。

これは我々が前の回答で行われた声明調べることができ、望ましい結果得られる理由を理解するには、次のマージをしようとすると、自動的にあなたがドン例えば を(」マージすることができ、すべてのファイルを

をローカルブランチに変更がありますが、ソースブランチで が変更されています)が自動的にマージされ、ステージングされます。

問題は単純にmergeの仕事をしようとしています。ファイルはトピックブランチでは変更されませんが、マージしているブランチ上にあります。これを逆方向にしてtopic-branchmasterにマージすると、変更したファイルだけが考慮されるため、問題は解決しません。

概念的には、ここ(here以上)やっているマージものです:

は、現在のヘッドが現在呼び出されてみましょう、と頭では、マージと呼ばれる をマージします。

  1. 現在とマージの共通の祖先を特定します。それを ancestor-commitと呼んでください。
  2. 簡単なケースに対処してください。 ancestor-commit がmergeと等しい場合は、何もしないでください。先祖コミットが現在のものと等しい場合、 はfast forward mergeになります。
  3. それ以外の場合は、ancestor-commitとmergeの間の変更を決定します。
  4. これらの変更を現在のファイルにマージしようとします。
  5. 競合がなかった場合は、2つの親、currentおよびmergeで新しいコミットを作成します。 現在の(およびHEAD)をこの新しいコミットを指すように設定し、それに応じてプロジェクトの作業ファイルを更新します。
  6. 競合があった場合は、適切な競合マーカーを挿入してユーザーに通知します。コミットなし が作成されます。
+4

この回答は、いくつかのトピックブランチをマージする必要があるが、最近マスターに変更が加えられたため、トピック外であるように見えます。それで、持ち歩く前にマスターを自分のトピックブランチにマージする必要があります。 – Alec

関連する問題