Git checkout不会改变任何东西

Jos*_*ach 41 git git-checkout git-branch

我真的很喜欢git.至少,我喜欢git的想法.能够将我的主项目结账为一个单独的分支,在那里我可以改变我想要的任何东西,而不用担心其他一切都搞砸了,这真是太棒了.但它不起作用.

基本上,我的工作流程是这样的:

  1. Checkout稳定版本到新分支以试验新代码
  2. 做一堆改变 - 我无意保留任何这些,我只是在试验.
  3. 看看我改变的所有东西
  4. 添加要跟踪的所有更改
  5. 提交分支并将分支推送到原点(如果有效,否则跳过此步骤)
  6. 决定尝试另一种方法,回到主人
  7. 观察我工作的实验分支中的工件,即使我在主分支中.

每次我将分支签出到另一个分支,对一个分支进行更改,然后签出原始分支,我仍然拥有在另一个分支中发生的所有文件和更改.这非常令人沮丧.我已经读过,当你在IDE中打开文件的时候会发生这种情况,但是我一直非常小心这一点,并关闭了IDE中的文件,关闭了IDE,并在切换之前关闭了我的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
Run Code Online (Sandbox Code Playgroud)

无论我是否在分支上进行提交,这似乎都会发生.

sha*_*any 19

当我尝试将temp从主分支切换到另一个分支时,我遇到了这个问题,当我在那个临时页面上更改某些内容而没有提交更改时,我会再次检查主分支,它实际上合并了TEMP分支的所有更改进入MASTER.

回答:

每当您结账到TEMP分支时,请执行更改.这样,如果您在TEMP分支上提交它们并再次检出MASTER,它将按预期工作.

  • 有人知道为什么是这样吗?如果你只完成了一半只是为了切换分支,被迫承诺似乎是一种耻辱......并不是说我害怕承诺。 (2认同)
  • @Chortle您可以改用`git stash`。无需提交 (2认同)

Ena*_*ane 17

这是一个如何使用git和branches的示例.

$ git branch
* master
  organize

$ git branch networking
$ git checkout networking

$ git branch
  master
* networking
  organize
Run Code Online (Sandbox Code Playgroud)

现在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
Run Code Online (Sandbox Code Playgroud)

哇,git真的很生气.看起来Master已经远远领先于网络,因为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)
Run Code Online (Sandbox Code Playgroud)

好的,现在我在网络最后推到原点的时候"回到了时间".但在我做任何工作之前,我真的应该回去和师父合并.另外,它甚至很难合并.

合并文件的时间

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

现在让我们应用我们的更改

$ git merge networking
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)

如果您喜欢"是的!",您可能想要这样做.

$ git merge origin networking
Already up-to-date. Yeeah!
Run Code Online (Sandbox Code Playgroud)

将我们的变化推向世界

$ git push origin master
Run Code Online (Sandbox Code Playgroud)

  • 这很有帮助,但这并不是真正发生的问题.我是唯一一个从事该项目的人,所以我不需要解决任何冲突.我认为问题是当(我认为)检查另一个分支应该替换或隐藏在另一个分支中进行的任何更改时,工件从其他分支出现.实际上,从网络切换到主(不合并)仍然可以显示网络中发生的一切. (6认同)
  • Touche,Enabren.这样做了.当我第一次开始使用git时,我正在使用'git add*',但在尝试学习它的时候,我读到了某处使用'git add'.我刚做了几个实验,发现'git add'.正是问题的根源.非常感谢.头痛=>走了. (6认同)
  • 然后我怀疑git add.是你的错误.我总是git add*在目录而不是-the-目录中添加每个* (3认同)
  • 我在我的分支中使用`git add <file>`并得到与你相同的问题.我真的不喜欢`add*`,因为我很少想要将所有已更改的文件添加到提交中.您是说我不应该使用此工作流程添加单个文件? (3认同)

Z. *_*lah 5

我喜欢用通用语言解释 git。答:这是因为假设更改分支(结帐)将使您进入另一个“工作区”。Git 不会那样做(尽管感觉更自然,而且很多人都有这种误解)。

相反,分支就像标签,可以这么说。所以你可以在分支上跳舞,做一些工作,修改东西,再次跳舞,然后提交。然后,提交将在您去的最后一个分支!结帐只会更改您将使用的“标签”/分支,句号。

在 Martas 发表评论后更新

这适用于您的分支和您的 master 同步(关于跟踪文件)或未跟踪文件的情况。如果实际上它们处于不同的状态,那么当您结帐时,文件和文件夹实际上会消失并重新出现。如果您跟踪了更改但未提交,那么 git 实际上会中止检出,您必须提交或存储它们。