Git checkout 不会改变任何东西
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4515644/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Git checkout does not change anything
提问by Josh Kovach
I really like git. At least, I like the idea of git. Being able to checkout my master project as a separate branch where I can change whatever I want without risk of screwing everything else up is awesome. But it's not working.
我真的很喜欢 git。至少,我喜欢 git 的想法。能够将我的主项目作为一个单独的分支签出,在那里我可以更改我想要的任何内容,而不会冒把其他所有事情搞砸的风险,这真是太棒了。但它不起作用。
Basically, my workflow is like this:
基本上,我的工作流程是这样的:
- Checkout stable version to a new branch to experiment with new code
- Make a bunch of changes - I have no intent on keeping any of this, I'm just experimenting.
- Look at all the stuff I changed
- Add all the changes to be tracked
- Commit the branch and push branch to origin (if it worked, otherwise skip this step)
- Decide to try another method, go back to master
- Observe artifacts from the experimental branch I was working in, even though I'm in the master branch.
- 将稳定版本签出到新分支以试验新代码
- 进行一系列更改 - 我无意保留其中任何一项,我只是在尝试。
- 看看我改变的所有东西
- 添加要跟踪的所有更改
- 提交分支并将分支推送到原点(如果有效,否则跳过此步骤)
- 决定尝试另一种方法,回到高手
- 观察我工作的实验分支的工件,即使我在主分支中。
Every time I checkout a branch to another branch, make changes to the one branch, and then checkout the original branch, I still have all the files and changes that happened in the other branch. This is getting extremely frustrating. I've read that this can happen when you have files open in the IDE while doing this, but I've been pretty careful about that and both closed the files in the IDE, closed the IDE, and shut down my rails server before switching branches, and this still happens. Also, running 'git clean -f' either deletes everything that happened after some arbitrary commit (and randomly, at that), or, as in the latest case, didn't change anything back to its original state.
每次我检出一个分支到另一个分支,对一个分支进行更改,然后检出原始分支时,我仍然拥有另一个分支中发生的所有文件和更改。这变得非常令人沮丧。我已经读到当您在执行此操作时在 IDE 中打开文件时可能会发生这种情况,但是我对此非常小心,并且在切换之前都关闭了 IDE 中的文件,关闭了 IDE 并关闭了我的 rails 服务器分支,这种情况仍然发生。此外,运行 'git clean -f' 要么删除在某些任意提交之后发生的所有事情(并且随机地),或者,在最新情况下,没有将任何内容更改回其原始状态。
I thought I was using git correctly, but at this point, I'm at my wit's end here. I'm trying to work with a bunch of experimental code using a stable version of my project, but I keep having to manually track down and fix all the changes I made. Any ideas or suggestions?
我以为我正确地使用了 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
This seems to happen whether I do a commit or not on the branch.
无论我是否在分支上提交,这似乎都会发生。
采纳答案by EnabrenTane
Here is an example of how to use git and branches.
以下是如何使用 git 和分支的示例。
$ git branch
* master
organize
$ git branch networking
$ git checkout networking
$ git branch
master
* networking
organize
Now Master has been updated many times since anyone has done anything on networking
现在Master已经更新了很多次,因为任何人都在网络上做过任何事情
$ 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
Woah, git is really mad. It looks like Master is too far ahead of Networking for git to do all the work for me.
哇,git真的很生气。看起来 Master 比 Networking 领先太多了,git 无法为我完成所有工作。
$ 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)
Ok, now I am "back in time" when networking last pushed to origin. But I really should go back and merge with Master now before I do any work. Other wise it will be even hard to merge.
好的,现在我“回到过去”,当网络上次推送到原点时。但是我现在真的应该回去跟师父融合,然后再做任何工作。否则,合并将更加困难。
Time spent merging files
合并文件所花费的时间
$ git add (insert conflict resolved files here)
$ git commit -a -m "Merged networking with master"
$ git checkout master
$ git branch
* master
networking
organize
Now lets apply our changes.
现在让我们应用我们的更改。
$ git merge networking
Already up-to-date.
You might want to do this if you like the "Yeah!"
如果您喜欢“是的!”,您可能想要这样做。
$ git merge origin networking
Already up-to-date. Yeeah!
Push our changes to the world
将我们的改变推向世界
$ git push origin master
回答by shabany
I had this issue when I tried to switch temp to another branch from the master branch and when I would change something on that temp page and without committing the changes I would checkout the master branch again, it actually merged all the changes from the TEMP branch into MASTER.
当我尝试从 master 分支将 temp 切换到另一个分支时遇到了这个问题,当我在该临时页面上更改某些内容并且没有提交更改时,我会再次签出 master 分支,它实际上合并了来自 TEMP 分支的所有更改进入大师。
ANSWER:
回答:
Whenever you checkout to a TEMP branch, COMMIT your changes. That way if you commit them on the TEMP branch and checkout MASTER again, it will work as supposed.
每当您结帐到 TEMP 分支时,请提交您的更改。这样,如果您在 TEMP 分支上提交它们并再次结帐 MASTER,它将按预期工作。
回答by Z. Khullah
I like to explain git in common language. Answer: its because of the assumption that changing branches (checkout) will get you to another "workspace". Git doesn't do that (altough it feels more natural, and many have this misunderstanding).
我喜欢用通用语言解释 git。答:这是因为假设更改分支(结帐)将使您进入另一个“工作区”。Git 不会那样做(尽管感觉更自然,而且很多人都有这种误解)。
Instead, branches are like tags, so to speak. So you can dance around branches, do some work, modify things, dance around again, and then commit. Then, the commit will be at the last branch you went to! The checkout only changes the "tag"/branch you'll use, period.
相反,分支就像标签,可以这么说。所以你可以在分支上跳舞,做一些工作,修改东西,再次跳舞,然后提交。然后,提交将在您去的最后一个分支!结帐只会更改您将使用的“标签”/分支,句号。
UPDATE after Martas's comment
在 Martas 发表评论后更新
This applies to when your branch and your master are synced (regarding tracked files), or with untracked files. If in fact they are in different states, when you checkout then files and folders will actually disapear and reappear. If you have changes tracked but not commited, then git will actually abort checking out, and you have to either commit or stash them.
这适用于您的分支和您的 master 同步(关于跟踪文件)或未跟踪文件的情况。如果实际上它们处于不同的状态,那么当您结帐时,文件和文件夹实际上会消失并重新出现。如果您跟踪了更改但未提交,那么 git 实际上会中止检出,您必须提交或存储它们。