【问题标题】:How to remove deletions and renames from the history?如何从历史记录中删除删除和重命名?
【发布时间】:2016-01-31 20:35:30
【问题描述】:

在 git 中,如何删除文件删除和重命名,从分支中的某个提交开始,同时维护每个文件的更改历史(包括删除和重命名)?

我的用例是我建立了一个分支并从那里开始了一个新的分支,在那里我删除了一些文件并重命名了其他一些文件。然后我修改了剩余的(并且经常重命名的)文件(并且还添加了一些文件)。现在我想恢复到原始名称并恢复已删除的文件(仍然存在于公共基础上),同时保留所有内容的历史记录。我的最终目标是能够合并回原来的分支(所以without the renames and file deletions that I introduced)。

这可以吗?我想知道这有多容易,特别是因为重命名的文件被修改了(所以天真地删除重命名会切断原始文件和修改之间的历史链接,我想保留它)......

PS:分支分支后的变化是广泛的(至少在“清理”分支上)。

【问题讨论】:

  • Git 不跟踪文件名的历史记录。这是一个内容跟踪器;它在运行时根据增量计算文件名更改。
  • "因为重命名的文件被修改了,所以天真地删除重命名会切断原始文件和修改之间的历史链接" 这不一定是真的。即使文件修改,Git 也可以计算重命名。此外,如果您通过正常提交将文件重命名为原始名称,您的分支应该可以正常合并。

标签: git git-rewrite-history


【解决方案1】:

您不必重写历史来使合并工作。您可以恢复重命名并重新引入已删除的文件,然后提交并合并。使用git mv 重命名文件。可以使用git checkout <rev-which-deleted-the-file>^ -- <filename> 恢复已删除的文件。 See this answer for details.

可以使用git-log--diff-filter找到已删除和重命名的文件。

Git 不存储重命名,它会通过一些启发式方法即时计算它们以处理小的编辑。 git-loggit-diffgit-blame 都有像 -C-M 这样的选项来控制 Git 尝试查找复制和重命名(移动)文件的难度。所以历史的连续性不一定会因为分支中的重命名而丢失。


如果你真的想重写你的历史,首先使用git log --diff-filter=D master..branch找到所有删除文件的更改。然后您可以使用git rebase -i 更改这些提交并恢复已删除的文件。

重写有点棘手,因为您必须撤消重命名,然后在每次后续提交中重命名文件。这是git-filter-branch 的工作,它可以将相同的更改应用于一系列提交。

git filter-branch --tree-filter 'if [ -f new ]; mv new old; fi' master..branch

--tree-filter 在每次提交时运行 shell 命令,然后根据需要通过添加和删除文件来更改提交。

和以前一样,要查找您的重命名,请使用 git log --diff-filter=R master..branch

【讨论】:

  • 谢谢。我使用第一种方法(不重写历史记录):git mvgit checkout … 用于删除文件。然后我将每个分支合并到另一个分支中(并检查更新)。不过,不知何故,有很多更改的文件的历史从git log 消失了。但是,它确实出现在拉取请求中。有没有办法掌握这样的历史?
  • @EOL 我不确定你的意思。这作为一个新问题会更好。
  • 为了完整起见:我从master 重命名了一个文件:git mv old_name.txt new_name.txt,以便它与另一个分支(production)的名称匹配。合并production 后,我在合并git log new_name.txt 时没有看到new_name.txt 的完整更改历史。现在我意识到必须执行git log --follow new_name.txt 才能跟踪重命名和列表更改。感谢您的反馈意见。 :)
【解决方案2】:

您可以尝试在分支点为有问题的分支执行git rebase -i。为了安全起见,我首先在您要破坏的分支的尖端创建一个新分支,以防(哈!墨菲定律无情)出现问题。

如果更改非常广泛,有办法自动执行此操作,但那更不确定。详情请见Pro git book

【讨论】:

  • 我认为git rebase -i 的问题在于,如果您在一次提交中撤消重命名,任何更改重命名文件的提交都将导致冲突或导致出现文件副本。
  • @Schwern,“不要删除文件”是导致冲突的原因,如果稍后的提交重新创建它。你必须决定你想要什么,没有办法,
  • 谢谢。不幸的是,这些变化广泛的......
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多