【发布时间】:2015-09-01 17:01:53
【问题描述】:
我有一个分支,很久以前我不小心将其他人的更改合并到其中,现在在拉取请求中显示了数百个不属于我的文件。
我想创建一个单独的分支,我想在这几十个提交中挑选对我自己的文件的更改,以便我的新拉取请求只包含我的更改。
我发现了如何挑选提交,以及如何从一个特定提交中挑选文件,但是我如何从一系列提交中挑选几个文件?
是否有更简单的解决方案?
【问题讨论】:
标签: git cherry-pick
我有一个分支,很久以前我不小心将其他人的更改合并到其中,现在在拉取请求中显示了数百个不属于我的文件。
我想创建一个单独的分支,我想在这几十个提交中挑选对我自己的文件的更改,以便我的新拉取请求只包含我的更改。
我发现了如何挑选提交,以及如何从一个特定提交中挑选文件,但是我如何从一系列提交中挑选几个文件?
是否有更简单的解决方案?
【问题讨论】:
标签: git cherry-pick
所以如果我理解正确的话,你首先要做的是挑选范围,即git cherry-pick --no-commit。然后,使用git reset 删除对索引的更改。然后git add 你要提交的所有文件,git commit 这些文件,最后git checkout . 以摆脱其他本地更改。这将导致包含您的更改的单个扁平化提交。
现在,如果您想要做的只是包含那些已触及特定文件集的提交,您可能需要查看this page 底部给出的使用git rev-list 的示例将涉及特定文件规范的所有提交的列表提供给cherry-pick。因此,例如,如果您的所有文件都在 mydir 中,那么 like git rev-list --reverse master -- mydir | git cherry-pick --stdin 应该这样做。
【讨论】:
如果有一个你曾经合并的提交,你可以避免,然后使用git rebase 跳过合并提交。
-----origin/foo-------A----------------------------B----C----D
(where you merged in) (commits on top of that)
AFTER REBASE
-----origin/foo-------B'----C'----D'
(your commits, skipping A)
如果您的更改(上面的B、C 和D)实际上触及了您要避免的文件,则需要使用git filter-branch 来重写这些提交并避免更改这些提交文件。使用--tree-filter 命令,您可以重置每棵树不想触碰的部分。
【讨论】: