Answers:
从您希望文件结束的分支运行此命令:
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.txt
并mydir
替代:
git show commit_id:path/to/file > path/to/file
''
这样它们就不会被外壳解释。
我最终在类似的搜索中遇到了这个问题。在我的情况下,我希望将文件从另一个分支提取到当前工作目录中,该目录与文件的原始位置不同。答:
git show TREEISH:path/to/file >path/to/local/file
git diff <other branch> <path to file>
效果很好。
关于使用checkout命令呢?
git diff --stat "$branch"
git checkout --merge "$branch" "$file"
git diff --stat "$branch"
git diff
支持一个--stat
与diffstat基本相同的参数。
1)确保您在需要该文件副本的分支中。例如:我想要在主目录中的子分支文件,所以您需要签出或应在主目录中git checkout master
2)现在,您只需要从子分支签入特定文件,即可将其签到master,
git checkout sub_branch file_path/my_file.ext
这里sub_branch
表示您要复制该文件的位置,后跟文件名。
按照madlep的回答,您还可以只复制另一个具有目录blob的分支的目录。
git checkout other-branch app/**
至于操作员的问题,如果您仅在其中更改了一个文件,则可以正常工作^ _ ^
origin/other-branch
用于引用repo分支。基础知识,但咬我。(答案很好-无需编辑)
我会用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重定向。
git restore
(但谁知道;)。重定向问题基本上是Powershell的问题,不确定是否有任何其他的外壳有问题。我通常回到“ git bash”甚至“ cmd”,在这里我需要使用“ git show
with redirection”命令。或者使用GitExtensions之类的GUI,您可以在其中浏览提交的文件树,然后在任何文件上单击“另存为”。
请注意,在接受的答案中,第一个选项会从另一个分支暂存整个文件(如git add ...
已执行),第二个选项只会导致复制文件,但不会暂存更改(就像您已经只是手动编辑文件,并且有很大的不同)。
分阶段进行的变更(例如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")