我需要将一个分支引入的更改应用到另一个分支上。我可以使用cherry-pick来完成。但是,在我的情况下,我只想应用与一个文件相关的更改,而不需要挑选整个提交。 如何做到这一点?
我需要将一个分支引入的更改应用到另一个分支上。我可以使用cherry-pick来完成。但是,在我的情况下,我只想应用与一个文件相关的更改,而不需要挑选整个提交。 如何做到这一点?
根据您想要实现的目标,您有不同的选项:
如果您希望文件内容与目标分支上的内容相同,则可以使用 git checkout <branch> -- <filename>
。但这不会“挑选”单个提交中发生的更改,而是仅采用该文件的结果状态。因此,如果您在提交中添加了一行,但先前的提交进行了更多更改,并且您只想添加该行而没有其他更改,则检出不是您想要的。
否则,如果您想要将提交中引入的补丁应用于单个文件,则有多种选项。您可以运行 git cherry-pick -n
,即不进行提交,编辑提交(例如使用 git reset --.
重置所有文件并仅使用 git add <filename>
添加要更改的文件)。或者,您可以为该文件创建差异并然后应用差异:
git diff <branch>^..<branch> -- <filename> | git apply
创建一个 补丁文件
并应用它。
git diff branchname -- filename > patchfile
git apply patchfile
编辑:
既然您需要使用一个提交中的更改,那么可以像这样创建补丁:
git show sha1 -- filename > patchfile
git checkout
是这个问题的正确解决方法。这两个选项都是不必要复杂的。 - Rein Henrichscheckout
将无法解决问题,因为它可能涉及其他不需要的先前更改,并且可能不包含在当前分支中进行的更改。 - Saileshgit ls-tree -r
在这方面很有帮助。但结果将是实际的文件内容而不是补丁。 - white_geckogit diff 分支名 -- 文件名 | git apply -
- Eric M.Git 已经准备就绪 :)
只需使用 git checkout <sha> <path-to-file>
即可。
另一个有用的操作是本地获取补丁,然后使用:
git checkout {<name_of_branch>, commit's SHA} <path to the file>
那并不是挑刺。
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension
使用-n
选项来避免提交。
git cherry-pick -n <target>
现在通过选择所需的文件来提交更改。
git commit -- file1 file2
git show COMMIT_ID -- path/to/specific-file | git apply
例如:
git show 3feaf20 -- app/views/home/index.html | git apply
我通常会使用 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中将输出导管到文件中,即可获得所需的结果。
git checkout target-branch sha1 path/to/file
sha1是可选的
git reset HEAD~1
将文件移动到预提交阶段
git stash
从内存中删除
现在你的分支非常干净(恢复到之前的提交)