git addを実行してもしなくても、ブランチ(変更、追加、削除されたファイル)を切り替えると、gitが変更を表示し続けるのはなぜですか?


115

私は本当にgitに慣れていないので、git checkoutを実行してブランチを切り替えたときに、あるブランチで変更したものを別のブランチに表示し続ける理由を理解しようと努めてきました。しかし、それからgit addを使用してみましたが、問題は解決しませんでした。私はまだgit commitを使用していません。

これは基本的に私がやっていることです:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

ブランチを使用しているときは、1つのブランチで何をしても、他のすべてのブランチからは見えないのだと思いました。ブランチを作成する理由はそれではありませんか?

「git add」を使用してみましたが、変更は両方のブランチに表示されます。これを回避するために、ブランチを切り替える前に「git commit」を実行する必要がありますか?

回答:


142

ブランチを切り替えると、コミットされていない変更が発生します。最初にコミットするか、実行git checkout .して元に戻すか、git stash切り替える前に実行します。(で変更を取り戻すことができますgit stash apply


10
スタッシュの巨大なスタックを構築したくない限り、git stash popの方が優れています。
シリド

7
@JPZ:git stashは追跡されたファイルのみを扱います。新しいファイルは追跡されないため、保存されません。
シリド

2
@JPZ:追跡されていないファイルを隠しておく場合は、隠してgit addおく前にそれらを実行する必要があります。とは言っても、実際にここに隠しておく必要があるかどうかはわかりません。これらの変更を、切り替えるブランチの一部にするつもりであれば、コミットしてください。(そのブランチに戻り、コミットする前に変更をさらに処理する場合stashは、そのジョブに適したツールになる可能性があります。)
Cascabel

16
「ブランチを切り替えると、コミットされていない変更が発生します」-これは理にかなっており、おそらく最悪の設計アイデアです。あなたが孤立した方法で作業することができない場合、ブランチを持つことの意味は何ですか?!!!
ニーム

1
私の場合、開発ブランチから1つの機能ブランチがあります。featureブランチでコミットしましたが、developブランチもチェックアウトすると変更が表示されます。
Hitesh Garg 2017

31

短い答え:はい、コミットする必要があります。ただし、正しいブランチで実行してください。

ブランチはコミットへのポインタです。チェックアウトしたブランチでコミットすると、ブランチはその新しいコミットを指すように進みます。ブランチをチェックアウトすると、それが指すコミットをチェックアウトすることになります。(コミットは作業ツリーのスナップショットと考えることができます。)

したがって、コミットしていない変更がある場合、ブランチを切り替えても影響はありません。もちろん、ブランチの切り替えが変更と互換性がない場合は、git checkout単にそれを拒否します。

git add変更をステージングするためのコマンドで、コミットします。これらの変更はリポジトリの履歴に記録されません。ステージング領域(インデックス)に配置するだけです。git commit次に、そのステージング領域の内容を使用してコミットを作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.