如何樱桃只select只有一个文件的变化,而不是整个提交

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

根据你想达到的目标你有不同的select:

如果你想让文件的内容与目标分支上的内容相同,你可以使用git checkout <branch> -- <filename> 。 然而,这将不会“挑选”在单个提交中发生的变化,而只是取得所述文件的结果状态。 所以,如果你在一个提交中添加了一行,但以前的提交更改了,而你只想添加那一行而没有其他更改,那么结帐不是你想要的。

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

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

创build一个patch file并应用它。

 git diff branchname -- filename > patchfile git apply patchfile 

编辑:

由于您需要从提交中进行更改,因此请创build如下所示的修补程序:

 git show sha1 -- filename > patchfile 

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

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

这不是一个挑选樱桃。

Git已经准备好了一切:)

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

评分最高的答案指出: git checkout <branch> -- <filename> 。 但是,只有当前分支中存在该文件时,这种方法才有效。

这是你在找什么:

 git checkout target-branch sha1 path/to/file 

sha1是可选的

我倾向于使用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显示也可以在分支之外的文件上使用。 使用>从您的shellpipe道输出到文件给你你正在寻找的结果。

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

如果你想从另一个分支的单个文件复制到当前工作分支,这个工程

 git reset HEAD~1 

将文件移动到预先提交阶段

 git stash 

从内存中删除

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