为什么从已经上传的其他分支检出文件?

时间:2015-12-10 05:30:23

标签: git

关于Git工作流程,我们创建了一个我们用于特定sprint的master的分支,并且sprint中的每个工作项都从中分支出来。如此有效,分支/合并流程将是:

master
  |   \
  |    sprint42________
  |       |    \       \
  |       |     item1   item2
  |       | ___/       /
  |       |/          /
  |       | _________/
  |       |/
  | _____/
  |/
  |

现在,在这个流程中,我发现我对item1中的一个文件所做的更改也需要在item2中完成(想想我添加了一个实用程序文件)方便的功能)。

因此,根据this question的已接受答案,我检查了item2分支并继续从item1分支中提取实用程序文件,如下所示:

git checkout item2
git checkout item1 utilities.xyzzy

但是,在检查git status时,似乎此文件已放入暂存区域,而我认为将其视为新修改的文​​件会更有意义:

pax> git status
On branch item2
Your branch is up-to-date with 'origin/item2'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   utilities.xyzzy

为什么这样做?当我将一个文件从另一个分支拉到我当前的分支时,我怎么能把它简单地作为一个修改后的文件,我将在准备好后暂存?

2 个答案:

答案 0 :(得分:6)

旁注:当我阅读原始主题行"Why is file pulled from ..."(现已修复)时,我认为您指的是git pull脚本。我认为值得强调的是,您在此处专指git checkout,在表格中使用:git checkout branch path

咨询the git checkout documentation,我们发现:

  

git checkout [-p|--patch] [<tree-ish>] [--] ...

     

当&lt; paths&gt;或--patchgit checkout不会切换分支。它从索引文件或命名的&lt; tree-ish&gt;更新工作树中的命名路径。 (通常是提交)。在这种情况下,-b--track选项毫无意义,并且给出其中任何一个都会导致错误。 &lt; tree-ish&gt;在更新工作树之前,参数可用于指定特定的树(即提交,标记或树)更新给定路径的索引

我把关键位放在粗体中:git首先从给定的“tree-ish”写入索引(如果不直接从索引中检查),然后从索引复制到工作树。这就是新文件上演的原因。要撤消暂存,您必须在同一路径上使用git reset

有一种方法可以使用git show将文件放入工作树而不通过索引复制它:

git show item1:utilities.xyzzy > utilities.xyzzy

git show命令将指定对象(在本例中为该文件)完全打印到标准输出,并重定向输出捕获文件。但请注意,这会绕过在正常结帐时修改文件内容的任何涂抹过滤器。

答案 1 :(得分:5)

正如我在“git reset vs git reset HEAD”中提到的git checkout <tree-ish> -- <paths>

git checkout <tree-ish> -- <pathspec>
  

当给出<paths>时,git checkout不会切换分支   它从索引文件或从命名的<tree-ish>(通常是提交)更新工作树中的命名路径。

由于索引是直接更新的,因此您可以准备好提交文件 因此Changes to be committed:的“git status”。