2014-11-25 73 views
9
A-B-C Master 
\D-E Feature 

git checkout feature執行rebase命令後 - 從feature分支>git rebase master我所有的提交消失了,所以我有A-B-C提交。 feature分行在重新綁定後看起來像master。另外重新綁定不會給出任何錯誤,但它不會顯示'提交重播'消息,我認爲它通常會在重新綁定期間顯示。你知道可能導致這種行爲嗎?混帳後失蹤提交重訂

當我發現我的提交消失後,我運行以下命令在git歷史記錄中查找缺少的代碼:git rev-list --all | xargs git grep expression該命令返回一個提交哈希,但是當我運行git log(因爲rebase)時,這個哈希不存在。如果我做git reset --hard missing-hash我可以再次看到原始(正確)feature代碼。運行rebase master再次重現相同的問題。

編輯:我剛剛發現我有一些額外提交類似WIP on commit-messageindex on commit-message當我做git reset --hard missing-hash可以將其與git stash/git stash apply

+1

ahh,試試這個:http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html – unixmiah 2014-11-25 02:50:49

+0

我知道如何讓我的文件恢復。另外'合併主'也適用。我想知道什麼可能會導致rebase命令的這種行爲 – jonasnas 2014-11-25 03:00:37

+0

這些提交D和E在內容上與提交的主內容有些相同嗎? (在這種情況下,他們在rebase期間將被跳過) – VonC 2014-11-25 07:05:13

回答

5

正是這樣是如何變基工作在同一頁上有關。在你的例子中,git基本上試圖在C之後添加D和E。 D & E上的rebase提交不會是原始文件,而是它們將是具有新哈希值的克隆。原始文件仍然存在,但只是沒有引用它們的分支而搖晃(垃圾回收最終將會刪除它們)。衍合後,你可以通過看git log ORIG_HEAD

但是看到衍合的提交的「原始」版本中,異常可以發生在這個過程中。 Git會智能地跳過已經在「基礎」(本例中爲主)的任何提交 - 這可能發生在分支合併,恢復,然後被重新分離。

它也會跳過任何提交,如果它發現提交被添加到基地完全匹配,在他們的內容 - 提交已經在歷史 - 即使哈希是不同的 - 這可能發生,如果一個分支是合併,rebase,然後再合併。

我懷疑的幾種情況之一。

  1. 您的功能分支可能已經合併爲主。
  2. 您的功能分支已經與主人匹配。

1)git的分支--contains功能

這將列出包含在他們的歷史的特性分支的所有分支。如果主人在該列表中,那麼您的分支已經合併。在這兒無事可做。

的Theres幾個原因,這可能似乎並不正確,雖然。

原因之一是,你可能不會看到在當前主代碼更改。這可能有幾個原因。如果該分支先前已經合併到master中,然後恢復,那麼提交已經存在,但是否定 - 即使這些已還原的提交不會返回 - 您需要還原實際的還原提交。

2)git checkout feature; git rebase --keep-empty feature

--keep-empty會強制git保持提交,即使它們不包含任何「新」內容或更改。這不是一種解決方法或解決方法,但是如果您在執行此操作後在歷史記錄中看到這些提交 - 那麼這意味着您的提交不會丟失。他們故意跳過。你可以自己決定,如果你想保留空的。

如果是這樣的話,那麼我會看看這個分支是否過去合併過。例如,它可能已被合併爲不同分支的一部分。也許鮑伯認爲他需要你在bobs_feature分支中的feature分支 - 他的分支在你的分支之前掌握了它,現在你的分支基本上是不相關的。另一種情況可能是它在過去被併入了主人,然後被還原了。這裏的答案是恢復恢復提交本身 - 有點像點擊撤消後重做提交。

+0

感謝您解釋可能的原因。我遵循的工作流程是爲每個傑拉票創建功能分支。然後定期將其他票(我自己或其他人)合併到主人中。如果我有一些正在進行的更改,我會做git stash-> rebase master-> git stash apply.Im非常確定我做了什麼,這不是我認爲我在做的事情。也許是把它應用在錯誤的分支或者其他的(如果我新的,我不會問)。寫道這看起來很可能:'如果該分支先前已經合併到主,然後恢復,那麼提交已經存在,但否定' – jonasnas 2015-01-07 11:30:30

+0

而且在這個功能上,我確實從主人那裏做了幾次'rebase'。 – jonasnas 2015-01-07 11:31:47

+0

我會嘗試通過git history/reflogs來檢查我是否能夠弄清楚你提到的是否發生過。但它包含了太多的分支和提交,所以很難/耗時。至少現在我知道可能發生了什麼,而不是在下次看到這種情況時一無所知(這不是第一次發生在我身上) – jonasnas 2015-01-07 11:38:23