【问题标题】:Renamed files inside git在 git 中重命名文件
【发布时间】:2015-08-15 00:00:06
【问题描述】:

我是团队中的新程序员。在我的第一天,我将这个重命名的文件放在一个阶段,准备好由 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

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

在我的工作目录中:

account/enter_rules.php

我找不到 enter_rules.old.php 文件。

似乎其他程序员已经从该文件创建了一个副本,将实际命名为 .old,进行了一些测试和新代码,然后暂存更改并忘记提交。比他手动删除了old.php

处理这种情况的最佳方法应该是什么?我想在开始处理它并进行自己的更改之前将 git status 明确。

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


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

  1. 我刚刚从文件enter_rules.php复制了一份(仅用于安全)
  2. 我“告诉” git(到 INDEX)文件名已更改。 $git commit -m "committing name changes"。此时 git 不知道 .old 已被删除。
  3. 然后我输入$git rm "account/enter_rules.old.php" 来解决这一行:Changes not staged for commit:。与我们使用$git add . 来“告诉” git 跟踪&lt;file&gt; 的方式相同,我们应该使用$git rm &lt;file&gt; 来“告诉” git 忘记这个&lt;file&gt;
  4. 然后我输入$git status 并收到绿色消息:deleted: account/enter_rules.old.php. 所以我应该告诉索引,.old 文件已被删除。我输入了$git commit -m "committing delete changes"
  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?他为什么要这么做?
  • 只是为了清楚。你不需要需要enter_rules.old.php,但你确实需要account/enter_rules.php,对吗?
  • 您好 Decave,我已更改信息。我应该粘贴所有 git 输出。似乎他已经从文件中创建了一个副本并命名为 .old.php 。比他对代码做了一些更改。也许它奏效了。然后他删除了 .old 文件并添加到舞台上。我不知道到底发生了什么。但是现在我遇到了你在输出 git 中看到的这种情况。
  • 是的。该系统现在正在运行。一切都是好的。但我需要清理工作目录才能开始我的工作。
  • 您的同事为什么在您的存储库中工作?您是否共享存储库的实例?

标签: git file-rename


【解决方案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

撤消他的更改。

对我来说听起来很奇怪的是,您为什么要在同事的存储库克隆中进行未提交的更改?

【讨论】:

  • 如我所说。我刚到队。所以我正在更换另一个程序员。我期待收到一切正常。只要清楚就可以开始编码了。
  • 看来他没有完成任务就离开了工作(意味着提交所有更改)
【解决方案2】:

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 进行确认。

【讨论】:

  • 最有可能的步骤 23 实际上只是将文件重命名回来,但没有告诉 git...
  • @umläute 是的,有道理
【解决方案3】:

虽然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 将该删除应用到存储库,删除它的操作必须包含在您的提交中。因为更改是跟踪的,但不是暂存的,所以您可以使用一个简单的命令来执行此操作(在下面的第 3 部分中描述)。

  1. 使用git add account/enter_rules.php 将文件添加到account/enter_rules.php
  2. 如果再次运行git statusenter_rules.old.php 应标记为删除,account/enter_rules.php 应暂存以提交。
  3. 运行 git commit --all 以提交所有分阶段的更改。

通过运行git commit --all,这也将暂存您的同事执行但他/她自己未提交的删除。

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

【讨论】:

    猜你喜欢
    • 2015-07-16
    • 2011-04-24
    • 2011-02-08
    • 2011-12-07
    • 2016-04-15
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多