122

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

4

10 回答 10

155

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

如果您希望文件的内容与目标分支上的内容相同,可以使用git checkout <branch> -- <filename>. 然而,这不会“挑选”在单个提交中发生的更改,而只是获取所述文件的结果状态。因此,如果您在提交中添加了一行,但之前的提交更改了更多,并且您只想添加该行而不进行其他更改,那么结帐不是您想要的。

否则,如果您只想将提交中引入的补丁应用于单个文件,则有多种选择。您可以运行git cherry-pick -n,即不提交它,编辑提交(例如使用重置所有文件git reset -- .并仅添加您实际想要更改的文件git add <filename>)。或者您可以为文件创建差异并应用差异然后:

git diff <branch>^..<branch> -- <filename> | git apply
于 2013-04-17T19:25:31.297 回答
25

创建一个patch file并应用它。

git diff branchname -- filename > patchfile
git apply patchfile

编辑:

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

git show sha1 -- filename > patchfile
于 2013-04-17T19:21:17.777 回答
11

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

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

不过,这不是采摘樱桃。

于 2013-04-17T19:17:46.510 回答
11

Git 已准备就绪 :)

只需使用 git checkout <sha> <path-to-file>

于 2015-12-07T04:37:57.577 回答
6
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

如果您希望将另一个分支中的单个文件复制到当前工作分支,则此方法有效

于 2017-05-16T09:05:53.043 回答
3

您可以尝试这样做:

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

例如:

git show 3feaf20 -- app/views/home/index.html | git apply
于 2020-05-25T18:45:59.387 回答
1

这就是你要找的:

git checkout target-branch sha1 path/to/file

sha1 是可选的

于 2013-04-17T19:18:15.960 回答
1

我倾向于做的是使用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 将输出通过管道传输到文件中,可以得到您正在寻找的结果。

于 2017-03-06T10:35:40.090 回答
0

使用-n选项来避免提交。

git cherry-pick -n <target>

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

git commit -- file1 file2
于 2021-07-01T01:45:40.663 回答
-11
git reset HEAD~1

将文件移动到预提交阶段

git stash

从内存中删除

现在你的分支很干净(恢复到以前的提交)

于 2016-07-22T18:56:52.317 回答