如何将单个文件的版本从一个git分支复制到另一个?


943

我有两个完全合并在一起的分支。

但是,合并完成后,我意识到一个文件已被合并弄乱了(其他人进行了自动格式化,gah),在另一个分支中更改为新版本会更容易,并且然后将其更改插入分支后重新插入我的一行更改。

那么git中最简单的方法是什么?


3
请注意,在接受的答案中,第一个解决方案会暂缓更改,而第二个解决方案则不会。stackoverflow.com/a/56045704/151841
user151841 '19

Answers:


1672

从您希望文件结束的分支运行此命令:

git checkout otherbranch myfile.txt

通用公式:

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

一些注释(摘自评论):

  • 使用提交哈希,您可以从任何提交中提取文件
  • 这适用于文件和目录
  • 覆盖文件myfile.txtmydir
  • 通配符不起作用,但是相对路径起作用
  • 可以指定多个路径

替代:

git show commit_id:path/to/file > path/to/file

13
是的,会的。但这是问题的意图。
Ikke 2010年

37
可能很明显,但是您需要使用完整的文件名...通配符不起作用!
克里斯·哈特

6
虽然..这也是一种不错的方法:git show commit_id:path / to / file> path / to / file
milushov 2013年

14
远程:git checkout origin / otherbranch myfile.txt
Roman Rhrn Nesterov

6
使用通配符确实有效,您只需要将它们包装起来,''这样它们就不会被外壳解释。
威克托·克萨伊科夫斯基

82

我最终在类似的搜索中遇到了这个问题。在我的情况下,我希望将文件从另一个分支提取到当前工作目录中,该目录与文件的原始位置不同。

git show TREEISH:path/to/file >path/to/local/file

18
“ git show”的目的是将数据以可读格式输出到终端,但不能保证精确匹配文件的内容。相同之处在于,最好整体复制一个Word文档,而不要尝试将其内容复制并粘贴到另一个文档中。
Gonen 2014年

我只想查看它,以便可以将内容与当前分支进行比较(检查一些代码)。我想与使用vim这虽然...语法高亮,等等
isaaclw

3
在结帐之前比较内容,git diff <other branch> <path to file>效果很好。
兰德尔(Randall)

2
@Gonen:从git版本2.21.0开始,“ git show”手册页显示“对于普通blob,它显示普通内容”。我不确定这是否意味着我们永远都很好。我有点想以这种方式获取图像...
hibbelig

52

关于使用checkout命令呢?

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

8
如果文件在两个分支上都不存在,则note merge(第二个命令)将无法工作
simpleuser 2014年

嗯 我没有diffstat。那是差异工具的特定版本,因为我从未听说过(我应该切换到它吗?):D
dudewad 2015年

git diff支持一个--stat与diffstat基本相同的参数。
Hlovdal

我必须让两个分支都在本地签出才能正常工作。
UnitasBrooks

18

1)确保您在需要该文件副本的分支中。例如:我想要在主目录中的子分支文件,所以您需要签出或应在主目录中git checkout master

2)现在,您只需要从子分支签入特定文件,即可将其签到master,

git checkout sub_branch file_path/my_file.ext

这里sub_branch表示您要复制该文件的位置,后跟文件名。


非常方便,解释得很好。
Abk

15

按照madlep的回答,您还可以只复制另一个具有目录blob的分支的目录。

git checkout other-branch app/**

至于操作员的问题,如果您仅在其中更改了一个文件,则可以正常工作^ _ ^


1
请注意,两个分支都需要首先被正确拉出,或者origin/other-branch用于引用repo分支。基础知识,但咬我。(答案很好-无需编辑)
akauppi 2015年

7

我会用git restore(自git 2.23起可用)

git restore --source otherbranch path/to/myfile.txt


为什么它比其他选择更好?

git checkout otherbranch -- path/to/myfile.txt-它将文件复制到工作目录,但也复制到暂存区(与手动复制此文件并git add在其上执行该文件的效果类似)。git restore不会碰到暂存区(除非通过--staged选项告诉它)。

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt使用标准的shell重定向。如果使用Powershell,则文本编码可能会出现问题,或者如果文件为二进制文件,则可能会损坏文件。随着git restore不断变化的文件被完成的所有git可执行文件。

另一个优点是您可以使用以下方法还原整个文件夹:

git restore --source otherbranch path/to

或与,git restore --overlay --source otherbranch path/to如果您要避免删除文件。例如,如果otherbranch当前目录中的文件少于当前工作目录中的文件(并且跟踪了这些文件),而没有--overlay选项,git restore则将其删除。但这是很好的默认行为,您很可能希望目录的状态与中的相同otherbranch,而不是“相同,但当前分支中有其他文件”


好答案。有没有git restore办法将文件从源分支复制到目标分支上的文件?使用git show可以使用shell重定向(git show otherbranch:path/to/file1.txt > path/to/file2.txt)做到这一点,但是由于您提到的原因,我想避免shell重定向。
AdamaalAdama

1
@AdmiralAdama不是真的。而且我认为获取它的机会不大git restore(但谁知道;)。重定向问题基本上是Powershell的问题,不确定是否有任何其他的外壳有问题。我通常回到“ git bash”甚至“ cmd”,在这里我需要使用“ git showwith redirection”命令。或者使用GitExtensions之类的GUI,您可以在其中浏览提交的文件树,然后在任何文件上单击“另存为”。
Mariusz Pawelski

啊,我明白了。我不使用Powershell,所以shell重定向对我来说可能是np。谢谢(你的)信息。
AdamaalAdama

3

请注意,在接受的答案中,第一个选项会从另一个分支暂存整个文件(如git add ...已执行),第二个选项只会导致复制文件,但不会暂存更改(就像您已经只是手动编辑文件,并且有很大的不同)。

Git从另一个分支复制文件而不进行暂存

分阶段进行的变更(例如git add filename)

$ 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

未完成的更改(未上演或未执行):

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

$ 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")

我得到“ feature-B不是文件”,首先出现分支名称,关于此->“> directory / somefile.php”是否可能会更改文件的编码?
Tiago Oliveira de Freitas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.