这类似于this question on merging,除了我试图将分支A重新分支到分支B上,而不是将分支B合并到分支A中。
在单个文件中使用git checkout
和git commit
的组合可以在分支A中实现类似的效果,但这对于历史记录与rebase没有相同的效果。
是否可以仅重新绑定特定文件,以便所有未来的rebase都不需要触摸这些文件,而不重新定义所有文件的历史记录?
答案 0 :(得分:5)
排序。您可以进行交互式rebase,当在文本编辑器中显示rebase脚本时,将所有操作从“pick”更改为“edit”,然后保存并退出。重新定位现在将开始,并且在每次提交之后它将停止,使您可以:
删除您不感兴趣的文件中的更改。
这可以通过
之类的东西来实现git reset <reference_commit> -- pathname
其中<reference_commit>
是提交的名称,其中包含您不希望修改基础的文件。
运行git commit --amend -C HEAD
。
git rebase --continue
。任何时候git rebase
应用下一个正在重新生成的提交,您可能会遇到冲突,而不仅仅是编辑已记录的提交的机会。这与正常编辑没有太大差别 - 您只需要更加关注索引的当前状态。
在任何情况下,你想做什么,对我来说都很陌生:通常,变基是“在更新的基础(上游代码)之上转发本地更改”意味着你的更改是否无法与更新的上游一起工作(以及为什么你还要保留一些文件不被更新?)在变基中没有任何意义 - 仅仅因为你不会变基础,你会做其他事情,这可能会在以后咬你。
答案 1 :(得分:1)
Git确实可以在整个存储库中工作,而不是在每个文件中工作,因此您不会在git中找到简单的方法
答案 2 :(得分:0)
您可以使用“ git checkout [文件路径]”将文件恢复为最后提交的文件。例如
git checkout /views/index.html
答案 3 :(得分:0)
尝试git revert
。搜索引入了不需要的更改的特定提交哈希,并将其用作参数。 git revert
然后将生成一个撤消那些确切更改的补丁。
请注意,这意味着您的提交量应该很小(不修改大量文件)。这样,存储库中对其他文件的更新将不会受到影响,只有那些处理该特定提交的更新才会被更改。