如何只选择一个文件的更改,而不是整个提交

时间:2013-04-17 19:09:19

标签: git

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

10 个答案:

答案 0 :(得分:117)

根据您想要达到的目标,您有不同的选择:

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

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

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

答案 1 :(得分:19)

创建patch file并应用它。

git diff branchname -- filename > patchfile
git apply patchfile

编辑:

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

git show sha1 -- filename > patchfile

答案 2 :(得分:9)

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

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

虽然这不是一个挑选。但

答案 3 :(得分:6)

Git准备好了一切:)

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

答案 4 :(得分:3)

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

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

,则此方法有效

答案 5 :(得分:2)

您可以尝试这样做:

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

例如:

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

答案 6 :(得分:1)

这就是你在找什么:

git checkout target-branch sha1 path/to/file

sha1是可选的

答案 7 :(得分: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中的>将输出通过管道输出到文件中,可以得到您正在寻找的结果。

答案 8 :(得分:0)

使用 -n 选项避免提交。

git cherry-pick -n <target>

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

git commit -- file1 file2

答案 9 :(得分:-8)

git reset HEAD~1

将文件移至预提交阶段

git stash

从内存中删除

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