2016-08-10 35 views
0

かなり長い間Gitを使用していたにもかかわらず、私はまだその分岐機構を理解することができません。特に、これらの簡単なコマンドによって初期化単一のファイルbar.txtで新しいプロジェクトfooを考える:今すぐGitブランチを切り替えると、変更されたファイルはどうなりますか?

$ mkdir foo 
$ cd foo 
$ git init 
$ touch bar.txt 
$ git add . 
$ git commit -m 'Initial commit' 

私はブランチfoobarを作成し、git branchは、私はmasterに残ってることを示しています

$ git branch foobar 
$ git branch 
    foobar 
* master 

しかし、私は、ファイルbar.txtに変更を加えるとき:

$ echo quux >> quux.txt 
$ git status 
modified: quux.txt 

は、その後、私は他のブランチをチェックアウトするとき、私はファイルbar.txtがまた変更されていることがわかります。

$ git checkout foobar 
$ git status 
modified: quux.txt 

を私はすでに、この動作は、私は私の変更をコミットしたいんどの枝に選択することが私にできることを知っています、しかし、私はそれが迷惑なと思う。私はGit分岐の背後にある基本的な考え方を理解できないと思う。私がmasterに変更を加えたときに、チェックアウトすることを選択できる他のブランチからそれらが見えないようにする方法を教えてもらえますか?

+0

gitをこのようにしたいのであれば、ブランチを切り替える前に必ずコミットしてください。そしてWIPコミットがあればチェックアウト時にヒントをリセットしてください。 – jthill

+0

私の質問は、なぜ私はこれによってgitを失神させるでしょうか?私がブランチ「b」をチェックアウトしたときに、ブランチ「a」中に行った変更が利用可能であるということは、なぜ素晴らしい考えですか?これは望ましい機能ですか? –

+0

何が必要なのか、どのブランチをコミットすべきなのかは別々の2つの懸念事項です。 – jthill

答えて

4

作業ディレクトリで行った変更は、コミットするまでブランチの一部ではありません。だからあなたが間違っていたのは、ブランチをチェックアウトしてファイルを修正するときに、 "ブランチ上で"修正を加えたということです。あなたはそれをしていない、あなたは作業ディレクトリを変更しました。

ブランチに基づいて作業ディレクトリが汚れていて、別のブランチをチェックアウトしています。コミットされていない変更は作業ディレクトリに残ります。それ以外の場合は保存されません。どこでも。最初のブランチをもう一度チェックアウトすることはできず、ローカルの変更が再び表示されます。

ブランチを切り替える前におそらく実行したいのはgit stashです。これにより、一時的なブランチへのローカル変更が保存されます。これは後でgit stash popに戻すことができます。

+0

'git stash pop'は' git stash apply'の同義語ですか? –

+1

いいえ。 'git stash pop'は' stash'の一番上の項目を単に破棄します。しかし、 'git stash drop'は' git stash apply'と 'git stash pop'(applyが成功すれば)と考えることができます。 – chepner

+4

私はそれがもう一つの方法だと思います: 'pop' =' apply' + 'drop' –

1

あなたが店にstashを使用することができますが/コミットされていない変更を上演:

git stash 

今、あなたは、新鮮な作業ディレクトリでブランチを切り替えることができます

をご隠し変更を適用するには:

git branch foobar 
git stash apply 
+0

私が 'git stash'を実行すると、新しく作成/削除されたファイルも隠されます(未作成/削除されません)? –

+0

それは--include-untrackedで動作しますが、これを見逃してはならないことに注意する必要があります。 https://git-scm.com/docs/git-stash(save)を参照してください。 –

+0

@BorisStitnickyはい、彼らはそうです!彼らは 'git stash apply --index'を使って、これらのコマンドから同じ生の出力を得ます。 –

2

通常、チェックアウトがファイルに影響する場合、ブランチを切り替えることはできませんそれらはdirtyです。あなたの場合、ファイルの変更はfoobarのチェックアウトに影響しません。チェックアウトするブランチのローカルに変更されたファイルに変更があった場合、チェックアウトは中止されます。ブランチを切り替えるときに、単一のブランチに対して変更されたファイルを保持するという概念はありません。あなたがfoobarをチェックアウトするときに、これらのローカルの変更をしたくない場合は、次のような可能性があります。

  • stash save変更をし、ローカルの変更をクリアします。これにより、マスターに戻ったときに変更を再適用できます。
  • checkout -f foobarもローカルな変更(リセットと同じ効果)を破棄するように(もちろんの変更を破棄した)チェックアウトする前にHEAD
  • reset --hardあなたの現在のブランチ(git stash save --include-untrackedはまた、新しいをキャプチャし、まだファイルを上演していないため)。
関連する問題