2012-02-21 95 views
2

我仍然試圖理解rebase和改寫Git歷史的影響。設想一下github上的一個倉庫R,它有一年的寶貴的源代碼歷史。假設它是這個星球上唯一的副本。不可恢復的git推?

提交者可以通過克隆存儲庫,進行一些更改並將其推回來,這會導致該存儲庫中的永久性丟失,從而執行某些操作?我不知道,一些奇怪的重新組合,刪除,推動?如果是這樣,是否有任何這樣的序列會立即不可逆轉(而不是在垃圾回收後的一個月左右發生)?

回答

2

默認情況下,服務器拒絕非快進推送。不過,從git-push man page,你可以找到強制服務器接受一個潛在的破壞性推送操作的手段:

-f,--force

通常情況下,命令拒絕更新遠程ref不是本地 ref的祖先,用於覆蓋它。此標誌禁用檢查。 這可能會導致遠程 存儲庫丟失提交;小心使用它。

正如警告所說,這可能會導致遠程失去一個或多個提交。具體而言,如果目標分支的提交無法從另一分支的HEAD進行,可能會發生這種情況。

例如,以下情形可能會導致服務器丟失commit:

git clone ... 
edit ... 
git add . 
git commit --amend -m "These changes overwrite origin/master's HEAD." 
git push -f origin master 

但是,如果提交你只是試圖覆蓋碰巧被標記或從另一個分支的HEAD訪問,提交意志不會丟失。

+0

那麼想必你可能會覆蓋使用此方法,在整個歷史上每一個承諾。這是否違反了版本控制的原則之一? – 2012-02-22 12:47:25

+2

@SteveBennett:是的,你可以在技術上覆蓋整個歷史。它*在技術上*打破了源代碼控制,但在實踐中「永遠不會」遇到任何問題,因爲克隆存儲庫的任何人都可以使用其克隆來恢復歷史記錄。另外,使用Git的首選方式是使用pull/merge請求來允許查看提交,因此只有一個人可以訪問任何給定的存儲庫。 – 2012-02-22 17:03:05

+0

這兩點非常合理。 – 2012-02-24 05:57:57

1

如果您強制推送到存儲庫,那麼AndréCaron解釋說,某些提交可能無法訪問。 Github不允許你訪問版本庫(因爲這不是一個標準的git版本庫,因爲這不是你的業務)。所以在這種情況下,你實際上會丟失信息。

但是,如果您是此存儲庫的有效管理員,則可以在某種程度上通過瀏覽引用日誌來恢復強制推送,然後使分支恢復生機。

請注意,您的本地存儲庫(您從中強制推送的存儲庫)應該包含將要被丟失的提交,然後您應該能夠根據需要重新生成它們。

+0

好的 - 但我還是有點不清楚。在我的場景中,世界上只有一個版本庫,它在Github上。所以,是的,一個不好的推動力可能會不可挽回地失去提交(因爲訪問reflog的問題)? – 2012-02-22 12:42:48

+0

從技術上講,在你的場景中,你有兩個存儲庫,一個放在Github上,另一個放在你推送的存儲庫上。 但事實是,您的本地存儲庫可能不包括Github存儲庫中的分支狀態。所以是的,你會在這個非常奇怪的(但是可能的)狀態下放棄提交。 – 2012-02-22 13:57:37

1

是的,有些操作會永久破壞你的歷史,例如:

git push repo-name +master 

將覆蓋主回購(回購名稱)與當地分支失去主人的歷史。

但垃圾桶你歷史上最常見的方式是通過交互式衍合:

git rebase -i 6bd80e12 

...只有做到這一點上還沒有被推開的外部存儲庫的提交。如果其他人根據您將要刪除的提交進行工作,可能會發生很多衝突。只要不與其他人共享,就不要重寫您的歷史記錄。

我建議多讀:

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

http://progit.org/book/ch6-4.html

http://book.git-scm.com/4_interactive_rebasing.html

+0

是的,有趣。與弗雷德和安德烈所提出的情景不同,這種情況可能會發生錯誤。鼓勵你重寫歷史,鼓勵你分享變化 - 你必須避免將這兩件事結合起來。 – 2012-02-24 06:01:17

+0

@SteveBennett:即使「錯誤地」發生了這種情況(更像是某人誤解了重新綁定的實際效果),如果遠程端無法執行快速合併,它將拒絕接受推送。有很多方法可以銷燬/覆蓋提交。由於所有的操作都是在本地完成的,所以一切都是安全的。這是'git push',可能會真正抹去一些東西。你仍然需要'git push -f'來實際失去歷史。 – 2012-02-24 06:09:25