我需要将一个分支中引入的更改应用于另一个分支。 我可以用樱桃夹来做。但是,在我的情况下,我想应用只与一个文件相关的更改,我不需要选择整个提交。 怎么做?
另一个方便的做法是在本地获取补丁,然后使用:
git checkout {<name_of_branch>, commit's SHA} <path to the file>
这可不是什么挑三拣四。
这就是你要找的:
git checkout target-branch sha1 path/to/file
Sha1是可选的
创建一个 patch file并应用它。
patch file
git diff branchname -- filename > patchfile git apply patchfile
编辑:
因为您需要从提交中获取更改,所以创建这样的补丁:
git show sha1 -- filename > patchfile
基于你想要实现的目标,你有不同的选择:
如果希望文件的内容与目标分支上的内容相同,可以使用 git checkout <branch> -- <filename>。然而,这不会“挑选”单次提交中发生的更改,而只是获取该文件的结果状态。因此,如果您在提交中添加了一行,但是以前的提交更改更多,并且您只想在没有其他更改的情况下添加该行,那么结帐不是您想要的。
git checkout <branch> -- <filename>
否则,如果您希望将提交中引入的补丁仅应用于单个文件,则有多个选项。您可以运行 git cherry-pick -n,即不提交它,编辑提交(例如,使用 git reset -- .重置所有文件,只添加您实际想要使用 git add <filename>更改的文件)。或者你可以为文件创建 diff,然后应用 diff:
git cherry-pick -n
git reset -- .
git add <filename>
git diff <branch>^..<branch> -- <filename> | git apply
Git 把一切都准备好了:)
用就是了 git checkout <sha> <path-to-file>
git checkout <sha> <path-to-file>
git reset HEAD~1
将文件移动到提前提交阶段
git stash
从记忆中删除
现在您的分支非常干净(恢复到以前的提交)
我倾向于使用 git ls-tree
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 the_branch_with_the_change the/path/to/the/file/you/want.extension
如果您希望将来自另一个分支的单个文件复制到当前工作分支,则此方法可以工作
你可以试试这样做:
git show COMMIT_ID -- path/to/specific-file | git apply
例如:
git show 3feaf20 -- app/views/home/index.html | git apply
使用 -n选项避免提交。
-n
git cherry-pick -n <target>
现在通过选择所需的文件进行提交。
git commit -- file1 file2