如何挑选仅对一个文件而不是整个提交进行的更改

问题描述 投票:0回答:11

我需要将一个分支中引入的更改应用到另一个分支。 我可以使用樱桃采摘来做到这一点。但是,就我而言,我想应用仅与一个文件相关的更改,我不需要挑选整个提交。 如何做到这一点?

git
11个回答
173
投票

根据您想要实现的目标,您有不同的选择:

如果您希望文件内容与目标分支上的内容相同,可以使用

git checkout <branch> -- <filename>
。然而,这不会“挑选”单次提交中发生的更改,而只是获取所述文件的结果状态。因此,如果您在提交中添加了一行,但之前的提交更改较多,并且您只想添加该行而不进行其他更改,那么签出不是您想要的。

否则,如果您想将提交中引入的补丁仅应用到单个文件,您有多个选择。您可以运行

git cherry-pick -n
,即不提交它,编辑提交(例如使用
git reset -- .
重置所有文件,并仅使用
git add <filename>
添加您实际想要更改的文件)。或者您可以为文件创建差异并应用差异:

git diff <branch>^..<branch> -- <filename> | git apply

30
投票

创建一个

patch file
并应用它。

git diff branchname -- filename > patchfile
git apply patchfile

编辑:

由于您需要从提交中获取更改,因此请像这样创建补丁:

git show sha1 -- filename > patchfile

13
投票

另一个方便的做法是在本地获取补丁,然后使用:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 

但这并不是一个挑剔的事情。


13
投票

Git 已准备好一切 :)

只需使用

git checkout <sha> <path-to-file>


7
投票
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

如果您希望将另一个分支中的单个文件复制到当前工作分支

,则此方法有效

7
投票

使用

-n
选项来避免提交。

git cherry-pick -n <target>

现在通过选择所需的文件进行提交。

git commit -- file1 file2

5
投票

你可以尝试这样做:

git show COMMIT_ID -- path/to/specific-file | git apply

例如:

git show 3feaf20 -- app/views/home/index.html | git apply

2
投票

我倾向于使用

git ls-tree

就做:

git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'

这将打印与您的 grep 匹配的所有文件名,并给出提交中文件的 SHA1 密钥。

Git show 也可以用于分支外部的文件。 使用 shell 中的

>
将输出通过管道传输到文件中,即可得到所需的结果。


1
投票

这就是您要找的:

git checkout target-branch sha1 path/to/file

sha1 是可选的


0
投票

添加 Sailesh 的答案,因为我没有足够的声誉来发表评论:与

git cherry-pick
不同,
git apply
要么完全成功,要么完全失败。如果您希望能够手动解决冲突,请使用
git apply --3way


-12
投票
git reset HEAD~1

将文件移至预提交阶段

git stash

从记忆中删除

现在你的分支非常干净(恢复到之前的提交)

© www.soinside.com 2019 - 2024. All rights reserved.