Frage

aus dem SVN kommend, nur beginnend mit git vertraut zu machen.

Wenn ein Zweig in git gelöscht wird, wird es aus der Geschichte entfernt?

In SVN, können Sie einfach einen Zweig wiederherstellen, indem Sie den Löschvorgang zurückkehrt (Reverse-merge). Wie alle Löschungen in svn wird der Zweig nie wirklich gelöscht, es ist nur aus dem aktuellen Baum entfernt werden.

Wenn die Verzweigung tatsächlich aus der Geschichte in git gelöscht wird, was geschieht mit den Änderungen, die von diesem Zweig zusammengeführt wurden? Sind sie behalten?

War es hilfreich?

Lösung

Die Zweige sind nur Zeiger auf Commits in git. In git commit jeweils ein kompletten Quellbaum hat, ist es eine ganz andere Struktur aus dem SVN ist, wo alle Zweige und Tags (vereinbarungsgemäß) leben in getrennten ‚Ordnern‘ des Repository neben der speziellen ‚Stamm‘.

Wenn der Zweig in einer anderen Zweig verschmolzen wurde, bevor es gelöscht wurde dann alle Commits noch von dem anderen Zweig erreichbar sein, wenn der erste Zweig gelöscht. Sie bleiben genau so, wie sie waren.

Wenn die Verzweigung gelöscht wird, ohne in einen anderen Zweig zusammengeführt werden dann die Commits in diesem Zweig (bis zu dem Punkt, wo die aus einem gegabelten begehen das ist immer noch erreichbar ist) wird nicht mehr sichtbar sein.

Die Commits werden noch im Repository beibehalten werden und es ist möglich, sie unmittelbar nach dem Löschen zu erholen, aber schließlich werden sie Müll gesammelt werden.

Andere Tipps

In Git, Zweige sind nur Zeiger (Referenzen) auf Commits in einem gerichteten azyklischen Graphen (DAG) von Commits. Dies bedeutet, dass ein Zweig Löschen nur Verweise auf Commits entfernt, die einige Commits in der DAG nicht erreichbar, so unsichtbar machen könnte. Aber alle Commits, die noch im Repository würde auf einem gelöschten Zweig waren, zumindest bis unerreichbaren Commits beschnitten bekommen (z git gc verwendet wird).

Beachten Sie, dass git branch -d eine Verzweigung löschen würde verweigern, wenn sie nicht sicher sein kann, dass das Löschen nicht unerreichbar Commits verlassen würde. Sie müssen die stärkeren git branch -D an Kraft Löschung eines Zweigs verwenden, wenn es nicht erreichbare Commits verlassen könne.

Beachten Sie auch, dass nicht erreichbar verpflichtet, wenn sie vorhanden sind, sind nur die Commits zwischen der letzten Spitze eines gelöschten Zweig und entweder eine Festschreibung, dass Erhaltenes an einem anderen bestehenden Zweig verschmolzen, jedes getaggt begehen oder das Verzweigungspunkt; je nachdem, welche später. Zum Beispiel in der folgenden Situation:

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

Commits nur 'x' und 'y' würde nicht erreichbar, nachdem der Zweig zu löschen.

Wenn Sie auf einem gelöschten Zweig innerhalb der gc.reflogExpire Zeitraum betrieben, Standard 90 Tage, würden Sie die letzte Spitze eines gelöschten Zweig in HEAD reflog aufgezeichnet (siehe git reflog show HEAD oder git log --oneline --walk-reflogs HEAD). Sie sollten die gelöschte Zeiger zu erholen HEAD reflog nutzen können. Beachten Sie auch, dass in diesem Fall nicht erreichbar Commits in nur einen gelöschten Zweig würden aus dem Beschneiden (Entfernen) innerhalb der gc.reflogExpireUnreachable Zeit geschützt werden, die standardmäßig 30 Tage.

Wenn Sie nicht die Spitze eines gerade gelöschten Zweig in reflog für HEAD finden können, können Sie versuchen, git fsck verwenden „nicht erreichbar begehen “ zu finden, und untersuchen diejenigen (via git show <sha1> oder git log <sha1>), um die Spitze zu finden der gelöschten Zweig.

Unabhängig, wie Sie die Spitze eines gelöschten Zweig finden, können Sie Löschen rückgängig zu machen, oder vielmehr neu erstellen eine gerade gelöscht Zweig mit

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

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


Es gibt auch git-resurrect.sh Skript in contrib/ die Spuren eines Zweiges Spitze finden mit bestimmten Namen und resurrect hilft (undelete) es.

Wenn Sie versehentlich gelöschte Zweige besorgt sind und nicht über eine lokale Kopie Ihrer Repo mehr gibt es Erweiterungen Unternehmen Git-Server wie Gerrit, die Geschichte umschreibt und Zweig Deletionen erkennt, wird sie unter einem speziellen ref sichern so dass sie wiederhergestellt werden, wenn nötig und wird von der Garbage collection nicht beschnitten werden. Gerrit-Administratoren können noch ausgewählt Commits entfernen, wenn aus rechtlichen Gründen erforderlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top