从另一个分支复制文件到Git仓库中而不将其暂存。

11

我找到了一个方法,可以将文件从一个分支整体复制到另一个分支:

请注意,如果您认为这个问题是这个的重复,请注意上面我链接的那个问题^^,下面的内容解释了我想要的不同功能。

$ git checkout directory/somefile.php feature-B

然而,这个解决方案已经分阶段地实现了这些更改:
$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

但是我不想添加所有的更改。我想要执行add -p并接受大部分但不是全部更改。我的需求是这样的:

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")

当然,我可以使用git reset来取消暂存的更改,但我希望一次性得到想要的结果,不需要第二步操作。
如何在不暂存文件的情况下从另一个分支复制文件?

1
@phd,你链接的这个问题就是我在我的问题开头链接的那个问题,而我的问题详细阐述了我想要与那个问题中的答案不同的功能。 - user151841
是的,它包含答案:git show(2次)。 - phd
1
@phd从来没有说过该方法会复制但不暂存提交。换句话说,它并没有回答我的问题;它将其作为“git copy…”的替代方案呈现出来,没有表明功能上的区别,因此用户会认为它的行为方式相同。如果有人通过谷歌搜索来寻找我的问题的答案,那么这些答案中就没有任何信息表明它符合他们所需的行为。 - user151841
@phd 从搜索结果中,具体是哪个问题包含了答案? - user151841
1
@phd 不是重复问题。这是一个更精确的问题和答案。 - worc
2个回答

14

你可以使用 git restore

git restore --source feature-B directory/somefile.php

我没有设置任何选项来指定它应该恢复文件的位置,默认情况下,它会恢复到工作目录(不带索引/暂存区域)。根据文档:

> -W
> --worktree
> -S
> --staged
> 
>     指定还原位置。如果未指定任何选项,则默认情况下将还原工作目录。指定--staged将只还原索引/暂存区域。同时指定两个选项将还原两者。

我在这篇回答中更详细地介绍了git restore和其他命令(git checkoutgit show)之间的区别。


11

你可以使用git show,然后将其重定向... 不过这样做并不是非常优雅。

git show feature-B:directory/somefile.php > directory/somefile.php

1
足够好,可以用来创建别名! - user151841
1
copy = ! "gitcopy() { git show $1:$2 > $2 ; }; gitcopy" -- 你需要创建一个bash函数作为别名,以便使用参数。 - user151841

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接