web-dev-qa-db-ja.com

Gitチェックアウトは何も変更しません

私は本当にgitが好きです。少なくとも、私はgitのアイデアが好きです。マスタープロジェクトを別のブランチとしてチェックアウトできるので、他のすべてを台無しにするリスクなしに、好きなものを変更できます。しかし、それは機能していません。

基本的に、私のワークフローは次のようなものです。

  1. 安定したバージョンを新しいブランチにチェックアウトして、新しいコードを試す
  2. たくさんの変更を加えます-私はこれを保持するつもりはありません。ただ実験中です。
  3. 私が変更したすべてのものを見てください
  4. 追跡するすべての変更を追加する
  5. ブランチをコミットし、ブランチをOriginにプッシュします(うまくいった場合は、このステップをスキップします)
  6. 別の方法を試してみることにし、マスターに戻ります
  7. マスターブランチにいる場合でも、作業していた実験ブランチのアーティファクトを観察します。

ブランチを別のブランチにチェックアウトし、1つのブランチに変更を加えてから、元のブランチをチェックアウトするたびに、他のブランチで発生したすべてのファイルと変更が残っています。これは非常にイライラしています。これを行うときにIDEでファイルを開いているときにこれが発生する可能性があることを読んだことがありますが、IDEでファイルを閉じ、IDEを閉じました、そして、ブランチを切り替える前にmy Railsサーバーをシャットダウンします、そして、これはまだ起こります。また、 'git clean -f'を実行すると、任意のコミットの後に起こったすべてを削除します(そして、ランダムに、) 、または最新の場合のように、元の状態に何も変更しませんでした。

私はgitを正しく使用していると思っていましたが、この時点で、私はここでウィットの終わりにいます。私は自分のプロジェクトの安定したバージョンを使用して実験的なコードの束で作業しようとしていますが、私はすべての変更を手動で追跡して修正する必要があります。アイデアや提案はありますか?

git checkout -b photo_tagging
git branch # to make sure it's right
# make a bunch of changes, creations, etc
git status # see what's changed since before
git add . # approve of the changes, I guess, since if I do git commit after this, it says no changes
git commit -m 'these are changes I made'

git checkout master
git branch #=> *master

# look at files, tags_controller is still there, added in photo_tagging
# and code added in photo_tagging branch are still there in *master

これは、ブランチでコミットするかどうかに関係なく発生するようです。

41
Josh Kovach

Gitとブランチを使用する方法の例を次に示します。

$ git branch
* master
  organize

$ git branch networking
$ git checkout networking

$ git branch
  master
* networking
  organize

誰もがネットワークで何かをしたので、今マスターは何度も更新されています

$ git pull Origin networking
From github.com:dlundquist/Asteroids
 * branch            networking -> FETCH_HEAD
CONFLICT (rename/delete): Rename src/ServerClientThread.Java->src/ServerConnectionThread.Java in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 and deleted in HEAD
Auto-merging src/Actor.Java
Auto-merging src/Asteroids.Java
CONFLICT (content): Merge conflict in src/Asteroids.Java
Auto-merging src/BasicWeapon.Java
CONFLICT (content): Merge conflict in src/BasicWeapon.Java
CONFLICT (delete/modify): src/DedicatedServer.Java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/DedicatedServer.Java left in tree.
Auto-merging src/MainMenu.Java
CONFLICT (content): Merge conflict in src/MainMenu.Java
CONFLICT (delete/modify): src/NetworkClientThread.Java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/NetworkClientThread.Java left in tree.
CONFLICT (delete/modify): src/NetworkUpdate.Java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/NetworkUpdate.Java left in tree.
Auto-merging src/ScenePanel.Java
CONFLICT (content): Merge conflict in src/ScenePanel.Java
Auto-merging src/Shield.Java
CONFLICT (content): Merge conflict in src/Shield.Java
Auto-merging src/Sprite.Java
Auto-merging src/TripleShotWeapon.Java
Auto-merging src/Weapon.Java
Automatic merge failed; fix conflicts and then commit the result.
mjolnir:Asteroids Durandal$ git status
# On branch networking
# Changes to be committed:
#
#   modified:   src/Actor.Java
#   modified:   src/Sprite.Java
#   modified:   src/TripleShotWeapon.Java
#   modified:   src/Weapon.Java
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/Asteroids.Java
#   both modified:      src/BasicWeapon.Java
#   deleted by us:      src/DedicatedServer.Java
#   both modified:      src/MainMenu.Java
#   deleted by us:      src/NetworkClientThread.Java
#   deleted by us:      src/NetworkUpdate.Java
#   both modified:      src/ScenePanel.Java
#   added by them:      src/ServerConnectionThread.Java
#   both modified:      src/Shield.Java

うわー、gitは本当に怒っています。 gitが私のためにすべての作業を行うには、Masterがネットワーキングよりもはるかに先を行っているようです。

$ git reset --hard networking
HEAD is now at 20d6ee8 done tweaking game on the main branch.  Fixed a few bugs with the TripleShotWeapon.  Rebalanced the gameMechanics() in Asteroids to increase the difficulty as the levels increase.
mjolnir:Asteroids Durandal$ git status
# On branch networking
nothing to commit (working directory clean)

さて、ネットワークが最後にOriginにプッシュされたとき、私は「時間を遡って」います。しかし、作業を行う前に、本当に戻ってマスターとマージする必要があります。それ以外の場合は、マージすることさえ難しくなります。

ファイルのマージに費やされた時間

$ git add (insert conflict resolved files here)
$ git commit -a -m "Merged networking with master"
$ git checkout master
$ git branch
* master
  networking
  organize

次に、変更を適用します。

$ git merge networking
Already up-to-date.

「はい」が好きなら、これをしたいかもしれません。

$ git merge Origin networking
Already up-to-date. Yeeah!

変化を世界に押し出す

$ git Push Origin master
17
EnabrenTane

マスターブランチから別のブランチに一時を切り替えようとしたときにこの問題が発生し、その一時ページで何かを変更し、変更をコミットせずにマスターブランチを再度チェックアウトすると、実際にはTEMPブランチからのすべての変更がマージされましたマスターに。

回答:

TEMPブランチにチェックアウトするたびに、変更をコミットします。こうすることで、TEMPブランチでコミットし、MASTERを再度チェックアウトすると、想定どおりに機能します。

19
shabany

共通言語でgitを説明するのが好きです。回答:ブランチを変更(チェックアウト)すると、別の「ワークスペース」に移動できるという前提のためです。 Gitはそれを行いません(より自然に感じますが、多くはこの誤解を持っています)。

代わりに、ブランチはいわばタグのようなものです。そのため、ブランチの周りで踊り、いくつかの作業を行い、物事を修正し、再び踊り回ってからコミットできます。その後、コミットは最後に行ったブランチで行われます!チェックアウトは、使用する「タグ」/ブランチ、期間のみを変更します。

Martasのコメントの後の更新

これは、ブランチとマスターが同期されている場合(追跡ファイルに関して)、または追跡されていないファイルと適用されます。実際にそれらが異なる状態にある場合、チェックアウトするとファイルとフォルダが実際に消えて再表示されます。変更が追跡されているがコミットされていない場合、gitは実際にチェックアウトを中止し、コミットまたはスタッシュする必要があります。

3
Z. Khullah