簡體   English   中英

刪除git中的分支是否會從歷史記錄中刪除它?

[英]Does deleting a branch in git remove it from the history?

來自svn,剛剛開始熟悉git。

當在git中刪除分支時,它是否從歷史記錄中刪除了?

在svn中,您可以通過還原刪除操作(反向合並)輕松恢復分支。 與svn中的所有刪除一樣,分支永遠不會被刪除,它只是從當前樹中刪除。

如果實際上從git中的歷史記錄中刪除了分支,那么從該分支合並的更改會發生什么? 他們保留了嗎?

分支只是git中提交的指針。 在git中,每個提交都有一個完整的源代碼樹,它是一個與svn截然不同的結構,其中所有分支和標記(按照慣例)與特殊的“主干”一起位於存儲庫的單獨“文件夾”中。

如果在刪除分支之前將分支合並到另一個分支中,則在刪除第一個分支時,仍可以從另一個分支訪問所有提交。 他們保持原樣。

如果在沒有合並到另一個分支的情況下刪除分支,則該分支中的提交(直到從仍然可訪問的提交分叉的點)將不再可見。

提交仍將保留在存儲庫中,並且可以在刪除后立即恢復它們,但最終它們將被垃圾收集。

在Git中,分支只是提交的有向非循環圖(DAG)中提交的指針(引用)。 這意味着刪除分支僅刪除對提交的引用,這可能使DAG中的某些提交無法訪問,因此不可見。 但是,刪除分支上的所有提交仍然在存儲庫中,至少在無法訪問的提交被修剪之前(例如使用git gc )。

請注意, git branch -d會拒絕刪除分支,如果它不能確定刪除它不會留下無法提交的提交。 你需要使用更強大的git branch -D來強制刪除分支,如果它可能會留下無法訪問的提交。

另請注意,無法訪問的提交(如果存在)只是已刪除分支的最后一個提示與已合並到另一個現有分支,任何標記提交或分支點的提交之間的提交; 以較晚者為准。 例如,在以下情況中:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

只有提交'x'和'y'在刪除分支后才會無法訪問。

如果您在gc.reflogExpire期間內的已刪除分支上操作,默認為90天,您將在HEAD reflog中記錄已刪除分支的最后一個提示(請參閱git reflog show HEADgit log --oneline --walk-reflogs HEAD )。 您應該能夠使用HEAD reflog來恢復已刪除的指針。 另請注意,在這種情況下,僅在已刪除分支中的無法訪問提交將受到保護,以免在gc.reflogExpireUnreachable期間內進行修剪(刪除),默認情況下為30天。

如果你在HEAD的reflog中找不到剛剛刪除的分支的提示,你可以嘗試使用git fsck找到“無法訪問的提交<sha1>”,並檢查它們(通過git show <sha1>git log <sha1> )找到已刪除分支的提示。

獨立於如何找到已刪除分支的提示,您可以撤消刪除,或者更確切地說,使用重新創建剛剛刪除的分支

git branch <deleted-branch> <found-sha1-id>

但請注意,分支的reflog將丟失。


contrib/還有git-resurrect.sh腳本,它有助於找到具有給定名稱和復活(取消刪除)的分支提示的痕跡。

如果您擔心意外刪除的分支機構並且不再擁有您的倉庫的本地副本,那么像Gerrit這樣的企業Git服務器的擴展將檢測歷史記錄重寫和分支刪除,將在特殊參考下備份它們以便它們如果需要可以恢復,不會被垃圾收集修剪。 出於法律原因,Gerrit管理員仍可以根據需要刪除所選提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM