2009-11-10 15 views
11

好吧,所以我在我的項目中做了一些改變,導致了一個巨大的混亂。我已經提交了更改,以便稍後再回到它,然後使用git checkout HEAD ^簽出前一個提交。現在,當我向我的項目提交時,它將命令行中的SHA-1顯示爲工作分支(而不是主分區)我該如何解決在git中檢查HEAD^

我不知道所有關於git的知識,但我猜測HEAD仍然指向我的破碎副本,因爲我正在切線並已解決問題。我如何將HEAD指向我正在從事的最新提交?

我猜它與底座有關,但我不是100%確定的。

謝謝。

回答

23

現在,當我正在提交到我的項目它顯示的命令行作爲工作的分支(而不是主)

這對SHA-1可能意味着你有一個「分離的頭」。分離的HEAD直接指向提交而不是指向分支(然後指向提交)。一個分離的頭像一個無名分支。

此狀態是由您的git checkout HEAD^命令引起的,因爲HEAD^引用了提交,而不是分支名稱。你可能想要做git reset --hard HEAD^ - 仍是活躍的分支 -to下降最近從承諾(也仍然存在磁盤上,並通過引用日誌可達直到它在引用日誌條目已過期) 。

如何將HEAD指向我正在從事的最新提交?

HEAD始終是您正在從事的提交,無論它是否已分離。

如果你的意思是「我怎麼可以指向最新提交我的工作?」,那是一樣的問:「我怎樣才能得到指向HEAD?」。答案是

git branch -f master HEAD 

(實際上,可以去掉HEAD,因爲它是默認值)。這會強制將主設備重置爲當前在HEAD處的提交。經由另一個分支或當前HEAD不可達上任何承諾今後將只能通過引用日誌訪問,並最終會被垃圾收集(該扔掉,從,任何在不在HEAD)。此後,您可能還想重新將HEAD重新附加到此更新後的主設備上。

git checkout master 

代替兩個命令的上面,則可以重新連接HEAD第一,然後復位與這兩個連續命令:

git checkout master   # reattach, commit at HEAD is now the unwanted commit 
git reset --hard [email protected]{1} # reset master to the commit at HEAD before the prior command 

[email protected]{1}符號被用於訪問在引用日誌條目。該示例僅意味着「之前的HEAD」(即,「在影響HEAD的最近操作之前在HEAD處的提交」)。

+1

感謝您的深入。 – 2009-11-10 08:21:16

3
git checkout HEAD 
git reset HEAD^ 

這將擦除最近的提交。確認它與svn log一起使用。

我注意到你標記了這個git-svn。這隻會在你還沒有把這個搞砸的工作推給svn時才起作用。如果你有,你就需要應用的搞砸犯這樣的反向合併:

$ git log 
commit 30480f327040f812cb2afffdd1cdd374bf26fe83 
Author: you 
Date: today 

    messed up commit 

$ git revert 30480f327040f812cb2afffdd1cdd374bf26fe83 

其中30480f327040f812cb2afffdd1cdd374bf26fe83是的搞砸提交的哈希值。

1

我想你要找的是什麼git reset

git checkout HEAD 
git reset --hard HEAD^ 

這將取當前HEAD之前的「主人」回一個版本。目前你正在使用的稱爲「分離頭部」,因爲它沒有與之相關的符號名稱。

相關問題