![](/img/trans.png)
[英]How to rename a remote branch in Git so that to have a proper history tree
[英]How to rename file in branch, merge and have two files with history in Git?
我有一个带有以下分支的git存储库:
older:
file (with, say, 10 commits)
newer:
file (10 commits from "older" plus 5 new commits)
分支“较新”从分支“较旧”分支出来。
我想将两个分支合并到master,将两个版本的“ file”作为两个不同的文件,并且我想保留两个的历史记录:
master:
file-as-seen-in-older (10 commits)
file-as-seen-in-newer (15 commits)
这是使用git rebase
更改文件名的可靠而安全的方法。 在newer
和/或older
分支与master(或其他分支)分叉,并且之后未与父分支合并新更改的简单情况下,这将完美地工作-从历史记录中完全删除旧文件名。
(如果确实发生了这种合并,那么该命令仍然是安全的-最终结果是相同的-但它可能并没有像您希望的那样清除您的历史记录。)
选择要在其中更改文件名的分支。签出该分支。 我假设你选的比较older
。
$ git checkout older
现在,我们需要找到older
及其父级的合并基础 。 这是older
与父代分离的地方,从而创造了新的独立历史。 通常,您可以通过浏览git log
或gitk
轻松找到它,但是我们可以使用简单的命令找到它。 (我假设master
是older
的父母。)
$ git merge-base older master 914b05d90e1de0ff9f89370810888c7f192d65cc $ git tag base 914b05d
在我的存储库中, git merge-base
输出提交ID 914b05d
。 我们使用标签base
标记提交,以方便参考。
现在,在base
上进行交互式变base
$ git rebase --interactive base
在显示的编辑器窗口中,确认它列出了较早的每次提交,从与父级分开的时间到最新的提交。
pick
更改为edit
。 我们将很快编辑此提交以重命名文件。 file
都需要重新措词。 将pick
更改为reword
以使自己有机会为相应的提交消息重新措辞。 现在,您的变基将开始! git将签出第一个提交并停止,等待您修改提交。 在这里,我们可以移动文件,然后重新开始变基。
$ git mv file file-from-older $ git rebase --continue
git会使用所做的更改来修改提交,然后打开编辑器以允许您重新编写提交。 更改对file
任何引用,改为说“ file-from-older
。 保存文件并退出。
您标记为reword
任何提交也将出现在编辑器中。 以相同的方式编辑它们。 (如果您错过了标记要重新措词的提交,则可以重新设置基准)
重新设置完成后,使用git log
或gitk
检查结果。 观察一下
older
仍从其父公司的同一地点分支,即base
。 如果其中任何一个都不正确,则出了点问题(可能是拼写错误),我们需要撤消提交。 我们可以使用git reset --hard older@{1}
轻松地做到这一点,它可以git reset --hard older@{1}
的状态重置为刚发生基准更改之前的状态。 然后,您可以重复进行变基操作,并找出出错的地方。
既然您已经验证了改基成功,那么您就可以将更改合并到master
或任何位置。 如果要在两个分支中重命名file
,只需对newer
分支重复该过程即可。
最后,您可以将分支合并到master
:
$ git checkout master $ git merge older newer
除非有任何(不相关的)冲突,否则这应该顺利进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.