2016-02-26 53 views
1

在我嘗試進行rebase之前,我知道我的功能分支(GL18)的提交是什麼(b7104e0),效果很差。我在Eclipse中查看Git Reflog,它多次列出提交b7104e0。我想將GL18的頭重新設置回b7104e0。在重新引用日誌中選擇哪個b7104e0提交是否重要,或者它們都一樣?使用reflog取消git rebase時,選擇哪個提交會有影響嗎?

+0

如果你的rebase失敗了,你也可以運行'git rebase --abort'而不是'git reset'來達到舊狀態。 – morxa

回答

2

使用提交消息,提交作者,提交日期,樹形哈希和所有父提交散列來計算git散列,有關詳細信息,請參閱this blog post on the anatomy of a Git commit

這意味着您看到的使用相同散列的每次提交都是完全相同的提交。你可以使用任何這些。實際上,如果您重置,則重置爲提交哈希:git reset --hard b7104e0

2

無,但只是爲了清楚起見,因爲標題和正文乍看問不同的問題,我們拼出來這裏明確:

  • 的「真名」的任何承諾(或實際上git中的任何存儲庫對象)都是它的SHA-1,在這種情況下,它以b7104e0開頭(但繼續追加33個字符)。這個真實名稱唯一標識了該對象。在這種情況下,只要更短的版本保持唯一,它可以縮寫爲更短的。

  • 所有其他名稱,如分支名稱,標籤,很特別REF HEAD,稍微特別少(但仍特別)ORIG_HEADMERGE_HEADCHERRY_PICK_HEAD,等等,和(終於 :-)) reflog條目,如[email protected]{3}branchname@{1},只是表示「真名」SHA-1 ID的方法。當使用git checkout或重寫引用名稱的命令時,對此規則有一個特殊的豁免,但通常情況下,名稱或reflog條目僅解析爲該ID。許多名稱可能會解析爲單個ID,或者可能只有一個名稱解析爲ID,但名稱通常會解析爲ID。

一旦你有了正確的ID,這不要緊,你如何得到它。


只是爲了完整性:很明顯,如果我們要變化目標名稱的SHA-1的ID,例如,移動分公司或寫一個新值CHERRY_PICK_HEAD,我們需要這個名字,而不是它的當前ID。我們需要一個名字的另一個地方是當使用間接(「符號」)引用,例如HEAD名稱ref: refs/heads/master,以便您將on branch master作爲git status將它放置。

我們還有一個特殊情況,名稱不能解析爲任何SHA-1 ID,這就是「尚未出生的分支」,這在最新版本庫中最常見,沒有任何提交:in這種情況下,您在分支master上,但refs/heads/master無法解析爲提交ID,因爲還沒有提交。如果您使用git checkout --orphan創建一個尚未指向任何SHA-1(它將在下一次提交中獲取其初始SHA-1)的新分支,則此特殊情況可以稍後再發生。在這兩個古怪的情況下,HEAD參考存在,但名稱分支字面上不存在存在(還)。

相關問題