关于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
为什么这样做?当我将一个文件从另一个分支拉到我当前的分支时,我怎么能把它简单地作为一个修改后的文件,我将在准备好后暂存?
答案 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;或
--patch
,git 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
”。