git 中的重命名文件

Renamed files inside git

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

前两行没问题。我知道发生了什么。但是对于最后一个 renamed:,我不确定应该做什么。系统运行良好。

在我的工作目录中:

account/enter_rules.php

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

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

处理这种情况的最佳方法应该是什么?我想先清除 git 状态,然后再开始处理它并进行我自己的更改。

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


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

  1. 我刚刚从文件 enter_rules.php
  2. 中复制了一份(只是为了安全起见)
  3. I "told" to git (to the INDEX) 文件名已更改。 $git commit -m "committing name changes"。此时 git 不知道 .old 已被删除。
  4. 然后我输入 $git rm "account/enter_rules.old.php" 来解决行:Changes not staged for commit: 。同理我们用$git add .到"tell"git去追踪一个<file>,我们应该用$git rm <file>到"tell"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。我按原样添加并承诺。

所有的建议都帮助我解决了这个问题,所以我会尽量公平,并会把支票给谁的点数少。

虽然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 重命名文件,然后将其删除,但没有进行删除操作。

Git 不适用于您的工作文件夹中的文件。相反,如果在名为 "index" 的东西上工作。这意味着您可以更改文件,将它们放入索引 ("soon, I'd like to ...") 并使用 git commit.

使索引永久化

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

你的情况是:

  1. 您重命名了文件(可能在您的 IDE 中)并告诉 Git 到 "stage" 更改。 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 确认一下。

我似乎很清楚这里发生了什么:

初始状态下有两个文件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

撤消他的更改。

我觉得奇怪的是,你为什么要使用同事的未提交更改的存储库克隆?