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