2011-08-23 61 views
4

我該如何解決這個「雞蛋&」的情況?git mv和Eclipse中的重構

我決定在Eclipse中重命名一個Java類(比如說,從one.javatwo.java)。 Eclipse重構讓我能夠順利完成任務。

然後,我去了Git和類型:

git mv myproj/src/com/ate/lib/one.java myproj/src/com/ate/lib/two.java 

,並收到錯誤:

fatal: bad source, source=myproj/src/com/ate/lib/one.java, destination=myproj/src/com/ate/lib/two.java 

我明白爲什麼會這樣,但如果我不git mv以前重構時,Eclipse將不是這樣...

什麼是一個好方法解決這個問題?

回答

3

git mv只是一種方便的方法。 git does not "track" renames(也就是說,它可以檢測到它們,但它們不會像添加或刪除一樣被記錄爲操作)。要暫存並提交您的重構:

git rm myproj/src/com/ate/lib/one.java 
git add myproj/src/com/ate/lib/two.java 
git commit 

git rm告訴git的階段性消除索引文件。儘管您已經在工作目錄中「移除」了文件(通過移動它),但您還沒有告訴git您想要對此刪除進行版本化。 rmgit rm之間的區別在於第一個在工作目錄上工作,第二個在索引上工作(更改爲由git進行版本控制)。

git add只是在新的位置添加文件內容。

編輯:

我以前有git rm --cached,出於個人習慣,但顯然git rm如果文件不在工作目錄中存在不抱怨。當您想要在版本控制中刪除文件時,git rm --cached仍然有用,但將該文件保留在工作目錄中。

+0

你不需要'--cached',實際上 - 如果文件不存在於工作樹中,'git rm'不會抱怨。 –

+0

@shelhamer謝謝。我明白'git add'部分,但爲什麼當'git status'已經報告'deleted:myproj/src/com/ate/lib/one.java'時,我需要運行'git rm'? – ateiob

+0

@Mark Longair,感謝您的提示!我想我習慣於使用 - 緩存,所以自動放入。 – shelhamer