修复被视为已删除的文件,而不是在推送的提交中重命名的文件

时间:2018-11-03 11:27:16

标签: git visual-studio github

我知道,在移动文件时,您需要git add“新”文件和git rm“旧”文件,以便git可以将其视为已重命名而不是删除...但是您如何解决未正确完成的(推送)提交?

我直接在Visual Studio中进行了提交,但没有引起足够的重视-它重命名了多个文件,它们现在显示好像已删除旧文件并添加了新文件,而不是重命名了旧文件。我只有在多次提交之后才意识到这一点。有办法解决吗?

(还有一个额外的问题-为什么Visual Studio无法正确处理此问题,而又如何在下次使用它而又不必使用单独的终端命令的情况下呢?)

2 个答案:

答案 0 :(得分:0)

(在执行此操作之前,请先复制库,否则可能会破坏某些内容)

在新分支(NB)中签出当前代码。在重命名之前重置为提交。 再次使用git mv重命名所有内容。提交这个。 然后,您便可以从NB开始在当前分支的顶部进行选择/重播提交。

如果您这样做,则由于重写了历史记录,因此您必须将代码强制推送到服务器。这意味着拉出您的代码的任何人都会遇到错误,并且必须重新拖动/会发生冲突。

答案 1 :(得分:0)

  

我知道,在移动文件时,您需要git添加“新”文件,并git rm“旧”文件

您可以通过一个命令来实现 user

  

我只有在多次提交之后才意识到这一点。有办法解决吗?

是的

现在让我们详细解释什么和如何。


如何重命名git文件

git如何存储文件?

首先,让我们了解git mv是如何存储文件名的,以及为什么新手用户会看到“问题”。

  • git不在乎存储内容时的文件名。
  • 文件名与内容分开存储。
  • 每次执行git git都会计算内容的git add并将其存储在SHA-1文件夹中
  • SHA-1的前2 个十六进制数字是文件夹名称,其余38个是此文件夹中的文件名称
  • 文件内容是.git/objects中的blob
  • git的内容如下:

    .git/object/<SHA-1>

enter image description here

文件名在哪里?

  • Git存储完整路径,而不是复数个文件名。
  • “文件夹”结构存储在“树”对象中。
  • 文件名存储在其他位置,在这里解释太久。简而言之git将文件列表及其blob<single white space><Content length><null><content>存储在名为SHA-1

  • 的对象中
  • Git在提交之前会生成文件列表(称为快照)。

  • 要查看文件的treeSHA-1

enter image description here

  • 提交更改后,git会将数据写入树对象

enter image description here

enter image description here


现在我们已经简要说明了git存储文件的方式,我们可以解释出了什么问题。

由于 git ls-tree -l <commit id> 不在乎您的文件名,它们仅用于将内容写入本地文件系统,因此它们存储在其他位置。

“移动” 文件git会将其视为新文件,结果是删除“旧”文件并“查找”新文件

enter image description here

要重命名文件,您必须使用git命令来更新内部git mv存储并将文件移动到新位置 enter image description here