wake-up-neo.com

Entfernt das Löschen eines Zweigs in Git ihn aus dem Verlauf?

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 rückgängig machen (Reverse Merge). Wie alle Löschvorgänge 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?

177
Ken Liu

Zweige sind nur Zeiger auf Commits in Git. In git hat jedes Commit einen vollständigen Quellbaum. Es ist eine ganz andere Struktur als svn, bei der alle Zweige und Tags (gemäß Konvention) in separaten Ordnern des Repositorys neben dem speziellen Trunk gespeichert sind.

Wenn der Zweig vor dem Löschen in einem anderen Zweig zusammengeführt wurde, sind beim Löschen des ersten Zweigs weiterhin alle Commits für den anderen Zweig erreichbar. Sie bleiben genauso wie sie waren.

Wenn der Zweig gelöscht wird, ohne in einem anderen Zweig zusammengeführt zu werden, werden die Festschreibungen in diesem Zweig (bis zu dem Punkt, an dem die Verzweigung von einer noch erreichbaren Festschreibung erfolgt) nicht mehr angezeigt.

Die Commits bleiben weiterhin im Repository erhalten und können sofort nach dem Löschen wiederhergestellt werden, sie werden jedoch möglicherweise über den Müll gesammelt.

231
CB Bailey

In Git sind Zweige nur Zeiger (Verweise) auf Festschreibungen in einem gerichteten azyklischen Diagramm (DAG) von Festschreibungen. Das bedeutet, dass beim Löschen einer Verzweigung nur Verweise auf Festschreibungen entfernt werden, wodurch einige Festschreibungen in der DAG möglicherweise nicht mehr erreichbar und somit unsichtbar werden. Aber alle Commits, die sich in einem gelöschten Zweig befanden, befanden sich immer noch im Repository, zumindest bis nicht erreichbare Commits gelöscht wurden (z. B. mit git gc).

Beachten Sie, dass git branch -d Das Löschen eines Zweigs ablehnen würde, wenn nicht sichergestellt werden kann, dass beim Löschen keine nicht erreichbaren Commits zurückbleiben. Sie müssen das stärkere git branch -D Verwenden, um das Löschen eines Zweigs zu erzwingen, wenn dadurch möglicherweise nicht erreichbare Commits zurückbleiben.

Beachten Sie auch, dass es sich bei nicht erreichbaren Festschreibungen, sofern vorhanden, nur um Festschreibungen zwischen dem letzten Punkt einer gelöschten Verzweigung und einer Festschreibung handelt, die mit einer anderen vorhandenen Verzweigung, einer mit Tags versehenen Festschreibung oder dem Verzweigungspunkt zusammengeführt wurde. was auch immer später ist. Zum Beispiel in der folgenden Situation:

 ---- O ---- * ---- * ----/M ---- * <- master <- HEAD 
\/
\--. ---- .--/- x --- y <- gelöschter Zweig 

nur die Commits 'x' und 'y' sind nach dem Löschen des Zweigs nicht mehr erreichbar.

Wenn Sie einen gelöschten Zweig innerhalb des Zeitraums gc.reflogExpire (Standardmäßig 90 Tage) bearbeitet haben, wird der letzte Tipp eines gelöschten Zweigs in HEAD reflog) aufgezeichnet (siehe git reflog show HEAD oder git log --oneline --walk-reflogs HEAD). Sie sollten in der Lage sein, HEAD reflog zu verwenden, um den gelöschten Zeiger wiederherzustellen. Beachten Sie auch, dass in diesem Fall nicht erreichbare Commits nur in einem gelöschten Zweig ausgeführt würden Sie müssen innerhalb des Zeitraums gc.reflogExpireUnreachable, der standardmäßig 30 Tage beträgt, vor dem Beschneiden (Entfernen) geschützt sein.

Wenn Sie die Spitze eines gerade gelöschten Zweigs in reflog für HEAD nicht finden können, können Sie versuchen, mit git fsck "Nicht erreichbares Commit <sha1>" zu finden und diese zu untersuchen (über git show <sha1> oder git log <sha1>), 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 einen gerade gelöschten Zweig mit neu erstellen

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

Beachten Sie jedoch, dass ein Reflog für einen Zweig verloren gehen würde.


Es gibt auch ein git-resurrect.sh Skript in contrib/, Das hilft, die Spuren eines Verzweigungspunktes mit dem angegebenen Namen zu finden und ihn wiederherzustellen (wiederherzustellen).

80
Jakub Narębski

Wenn Sie wegen versehentlich gelöschter Zweige besorgt sind und keine lokale Kopie Ihres Repos mehr haben, gibt es Erweiterungen für Unternehmens-Git-Server wie Gerrit, die Verlaufsumschreibungen und Zweiglöschungen erkennen und diese unter einem speziellen Verweis sichern kann bei Bedarf wiederhergestellt werden und wird von der Garbage Collection nicht gelöscht. Gerrit-Administratoren können weiterhin ausgewählte Commits entfernen, wenn dies aus rechtlichen Gründen erforderlich ist.

2