web-dev-qa-db-ja.com

gitブランチで変更されたファイルが別のブランチに波及しています

私はマスターブランチと別のトピックブランチを持つgitリポジトリに取り組んでいます。トピックブランチに切り替えてファイルを変更しました。ここで、マスターブランチに切り替えると、同じファイルが変更されたものとして表示されます。

例えば:

git-buildブランチのgitステータス:

# On branch git-build
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   cvsup_current
#

マスターブランチに切り替えます

[root@redbull builder_scripts (git-build)]# git co master
M       builder_scripts/cvsup_current
Switched to branch "master"

マスターブランチのgitステータス

[root@redbull builder_scripts (master)]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   cvsup_current
#

Git-buildブランチで変更されたにもかかわらず、ファイルがマスターブランチで変更されたものとして表示されるのはなぜですか?

私の理解では、ブランチは互いに独立しており、あるブランチから別のブランチに変更しても、変更は1つのブランチから別のブランチに「波及」しません。だから私は明らかにここで何かが欠けています。

誰かが手がかりを手に入れましたか?

45
Rajkumar S

これはgitのデフォルトの動作です。

必要に応じて、-fフラグを使用してチェックアウトし、「クリーンチェックアウト」を実行できます。

13
Marko

Git-buildブランチで変更されたにもかかわらず、ファイルがマスターブランチで変更されたものとして表示されるのはなぜですか?

覚えておくべき重要な点は、ファイルがgit-buildブランチでnot変更されたことです。作業コピーでのみ変更されました。

コミットした場合にのみ、チェックアウトしたブランチに変更が戻されます

60
Gareth

あるブランチへの変更を一時的に保存し、別のブランチで作業を行う場合は、git stashコマンドを使用できます。これは、gitを使用することの驚くべき小さな特典の1つです。ワークフローの例:

git stash #work saved
git checkout master
#edit files
git commit
git checkout git-build
git stash apply #restore earlier work

git stashは変更のスタックを格納するため、複数のチェックポイントを安全に格納できます。名前や説明を付けることもできます。完全な使用情報 ここ

40
Peter Burns

変更されたファイルは、追加するまでリポジトリに配置されませんおよびコミットします。トピックブランチに戻ってファイルをコミットすると、マスターブランチには表示されません。

9
Greg Hewgill
  • Gitブランチが相互に依存しているわけではありませんが、ブランチごとに個別に完全なコードベースを持っているわけでもありません。
  • コミットごとに、Gitは変更へのポインターを含むオブジェクトを格納します。したがって、各ブランチは独自の最新のコミットを指し、HEADは現在のブランチを指します。
  • ブランチを切り替えると、HEADポインターはブランチの特定のコミットを指します。したがって、変更されたファイルがある場合、デフォルトの動作はそれらをコピーすることです。

この問題を解決するには、次のことを実行できます。

  1. 使用する -f変更を無視するオプション。

変更を保存する場合:

  1. 同じブランチでローカルに変更をコミットしてから、ブランチを切り替えます。
  2. 使用する git stash、ブランチを切り替え、作業を行い、元のブランチに切り替えてgit stash apply
1
Raviteja