git-mv显示文件已删除

时间:2012-03-07 23:25:12

标签: git

当我运行git-mv file1 file2时,我将文件从file1移至file2,正如我所料。但有时候,我的git status给了我'奇怪'的输出。

当我运行git-mv f1 f2,然后git status

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    f1 -> f2

这就是我所期待的。其他时候,在我提交f2之后,我得到:

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage) 
#
#   deleted:    f1

这通常在我提交新文件后发生。我不知道为什么它发生 - 似乎是随机发生的(因为我通常得到renamed: f1->f2消息,就像我期待的那样)。

我想知道为什么我有时会收到消息说我在运行git mv后删除了文件,以及我已经完成了哪些步骤 - 我只是尝试重现,得到了renamed:..;但是10分钟前,我在{em> 之前约10分钟deleted:...收到一个git-mv个文件。这让我很困惑。

3 个答案:

答案 0 :(得分:4)

听起来您将f1重命名为f2,但只提交f2而不是删除f1。如果您使用git mv f1 f2但是然后输入git commit f2,则可能会发生这种情况,如果您输入mv f1 f2然后执行git add .; git commit

之类的操作,就会发生这种情况

答案 1 :(得分:2)

在git中移动文件真的只是删除旧的+创建一个新文件。

“重命名:..:”输出只是一种启发式方法,显然git有时会出错,即使它很明显。

答案 2 :(得分:2)

Git不像Subversion那样跟踪文件历史记录中的移动:历史记录只存储内容,git log&amp; c。查看文件内容以及更改内容以推断更改是否为重命名。因此,git mv f1 f2相当于:

mv f1 f2
git rm f1
git add f2

就Git而言,删除f1和添加f2是完全不同的变化,所以如果你现在做git commit f2,你只提交f2的添加,并且f1的删除仍然是未提交的变更。要确保提交两个更改,请执行git commit不带任何参数提交所有内容,或git commit f1 f2仅提交对这两个文件的更改,或使用git commit --interactive或其他工具进行编辑索引以更复杂的方式。 ( index 是“要提交的更改”的列表。)