关于Git工作流程,我们创建了一个我们用于特定sprint的master的分支,并且该sprint中的每个工作项都从中分支出来.如此有效,分支/合并流程将是:
master | \ | sprint42________ | | \ \ | | item1 item2 | | ___/ / | |/ / | | _________/ | |/ | _____/ |/ |
现在,在这个流程中,我发现我对其中一个文件所做的更改item1
也需要完成item2
(想想我添加了一个方便功能的实用程序文件).
因此,基于此问题的已接受答案,我检查了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..." to unstage) modified: utilities.xyzzy
为什么这样做?当我将一个文件从另一个分支拉到我当前的分支时,如何将它简单地作为一个修改后的文件,我将在准备好后暂存?
旁注:当我阅读原始主题行"Why is file pulled from ..."
(现已修复)时,我以为你是指git pull
脚本.我认为,值得强调的是,你在git checkout
这里特指的是,用于以下形式:.git checkout branch path
咨询的git checkout
文档,我们发现这样的:
git checkout [-p|--patch] [
] [--] ... 当
或 --patch
给出时,git checkout
不切换分支.它从索引文件或命名的(通常是提交)更新工作树中的命名路径.在这种情况下, -b
和--track
选项毫无意义,并且给出其中任何一个都会导致错误.参数可用于指定特定的树(即提交,标记或树),以在更新工作树之前更新给定路径的索引.
我把关键位放在粗体中:git首先从给定的"tree-ish"写入索引(如果不直接从索引中检出),然后从索引复制到工作树.这就是新文件上演的原因.要撤消分段,必须git reset
在同一路径上使用.
有一种方法可以将文件放入工作树而不通过索引复制它,使用git show
:
git show item1:utilities.xyzzy > utilities.xyzzy
该git show
命令将指定对象(在本例中为该文件)完全打印到标准输出,并重定向输出捕获文件.但请注意,这会绕过任何在正常结帐时修改文件内容的涂抹过滤器.
正如我在" git reset vs git reset HEAD "中提到的那样git checkout
.
git checkout--
当
给出,git的结帐不切换分支.
它从索引文件或命名(最常见的提交)更新工作树中的命名路径.
由于索引是直接更新的,因此您可以准备好提交文件.
因此,"的Changes to be committed:
" git status
.