Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 为什么签出其他分支后仍存在未老化的更改?_Git_Git Checkout - Fatal编程技术网

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