61

我真的很喜欢 git。至少,我喜欢 git 的想法。能够将我的主项目作为一个单独的分支签出,我可以在其中更改我想要的任何内容,而不会有搞砸其他所有内容的风险,这真是太棒了。但它不起作用。

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

  1. 将稳定版本签出到新分支以试验新代码
  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

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

4

6 回答 6

28

当我尝试将 temp 从 master 分支切换到另一个分支时遇到了这个问题,当我在该 temp 页面上更改某些内容并且不提交更改时,我会再次检出 master 分支,它实际上合并了来自 TEMP 分支的所有更改进入大师。

回答:

每当您签出到 TEMP 分支时,请提交您的更改。这样,如果您在 TEMP 分支上提交它们并再次签出 MASTER,它将按预期工作。

于 2016-05-26T16:28:19.327 回答
20

这是一个如何使用 git 和分支的示例。

$ git branch
* master
  organize

$ git branch networking
$ git checkout networking

$ git branch
  master
* networking
  organize

现在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

哇,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)

好的,当网络上次推送到原点时,我现在“回到了过去”。但我现在真的应该回去和师父合并,然后再做任何工作。否则将很难合并。

合并文件所花费的时间

$ 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
于 2010-12-23T03:51:07.390 回答
5

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

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

玛塔斯发表评论后更新

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

于 2017-11-24T03:38:46.623 回答
1

请检查您是否具有写入权限。此错误与对存储库的只读访问有关。

于 2021-09-22T10:03:32.087 回答
0
$ git branch
* master
$ git checkout -b develop
$ git branch
  master
* branch

现在更改您想要的任何内容并执行 git add 。

$ git add .   <--Here is the source of the problem, always git add . at your branch to see the observable difference between two branches.
$ git commit -m "Some messages"

$ git checkout master
$ git branch
*master
develop

一切都干净整洁。

于 2020-07-14T08:39:18.550 回答
0

简而言之:提交您的更改(确保您在正确的分支“实验性分支”上签出),即使您不想保留它,如果您想要的话,您可以稍后删除该分支)然后签出您的分支想要(在您的更改之前),您的 IDE 现在将显示/更新到您刚刚签出的分支中文件的状态)

于 2021-05-01T08:28:54.597 回答