Wenn Sie mit Git (und DVCS im Allgemeinen) ein wenig vertraut sind und Änderungen an der Umschreibung von Verlaufsdaten untersuchen, sind Sie sicher, wenn das Repository nur lokal ist. Wenn Sie jedoch mit Fernbedienungen arbeiten und dies versuchen, können Probleme auftreten solche Änderungen vorantreiben.
Eine Funktion, die ich erwarten würde, ist die Fähigkeit, einen "abgesicherten Modus" zu aktivieren, der mich grundsätzlich davon abhält, das zu tun, was ich nicht tun sollte ... Und was meine ich damit? Ich meine, Änderungen, die die Geschichte neu schreiben, für Dinge, die bereits einen Ursprung haben. Ich kann es nicht genau definieren, aber dies würde Fälle einschließen wie:
commit --amend
wenn HEAD bereits gedrückt wurderebase
einer nicht lokalen Niederlassungreset
eines Zweigs, der geschoben wurde
Dies sind Beispiele für Situationen, in denen der nächste wahrscheinlich push
fehlschlägt (weil es sich nicht um einen schnellen Vorlauf handelt, IIRC). Ich habe versehentlich etwas davon gemacht und musste den Zweig auf der Fernbedienung neu erstellen. Und ich hatte immer noch das Glück, dies schnell genug zu tun, damit niemand die Geschichte, die ich umgeschrieben habe, abrief.
Ich glaube, es ist möglich, diese Art von Änderungen zu identifizieren und den Benutzer bei Bedarf daran zu hindern, sie vorzunehmen. Gibt es dafür vielleicht eine Option?
Wenn dies nicht der Fall ist, lohnt es sich Ihrer Meinung nach, zu versuchen, es zu erstellen? Würden Sie versuchen, genau zu definieren, wie eine solche "gefährliche Veränderung" zu identifizieren ist?
--force
.Antworten:
Dies sieht sehr genau aus, wenn nicht die gleiche Frage wie Strategie zum Verhindern oder Abfangen von Git History Rewrite
Um es zusammenzufassen, können Sie aktivieren
git config --system receive.denyNonFastforwards true
und
git config --system receive.denyDeletes true
Oder schreiben Sie einen Post-Receive-Hook, um alles abzulehnen, von dem Sie feststellen, dass es sich um ein Umschreiben handelt.
quelle
denyNonFastforwards
ist die Standardeinstellung (?), Während diesdenyDeletes
nicht der Fall ist. Diese beiden sind nützlich, aber ich stelle mir eine clientseitige Lösung vor, die mich davon abhält, eine zu machen,commit --amend
wenn ich sie nicht pushen könnte (weil HEAD bereits gepusht wurde).denyNonFastfowards
umtrue
nur auf dem Master - Zweig? Ich möchte, dass meine Themenzweige neu basiert und erzwungen werden.Nein, denn es gehört zur Philosophie von git, Ihnen die volle Kraft zu geben und Sie diese Kraft so verwalten zu lassen, wie Sie es möchten.
Wenn Sie sich nicht an diese Philosophie halten, lohnt es sich vielleicht, zu Mercurial zu wechseln, da sie das Umschreiben der Geschichte ermöglichen, aber in begrenzter oder, um es klar auszudrücken, widerstrebender Weise, dass Sie der Meinung sind, dass dies keine gute Idee ist.
quelle
AFAIK, die Art und Weise, wie Git diese Probleme löst, ist, dass wenn Sie eine solche Aktion anfordern, diese lokal ausgeführt wird, Sie jedoch darüber informiert werden, dass das, was Sie tun, unerwünschte Konsequenzen haben kann. Zu diesem Zeitpunkt haben Sie noch nichts gepusht, sodass Sie in der Lage sind, Ihr lokales Repository zu überprüfen und möglicherweise die gefährliche Änderung rückgängig zu machen, bevor Sie pushen. Sie müssen jedoch darauf achten, was Git Ihnen sagt, und Sie sollten besser vorsichtig sein, wenn Sie solche Fehler reparieren.
quelle