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

时间:2008-11-21 01:50:37

标签: git git-branch branching-and-merging

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

然而,在完成合并之后,我意识到合并已经搞砸了一个文件(其他人做了自动格式化,gah),而在另一个文件中更改为新版本会更容易分支,然后重新插入我的一行更改后将其带入我的分支。

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

7 个答案:

答案 0 :(得分:1480)

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

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

答案 1 :(得分:74)

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

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

答案 2 :(得分:47)

使用checkout命令怎么样:

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

答案 3 :(得分:36)

我会使用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,则文本编码可能会出现问题,或者如果文件为binary,则可能会损坏文件。使用git restore更改文件是通过git可执行文件来完成的。

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

git restore --source otherbranch path/to

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

答案 4 :(得分:13)

按照madlep的回答,您也可以使用目录blob从另一个分支复制一个目录。

git checkout other-branch app/**

关于操作系统的问题,如果您只更改了一个文件,那么这将正常工作^ _ ^

答案 5 :(得分:10)

1)确保您在需要该文件副本的分支机构中。 例如:我想在master中使用子分支文件,因此您需要结帐或应该在主人git checkout master

2)现在单独检查您希望从子分支到主服务器的特定文件,

git checkout sub_branch file_path/my_file.ext

此处sub_branch表示您拥有该文件的位置,后跟您需要复制的文件名。

答案 6 :(得分:0)

请注意,在已接受的答案中,第一个选项从另一个分支(例如执行了git add ...转移整个文件,而第二个选项仅导致复制文件,但不会暂存更改(就像您刚刚手动编辑文件并且有显着差异一样)。

Git copy file from another branch without staging it

已进行的更改(例如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")