2009-05-02 18 views
44

同僚と私は現在どちらもマスターブランチに取り組んでいます。作業ツリーにコミットしたくないコードがあります(デバッグ文など)。今、彼は、同じファイルのいくつかの変更をコミットした場合、私はそれらをマージすることはできません。git mergeが私の作業ツリーにコミットされていない変更を処理する方法は?

subversionの背景から来る
$ git merge origin/master 
Updating 1b8c5c6..eb44c23 
error: Entry 'blah.java' not uptodate. Cannot merge. 

、私はリポジトリから変更を引っ張ったときに、私の作業ツリーが自動的にマージされたために使用されますよ競合が発生した場合は、手動で解決します。

私はgitの中でこれを行うに発見した最も簡単な方法は次のとおりです。基本的に

$ git stash 
$ git merge origin/master 
$ git stash pop 

、私のコミットされていない変更を削除するマージを行うと、その変更を再適用します。どのようにして、私の作業ツリーを自動的にマージして、私が取り込もうとしている変更をmergeに伝えることができますか?

+3

マージの競合がある場合はどうなりますか?ダーティファイル(変更したファイル)でconflicstをマージするとどうなりますか? Junio C Hamano(git maintainer)ブログ:http://gitster.livejournal.com/29060.html –

+0

リンクをありがとうございました。しかし、大部分の時間にも、私は矛盾や手の届かない気がしない小さなものを期待しています。とにかく私が汚いファイルを犯すと、私は紛争の同じリスクを負うことになります。 –

+0

関連する質問:http://stackoverflow.com/questions/18529206/when-do-i-need-to-do-git-pull-before-or-after-git-add-git-commit – leo9r

答えて

18

あなたができることは、あなたがすでに持っているものがgit stashであることです。私はあまりにも、マージがクリーンな木だけを扱いたいと思うのは奇妙だと分かります。

+3

私はこれを私の.bashrcに入れます: gm(){ git stash; git merge $ @; git stash pop } そして、どういうわけか、私をお尻にかみ込むのにどれくらい時間がかかりますか? –

+1

@jeremy:あなたはいつか非常に古い隠し場を適用することになります:)。私に起こりました :)。 – reto

+0

@reto:どうしたの? – Casebash

36

退治から学んだことはすべて忘れてしまった。

外部変更を導入する前に常にコミットしてください。

ほとんどの場合、完全に機能していないツリーがありましたが、あなたは進歩しているとします。それでは、あなたは混乱を招くようになります。そして、あなたはコードを壊してしまいました(バグそのもの、対処するにはあまりにも多くの対立などでした)。あなたはそれを元に戻すことができればいいのではないでしょうか?

コミットすることができます。あなたがしなければ、あなたはただ苦しんでいるだけです。

忘れないでください:にプッシュするものがありますが、コミットしないものは簡単に失う可能性があります。

安全で簡単なことを行い、早期にコミットし、頻繁にコミットします。

+1

私はデバッグ文をコミットしてからマージします。それから私は押したいと思ういくつかの実際の変更を行います。どのように私はデバッグステートメントを出すのですか?私がコミットしたいものはそのコミットに依存しています。 –

+0

"復帰"コマンドを使用して、前回のコミットをいつでも元に戻すことができます –

+1

私たちのコードが実際に狂ってしまい、元に戻すことを心配する必要があるときに、この戦略を検討します。しかし、今のところ、「stash」バージョンはまだ可逆的だと私は信じています。私は再隠し、マージコミットを殺して、私が望むどんなコミットでも隠しポップを再びポップすることができます。 私はSubversionについて学んだことを忘れても気にしませんが、gitよりもはるかに優れているときに吹きます。特にgitが合併に適していると思われるときに吹きます。 –

2

git mergeローカルリポジトリに対して変更が加えられたファイルの変更をマージするように指定することはできません。これにより、マージがひどくなる時代のあなたの変更を失うのを防ぎます。

マージへのCVSとSVNのアプローチでは、更新前に手動でファイルをコピーせず、マージ時にファイルをスクランブルした場合は、手動で再編集して正常な状態に戻らなければなりません。

変更をコミットするか、マージを行う前に隠しておくと、すべてが元に戻ります。マージがうまくいかない場合は、いくつかの方法で試してみて、効果的なものを試してみてください。

実験やデバッグの変更をコミットする場合は、git mergeを経由してコミットした後に、git rebaseを使用してそれらを移動し、誤って削除したり、誤ってリポジトリにプッシュするのを避けることができます。

ブランチでgit rebaseを共有リポジトリにプッシュすると、そのリポジトリから引き離されているすべての人に悲嘆が生じることに注意してください。

これらの場合はgit stashを使用することをお勧めしますが、マージで編集したファイルとコミットしていないファイルが変更された場合にのみ使用します。

+0

あなたはどういうことを言っていますか? SVNはマージする前にあなたのファイルをバックアップします。 GitはバージョンコントロールのC++です。それは過度に複雑で複雑であることに誇りを持っています。 – JohnPristine

+0

私はSVNに関する私の知識は時代遅れだと思います。 Gitはまた、時間の経過とともにより有用になるように進化しています。昨日、Gitリポジトリで動作するが、コミットされていない変更があっても、ブランチをマージしたり変更したりしたいときに使いやすくなっています。 –

関連する問題