2012-03-07 98 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僅對這兩個文件進行更改,或使用或其他工具以更復雜的方式編輯索引。 (索引是「要提交的更改」的列表。)

相關問題