在git中重命名文件

7

我是一个新加入团队的程序员。在我的第一天,我在一个阶段中看到了这个被重命名的文件,准备通过git提交:

 $ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   reports/SQLS.rar
        renamed:    account/enter_rules.php -> enter_rules.old.php

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)       
        deleted:    account/enter_rules.old.php

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        account/enter_rules.php

对于前两行,我没有问题。我知道正在发生什么。但是对于最后一行重命名:,我不确定应该做什么。系统运行良好。

在工作目录中,我有:

account/enter_rules.php

我找不到enter_rules.old.php文件。
似乎其他程序员从该文件创建了一个副本,将实际文件命名为.old,并进行了一些测试和新代码,然后暂存了更改并忘记提交。然后他手动删除了old.php。
在处理这种情况时,应采取什么最好的方法?我想在开始工作并进行自己的更改之前清除git状态。
我发现了这篇文章,但我不确定在我的情况下是否应该或能够提交。处理git中的文件重命名

阅读了所有建议后,对我帮助很大。这是我所做的:

  1. 我只是为了安全起见从文件enter_rules.php中复制了一份。
  2. 我“告诉”git(INDEX)文件名已更改。 $ git commit -m“提交名称更改”。此时,git不知道.old已被删除。
  3. 然后我键入$ git rm“account / enter_rules.old.php”以解决行:Changes not staged for commit:。与使用$ git add。相同的方式“告诉”git跟踪<file>,我们应该使用$ git rm <file> “告诉”git忘记这个<file>
  4. 然后我键入$ git status,我收到绿色消息:deleted: account/enter_rules.old.php。所以我应该告诉索引,.old文件已被删除。我键入$ git commit -m“提交删除更改”
  5. 现在git知道enter_rules.php已重命名为enter_rules.old.php,然后删除了enter_rules.old.php
  6. 然后我解决了最后一行(Untracked files:)。我告诉git创建了一个新文件,并将其命名为enter_rules.php。我添加并提交了它。

所有的建议都帮助我解决了问题,所以我会尽量公正,将支票给予那些点数较少的人。


这很奇怪。根据你所说的和 git status 显示的内容,看起来你的同事运行了 git mv enter_rules.php enter_rules.old.php 然后将该文件复制回 enter_rules.php?他为什么要这样做呢? - Byte Lab
只是为了明确起见。你不需要 enter_rules.old.php,但你确实需要 account/enter_rules.php,对吗? - Byte Lab
嗨Decave,我已经更改了信息。我应该粘贴所有的git输出。看起来他创建了一个文件的副本并将其命名为.old.php。然后他对代码进行了一些更改。也许它起作用了。然后他删除了.old文件并添加到了阶段。我不知道确切发生了什么。但现在我有了你在git输出中看到的这种情况。 - IgorAlves
系统现在正常工作。一切都很好。但是我需要清理工作目录才能开始工作。 - IgorAlves
你的同事为什么在你的代码库里工作?你们共享一个代码库实例吗? - Edward Thomson
3个回答

1

虽然gitenter_rules.old.php被重命名了,但它也表示它已经被删除了:

Changes not staged for commit:   (use "git add/rm <file>..." to update
what will be committed)   (use "git checkout -- <file>..." to discard
changes in working directory)       
         deleted:    account/enter_rules.old.php

这意味着该文件已经不存在了,为了使 git 应用到仓库中的删除操作,需要将其添加到你的提交中。因为更改是被跟踪但未暂存的,所以可以使用简单的命令(在第三部分中描述)执行此操作。
  1. 使用 git add account/enter_rules.php 添加 account/enter_rules.php 文件。
  2. 如果再次运行 git status,则应将 enter_rules.old.php 标记为删除,而 account/enter_rules.php 将被暂存以待提交。
  3. 运行 git commit --all 提交所有已暂存的更改。
通过运行 git commit --all,这也会暂存你的同事执行但未提交的删除操作。
听起来你的同事使用了 git mv 重命名了文件,然后删除了它但没有暂存删除操作。

1
Git不会直接作用于你的工作文件夹中的文件。相反,它作用于一种叫做“索引”的东西上。这意味着你可以更改文件,将它们放入索引(“很快,我想…”),然后使用git commit使索引变为永久性的。
这里的主要优点是,你可以使用单独的命令收集索引中的多个更改(例如,当你进行了几个更改并希望将它们放入单独的提交时)。这个过程被称为“暂存”。例如,git add作用于索引。
在你的情况下发生了以下情况:
1. 你重命名了该文件(可能在IDE中),并告诉Git“暂存”了这个更改。Git在索引中记住了这个更改。 2. 你删除了该文件,但没有告诉Git。 3. 你从某个地方获取了account/enter_rules.php的副本,并将其复制到了你的工作文件夹中,同样没有告诉Git。
对于Git来说,现在的情况是,它知道曾经有一个名为enter_rules.old.php的文件,你想要提交它。你可以这样做,因为Git记住了足够的信息来实际完成这个操作。
同时,你的工作区已经发生了很大变化。暂存文件已经消失,出现了一个新的副本。由于 Git 无法读取你的思想,它不会试图弄清楚这可能意味着什么。它只列出事实。
现在开始整理:
要让 Git 忘记对 enter_rules.old.php 的重命名,使用 git reset HEAD enter_rules.old.php 现在,它应该记住了 account/enter_rules.php 已被跟踪。如果你更改了此文件,它将显示为已更改。运行 git status 来确保。

1
最有可能的步骤是第2步和第3步只是将文件重新命名,但没有告诉git... - umläute
1
@umläute 哦,是的,那很有道理。 - Aaron Digulla

1

我觉得这里发生了什么很清楚:

最初状态下有两个文件account/enter_rules.phpaccount/enter_rules.old.php

你的同事一定做了类似于这样的事情:

git rm account/enter_rules.old.php
git mv account/enter_rules.php account/enter_rule.old.php

然后编辑了一个新的account/enter_rules.php文件,并将其保留在未暂存状态。

如果您对更改满意,只需

git add account/enter_rules.php
git commit

否则
rm account/enter_rules.php
git reset HEAD

我觉得奇怪的是,为什么你要在同事的存储库克隆品上工作,并且该克隆品有未提交的更改,而你又想撤销他所做的更改。


正如我所说,我刚加入这个团队。因此,我正在替换另一位程序员。我原本期望一切都很顺利,可以开始编码了。 - IgorAlves
他似乎在没有完成任务(即提交所有更改)的情况下离开了工作。 - IgorAlves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接