Ich komme von svn und fange gerade an, mich mit git vertraut zu machen.
Wenn ein Zweig in Git gelöscht wird, wird er aus dem Verlauf entfernt?
In svn können Sie einen Zweig einfach wiederherstellen, indem Sie den Löschvorgang zurücksetzen (Reverse Merge). Wie alle Löschungen in svn wird der Zweig nie wirklich gelöscht, sondern nur aus dem aktuellen Baum entfernt.
Was passiert mit den Änderungen, die aus diesem Zweig zusammengeführt wurden, wenn der Zweig tatsächlich aus dem Verlauf in git gelöscht wird? Werden sie behalten?
quelle
In Git sind Zweige nur Zeiger (Verweise) auf Commits in einem gerichteten azyklischen Graphen (DAG) von Commits. Dies bedeutet, dass beim Löschen eines Zweigs nur Verweise auf Commits entfernt werden, wodurch einige Commits in der DAG möglicherweise nicht erreichbar und somit unsichtbar werden. Alle Commits, die sich in einem gelöschten Zweig befanden, befinden sich jedoch weiterhin im Repository, zumindest bis nicht erreichbare Commits entfernt werden (z
git gc
. B. mithilfe von ).Beachten Sie, dass
git branch -d
das Löschen eines Zweigs abgelehnt wird, wenn nicht sicher ist, dass beim Löschen keine nicht erreichbaren Commits hinterlassen werden. Sie müssen die stärkere verwendengit branch -D
, um das Löschen eines Zweigs zu erzwingen, wenn dadurch möglicherweise nicht erreichbare Commits zurückbleiben.Beachten Sie auch, dass nicht erreichbare Commits, sofern vorhanden, nur die Commits zwischen dem letzten Tipp eines gelöschten Zweigs und entweder einem Commit, das mit einem anderen vorhandenen Zweig zusammengeführt wurde, einem mit Tags versehenen Commit oder dem Verzweigungspunkt sind. was auch immer später ist. Zum Beispiel in der folgenden Situation:
Nur Commits 'x' und 'y' sind nach dem Löschen des Zweigs nicht mehr erreichbar.
Wenn Sie einen gelöschten Zweig innerhalb des
gc.reflogExpire
Zeitraums von standardmäßig 90 Tagen bearbeitet haben, wird der letzte Tipp eines gelöschten Zweigs im HEAD-Reflog aufgezeichnet (siehegit reflog show HEAD
odergit log --oneline --walk-reflogs HEAD
). Sie sollten HEAD-Reflog verwenden können, um den gelöschten Zeiger wiederherzustellen. Beachten Sie auch, dass in diesem Fall nicht erreichbare Commits in nur einem gelöschten Zweig innerhalb desgc.reflogExpireUnreachable
Zeitraums von standardmäßig 30 Tagen vor dem Beschneiden (Entfernen) geschützt sind .Wenn Sie die Spitze eines gerade gelöschten Zweigs im Reflog für HEAD nicht finden können, können Sie versuchen,
git fsck
"nicht erreichbares Commit <sha1>" zu finden, und diese (übergit show <sha1>
odergit log <sha1>
) untersuchen, um die Spitze des gelöschten Zweigs zu finden.Unabhängig davon, wie Sie die Spitze eines gelöschten Zweigs finden, können Sie das Löschen rückgängig machen oder vielmehr einen gerade gelöschten Zweig mit neu erstellen
Beachten Sie jedoch, dass ein Reflog für einen Zweig verloren gehen würde.
Es gibt auch das Skript git-resurrect.sh, mit
contrib/
dem Spuren einer Verzweigungsspitze mit Vorname gefunden und wiederbelebt (wiederhergestellt) werden können.quelle
git reflog show HEAD
Ich habe das Commit aufgelistet und einen neuen Zweig erstellt, genau wie Sie gesagt haben, perfekt.Wenn Sie sich Sorgen über versehentlich gelöschte Zweige machen und keine lokale Kopie Ihres Repos mehr haben, gibt es Erweiterungen für Enterprise-Git-Server wie Gerrit, die Verlaufsumschreibungen und Zweiglöschungen erkennen und unter einem speziellen Verweis sichern, damit sie kann bei Bedarf wiederhergestellt werden und wird nicht durch Speicherbereinigung beschnitten. Gerrit-Administratoren können ausgewählte Commits bei Bedarf aus rechtlichen Gründen weiterhin entfernen.
quelle