繁体   English   中英

如何在分支中重命名文件,合并并在Git中具有历史记录的两个文件?

[英]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(或其他分支)分叉,并且之后未与父分支合并新更改的简单情况下,这将完美地工作-从历史记录中完全删除旧文件名。

(如果确实发生了这种合并,那么该命令仍然是安全的-最终结果是相同的-但它可能并没有像您希望的那样清除您的历史记录。)

  1. 选择要在其中更改文件名的分支。签出该分支。 我假设你选的比较older

     $ git checkout older 
  2. 现在,我们需要找到older及其父级的合并基础 这是older与父代分离的地方,从而创造了新的独立历史。 通常,您可以通过浏览git loggitk轻松找到它,但是我们可以使用简单的命令找到它。 (我假设masterolder的父母。)

     $ git merge-base older master 914b05d90e1de0ff9f89370810888c7f192d65cc $ git tag base 914b05d 

    在我的存储库中, git merge-base输出提交ID 914b05d 我们使用标签base标记提交,以方便参考。

  3. 现在,在base上进行交互式变base

     $ git rebase --interactive base 
  4. 在显示的编辑器窗口中,确认它列出了较早的每次提交,从与父级分开的时间到最新的提交。

    • 移至第一次提交。
    • 将单词pick更改为edit 我们将很快编辑此提交以重命名文件。
    • 现在,向下浏览其他提交。 任何在提交消息中提及名称file都需要重新措词。 pick更改为reword以使自己有机会为相应的提交消息重新措辞。
    • 保存文件并退出。
  5. 现在,您的变基将开始! git将签出第一个提交并停止,等待您修改提交。 在这里,我们可以移动文件,然后重新开始变基。

      $ git mv file file-from-older $ git rebase --continue 

    git会使用所做的更改来修改提交,然后打开编辑器以允许您重新编写提交。 更改对file任何引用,改为说“ file-from-older 保存文件并退出。

  6. 您标记为reword任何提交也将出现在编辑器中。 以相同的方式编辑它们。 (如果您错过了标记要重新措词的提交,则可以重新设置基准)

  7. 重新设置完成后,使用git loggitk检查结果。 观察一下

    • 您的工作树中不存在原始文件名
    • 或在您的历史中
    • older仍从其父公司的同一地点分支,即base

    如果其中任何一个都不正确,则出了点问题(可能是拼写错误),我们需要撤消提交。 我们可以使用git reset --hard older@{1}轻松地做到这一点,它可以git reset --hard older@{1}的状态重置为刚发生基准更改之前的状态。 然后,您可以重复进行变基操作,并找出出错的地方。

  8. 既然您已经验证了改基成功,那么您就可以将更改合并到master或任何位置。 如果要在两个分支中重命名file ,只需对newer分支重复该过程即可。

  9. 最后,您可以将分支合并到master

     $ git checkout master $ git merge older newer 

    除非有任何(不相关的)冲突,否则这应该顺利进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM