Git 为什么签出其他分支后仍存在未老化的更改?
我观察到一些与我所知道的关于Git 为什么签出其他分支后仍存在未老化的更改?,git,git-checkout,Git,Git Checkout,我观察到一些与我所知道的关于git checkout命令不一致的情况。在master以外的分支上,我对跟踪文件进行了一些修改;在没有转移和提交这些更改的情况下,我运行 git checkout master Git不眨眼就遵守了;但更令人惊讶的是,我对该分支所做的所有修改仍然存在!下面是一个重现这种情况的示例: mkdir myrepo cd myrepo git init touch README # create a new file git add . git commit -m "in
git checkout
命令不一致的情况。在master
以外的分支上,我对跟踪文件进行了一些修改;在没有转移和提交这些更改的情况下,我运行
git checkout master
Git不眨眼就遵守了;但更令人惊讶的是,我对该分支所做的所有修改仍然存在!下面是一个重现这种情况的示例:
mkdir myrepo
cd myrepo
git init
touch README # create a new file
git add .
git commit -m "initial commit"
git checkout -b new-branch
echo "foo" >> README
git checkout master
在此阶段,我的工作树中的
README
文件包含foo
行,即使我在另一个分支(new分支
)上添加了它。我希望README
是空的,就像master
的提示中记录的版本一样。为什么foo
行在签出master
后仍然存在?直到一个更改被执行(使用git add
),它只存在于工作目录中-它不被git跟踪,因此将存在于您签出的任何分支中。乍一看,您的问题似乎很无趣,但它让我意识到,git checkout
并不像看上去那么简单。谢谢你的提问:)
据我所知,您的问题是:为什么在签出master
后,未提交的更改(即添加的foo
行)仍然存在于工作树中?如果查找git checkout
手册页,您会发现以下描述:
git checkout <branch>
To prepare for working on <branch>, switch to it by updating the
index and the files in the working tree, and by pointing HEAD at
the branch. Local modifications to the files in the working tree
are kept, so that they can be committed to the <branch>.
在您的示例中,您的回购协议如下所示:
提交、暂存区域和工作树旁边的页面在对应的三个“Git区域”中表示自述文件的内容
“在”git签出主机期间
然后你就跑
git checkout master
那么,假设我对Junio的anwer的解释是正确的,这里发生了什么
由于当前分支new branch
,以及要签出的分支master
,都指向相同的提交A
,因此Cs和Ct(使用我的术语)都对应于A
。当然,在这种情况下,diff(Cs,Is)和diff(Cs,Ws)可以干净地应用于Ct;这里没有冲突
因此,执行检查操作:
HEAD
指向master
- 暂存区的状态被保留
- 将保留工作树的状态
在git签出主程序之后
由于签出master
时没有发生冲突,因此保留了对工作树中README
的本地修改,以便将它们提交到master
分支
那么,如果分支的人不将其分段并对其进行一些修改,会发生什么呢?然后它修改原始文件。更改不会被暂存-您将在签出到的任何分支上看到它。如果此更改与分支冲突,您的git签出将失败。@Mureinik事情并非如此简单。我们不知道您在git add之前做了什么。
。您应该发布一个完整(但最少)的示例,从mkdir myrepo
,cd myrepo
,git init
,以及最后一个git checkout master
的所有命令开始。只有这样,这里的人才能完全理解你在说什么。@Jubobs好的,编辑我的问题。
git checkout master