在git中重命名文件

时间:2015-06-01 13:34:27

标签: git file-rename

我是团队中的新程序员。在我的第一天,我将这个重命名的文件放在一个舞台上,准备由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状态清楚。

我找到了这篇文章,但我不确定我是否应该或可以在我的情况下做出承诺。 Handling file renames in git

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

  1. 我刚刚从文件enter_rules.php
  2. 制作了一份副本(仅用于保险)
  3. 我&#34;告诉&#34;到git(到INDEX)文件名已被更改。 $git commit -m "committing name changes"。此时git不知道.old已被删除。
  4. 然后我输入$git rm "account/enter_rules.old.php"来解决问题:未提交的更改提交:。我们以同样的方式使用$git add .来&#34;告诉&#34;要跟踪<file>,我们应该使用$git rm <file>来&#34;告诉&#34; git忘了这个<file>
  5. 然后我输入了$git status,我收到了绿色信息:已删除:account / enter_rules.old.php。所以我应该告诉索引,.old文件已删除。我输入了$git commit -m "committing delete changes"
  6. 现在git知道 enter_rules.php 已重命名为 enter_rules.old.php ,然后 enter_rules.old.php 被删除(已删除) )。
  7. 然后我解决了最后一行(未经跟踪的文件 :)。我刚刚告诉git创建了一个新文件并调用 enter_rules.php 。我添加并承诺应该如此。
  8. 所有的建议都帮助我解决了这个问题,所以我会尽量做到公平,并且会给那些不那么重要的支票。

3 个答案:

答案 0 :(得分:1)

虽然git表示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

这意味着该文件已经消失,并且为了git将该删除应用于存储库,删除它的操作必须包含在您的提交中。由于跟踪了更改但未暂存,您可以使用简单的命令执行此操作(如下面第3部分所述)。

  1. 使用account/enter_rules.php
  2. git add account/enter_rules.php中添加文件
  3. 如果您再次运行git status,则应将enter_rules.old.php标记为删除,并且应暂定account/enter_rules.php以提交。
  4. 运行git commit --all以提交所有暂存的更改。
  5. 通过运行git commit --all,这也将删除您的同事已执行但未自行提交的删除。

    听起来你的同事使用git mv来重命名文件,然后将其删除但没有进行删除。

答案 1 :(得分:1)

Git无法处理工作文件夹中的文件。相反,如果工作在一个叫做“索引”的东西上。这意味着您可以更改文件,将它们放入索引中(“很快,我想...”)并使索引永久保留git commit

这里的主要优点是您可以使用单个命令收集索引中的许多更改(例如,当您进行了多次更改并希望将它们放入单独的提交中时)。此过程称为“暂存”。例如,git add适用于索引。

您的案件发生了什么:

  1. 您重命名了该文件(可能在您的IDE中),并告诉Git“暂存”更改。 Git在索引中记得这一点。
  2. 您在未告知Git
  3. 的情况下删除了该文件
  4. 你从某处获得了account/enter_rules.php的副本,并将其复制到你的工作文件夹中,也没有告诉Git。
  5. 对于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以确保。

答案 2 :(得分: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

取消他的更改。

对我来说有什么奇怪的声音,为什么你要使用未提交的更改来处理同事的存储库克隆?