2012-03-07 63 views
3

当我运行git-mv file1 file2时,我将文件从file1移动到file2,正如我所料。但有时候,我的git status给了我“奇怪”的输出。git-mv显示文件已删除

当我运行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分钟前,我得到了一个deleted:...上的一个文件我想git-mv编约前10分钟。这让我很困惑。

+0

当您查看重命名相关文件(例如在gitk中)的提交时,您是否看到实际上只是提交了一个新命名的文件?除了做出一系列提交(重置,非平凡分支等)之外,你还做了什么吗? – Cascabel 2012-03-07 23:29:32

回答

4

这听起来像你改名为f1f2,但只承诺增加f2而不是删除f1。这可能发生,如果你使用git mv f1 f2但然后键入git commit f2,或者如果你输入mv f1 f2,然后像做git add .; git commit

2

移动文件中的git真的只是删除旧+创建一个新的文件,它可能发生。

“renamed:..:”输出仅仅是一种启发式,显然git有时会错误,即使它很明显。

+0

谢谢多米尼克。所以这是一种启发式的猜测......这实际上对我所看到的更有意义。在提交之间,我都重命名(使用git mv),然后用较新的版本覆盖了一堆jar文件。对于某些文件,git status显示删除和添加,对于其他文件,它显示重命名。甚至当你使用git mv时,也许这只是git rm + git add的一种方便,尽管你专门说过git mv,但它仍然可以猜测......但使用Subversion转换看起来很奇怪。 – 2013-10-02 21:38:16

2

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

mv f1 f2 
git rm f1 
git add f2 

去除的F1和另外F2的是完全不同的变化尽可能的Git而言,所以如果你现在做的git commit f2,你只提交另外f2的,和f1的去除仍然是一个未经承诺的改变。为确保您同时提交两项更改,请执行git commit(无参数提交所有内容)或git commit f1 f2仅对这两个文件进行更改,或使用或其他工具以更复杂的方式编辑索引。 (索引是“要提交的更改”的列表。)

相关问题