2017-05-24 7 views
0

Ich habe einen Fall, in dem git pull meine commits löscht. Hier ist, wie leicht der Fall zu reproduzieren:git pull löschen commits

  1. die lokale Niederlassung hat man begehen, dass es ausdrückt vor dem Remote-Tracking-Zweig
  2. git push
  3. auf der Remote-Repo ein git update-ref -d refs/heads/<branch> <branch>~1 erfolgt. Ja, ich weiß ... bitte frag nicht warum oder sag nicht einfach, dass ich das nicht machen soll. Es hat etwas mit Backend-Automatisierung zu tun, die diesen Thread weit weg vom Thema bringen könnte. Wie auch immer ...
  4. zurück in dem lokalen Repo, git pull
  5. führende commit verschwunden

Im Grunde, was passiert ist, dass ich branch.<branch name>.rebase Satz wahr habe, und auf diesem rebase Schritt die Semantik es säumige von --fork-point, die (ich denke) im Grunde von der Spitze des Reflogs des lokalen Zweiges abwärts iteriert und prüft, ob der SHA im Reflog des entfernten Nachverfolgungszweiges existiert. Sobald es in beiden vorhanden ist, ist das der Gabelungspunkt. In diesem kleinen Eckfall ist es jedoch nicht der eigentliche Gabelpunkt. Der richtige Verzweigungspunkt wird tatsächlich zurückgegeben, wenn der Remote-Verfolgungszweig und die lokalen Verzweigungsargumente in der Befehlszeile ausgetauscht werden.

  1. Ist es möglich, --no-fork-point einstellen die Standardeinstellung für Rebasieren sein? Ich sah die git config documentation an und nicht offensichtlich nichts finden konnte, die --fork-point off

  2. Ich habe versucht, mit git Aliasing verwandeln würde, aber es ist umständlich und erfordern jede unkonventionellen Befehl leider

+0

AFAIK, die irgendeine Art von 'git pull' ausführen, kann nicht dazu führen, dass Commits gelöscht werden. Im schlimmsten Fall würde 'git pull --rebase' dazu führen, dass einige Ihrer Commits _re_redritten_ sind und auf einige Dinge auf der Fernbedienung gespielt werden, aber selbst in diesem Fall würden sie nicht gelöscht werden. –

+0

@TimBiegeleisen: leider, wenn 'git pull' 'git rebase' (wie es tut, wenn Sie' Zweig haben. .rebase' auf 'true' gesetzt), erhalten Sie den Gabel-Punkt-Code. – torek

+0

@torek Ich bin mir völlig nicht bewusst, dass dies passieren kann. Vielleicht fügen Sie Ihrer Antwort einige Informationen hinzu, wenn Ihnen danach ist. –

Antwort

2

Das, zu verwenden, ist Das eigentliche Ziel von --fork-point: Es ist beabsichtigt, stromaufwärts zu entfernen verpflichtet, dass der Upstream selbst ausgestreift, dass Sie in Ihrer Branche haben.

Die Antwort auf Q1 ist, dass es keine Möglichkeit gibt, diese von git pull auszuschalten. Normalerweise rate ich sowieso git pull: git fetch gefolgt von git rebase ... aber die Standard --fork-point, die Sie erhalten, wenn Sie keine bestimmte upstream (oder --root) werden immer noch beißen Sie hier.

Q2 ist nicht wirklich eine Frage: Aliasing ist ein bisschen peinlich, ja. Eine explizite git fetch gefolgt von git rebase --no-fork-point wird den Job erledigen, aber es erfordert, dass die Leute das tatsächlich tun.