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

9 浏览
0 Comments

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

我有两个完全合并在一起的分支。然而,在合并完成后,我意识到一个文件在合并中出现了混乱(其他人进行了自动格式化,呃),更换到另一个分支的新版本,然后在将其带到我的分支后重新插入我的一行更改会更容易一些。那么,在Git中最简单的方法是什么?

0
0 Comments

问题的出现原因:用户想要从另一个分支中复制一个文件的版本到当前工作目录,但是文件的原始位置与当前工作目录不同。

解决方法:使用以下命令将文件从另一个分支复制到当前工作目录中:

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

使用git diff <other branch> <path to file>命令可以在检出之前比较文件的内容。

根据git版本2.21.0的"git show"手册页面,对于普通blob,它将显示纯文本内容,但不确定这是否总是有效。可能需要小心使用此方法来获取图像。

0
0 Comments

问题的原因是:用户想要将一个Git分支中的单个文件的某个版本复制到另一个分支中。

解决方法是使用`git restore`命令。具体操作如下:

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

这个方法比其他选项更好的原因是:

- 默认情况下,`git restore`仅修改工作目录中的文件。

- `git checkout otherbranch -- path/to/myfile.txt`将文件复制到工作目录(即磁盘上的文件),同时也复制到暂存区。这与手动复制文件并执行`git add`命令的效果相同。而`git restore`默认只修改工作目录。

- 为了获得与`git checkout otherbranch -- path/to/myfile.txt`相同的结果,可以使用以下命令:`git restore --source otherbranch --staged --worktree path/to/myfile.txt`

- 默认情况下,`git restore`会删除工作目录中在另一个分支中不存在的文件。

- 可以使用`git restore --source otherbranch path/to/dir`来恢复整个文件夹。可以使用类似的`git checkout`操作,但`git restore`默认会删除在`otherbranch`中不存在的文件。要获得与`git checkout`相同的行为,请使用`--overlay`选项。例如,如果`otherbranch`中的文件少于当前工作目录中的文件(这些文件是已跟踪的),则不使用`--overlay`选项,`git restore`将删除它们。但这是一个很好的默认行为,因为您很可能希望目录的状态与`otherbranch`相同,而不是“与`otherbranch`相同,但包含来自当前分支的额外文件”。

- 要获得与`git checkout otherbranch -- path/to/dir`相同的结果,可以使用以下命令:`git restore --source otherbranch --staged --worktree --overlay path/to/dir`

- `git restore`不使用shell重定向来创建文件(仅适用于PowerShell问题)。`git show otherbranch:path/to/myfile.txt > path/to/myfile.txt`使用标准的shell重定向。如果使用PowerShell,则可能会出现文本编码问题,或者如果是二进制文件,则可能导致文件损坏。`git restore`通过`git`可执行文件完成所有文件更改。

- 没有真正的`git restore`方式将文件从源分支复制到目标分支的新文件中。使用`git show`和shell重定向可以实现这一点(`git show otherbranch:path/to/file1.txt > path/to/file2.txt`),但出于上述原因,我希望避免使用shell重定向。

- `git restore`命令没有提供直接的方法将文件从源分支复制到目标分支的新文件中。

- 你应该位于源分支上运行这个命令,而不是目标分支。

- 需要注意的是,官方文档中指出,“此命令是实验性的,行为可能会发生变化。”但我认为不用太担心它会被删除或发生重大变化。`git restore`被建议在执行`git status`时使用,`git checkout`在Git教程中被替换为`git switch`(另一个“实验性”命令)。对我来说,几乎可以肯定`git restore`和`git switch`会一直存在,我认为Git开发人员在文档中对这些警告过于谨慎。

0
0 Comments

如何将一个Git分支中的某个文件的版本复制到另一个分支?

问题出现的原因:

想要将一个Git分支中的某个文件的版本复制到另一个分支,但不知道如何操作。

解决方法:

可以使用以下命令将文件从一个分支复制到另一个分支:

git checkout otherbranch myfile.txt

通用公式:

git checkout

git checkout /

一些注意事项(来自评论):

- 使用提交哈希,可以从任何提交中拉取文件

- 这适用于文件和目录

- 覆盖文件myfile.txtmydir

- 通配符不起作用,但相对路径可以使用

- 可以指定多个路径

另一种方法:

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

但这样做会覆盖主分支中的所有更改,这是问题的本意。

可能很明显,但需要使用完整的文件名... 通配符不起作用!

是否有一种方便的方法来从特定的提交中“复制”文件(而不是从分支中复制)?

尽管如此...这也是一种好方法:git show commit_id:path/to/file > path/to/file

通配符不起作用,但相对路径可以使用。不一定需要完整的文件名 🙂

remote: git checkout origin/otherbranch myfile.txt

通过“pull”,我假设你是指文件存在于远程分支中吗?git checkout / 应该可以使用(git checkout upstream/foo myfile.txt可以将myfile.txt从一个分叉存储库的源存储库拉到当前分支的本地)。

是否有一种方法告诉git不要将以这种方式显示的文件(们)暂存?我只是想更新我的工作副本,而不是我的索引。

对于未来的睡眠不足的人,不要忘记文件的完整路径:git checkout otherbranch path/to/myfile.txt

这个解决方案对于已经提交的文件非常有效,但是否有一种方法可以将工作文件复制到一个新的分支?困境当然是在切换分支之前,你被迫提交或隐藏文件。有时我发现自己在编写代码的过程中,看到将当前工作版本的文件放入不同的分支中的好处。

根据快速测试v2.3.3,只需指定相对路径就足够了。此外,假设目录相同,至少只需指定文件名。

执行checkout后,我是否需要显式取消暂存HEAD,以便可以重新添加并提交以包含在我的提交消息中?

使用通配符是有效的,只需将它们用''括起来,以免被shell解释。

这很好,但似乎对于已删除的文件不起作用。例如,假设你有分支ab,其中包含相同的文件夹foo/(以及相同的文件夹内容):如果你从分支a中的文件夹foo/中删除一个文件,然后在分支b上执行checkout a foo/(该分支上有相同的文件),不会应用任何更改:文件将保留在分支b上。

如果两个分支之间存在差异,这样做是否会在以后合并时产生冲突?

这是我正在寻找的替代方法。

0