Pushing sendet ein vorhandenes Git Repository GitHub nur etwa die Hälfte der Commits?

StackOverflow https://stackoverflow.com/questions/237408

  •  04-07-2019
  •  | 
  •  

Frage

Ich habe eine lokale Git Repository Ich habe unter ein paar Tage entwickelt: Es hat achtzehn bisher verpflichtet. Heute Abend habe ich einen privaten Github-Repository Ich hoffte, es zu schieben; aber wenn ich so tat, es endete nur acht der achtzehn Commits Github hochdrückt. Ich löschte den Github Repo- und erneut versucht, mit dem gleichen Ergebnis.

Alle Gedanken auf, warum dies passiert sein könnte? Ich habe dieses Verfahren getan vor, ohne ein paar Mal erfolgreich, also bin ich ein wenig ratlos.

Aktualisieren : Es gibt, und ist schon immer, nur der Master-Zweig in diesem Repo. Nur um zu adressieren einige der entsandten Antworten ...

War es hilfreich?

Lösung

habe ich einen Blick auf das Repository in Frage und hier ist was los war:

  • Irgendwann rpj hatte git checkout [commit id] durchgeführt. Dieser Spitzkopf an einem losen begeht anstatt einer anerkannten Zweig. Ich glaube, dass dies die „baumelnd HEAD“ Problem ist, dass CesarB sich bezieht.
  • dieses Problem nicht ahnend, ging er auf machen zu ändern und zu begehen sie, die jedes Mal, Kopf nach oben gestoßen. Allerdings HEAD nur bei einer baumelnden Kette von Commits zeigt, nicht an einer anerkannten Zweig.
  • Als er seine Änderungen schieben, git alles geschoben bis an die Spitze des Herrn, das er auf nur etwa der Hälfte des aktuellen Baum war.
  • Verwirrung folgte

Dieses Diagramm sollte macht es deutlich:

                 -- D -- E -- F
                /             ^
   A -- B -- C -              |
   ^         ^               HEAD
   |         |
 remote    master

Als er versuchte, seine Veränderungen zu schieben, nur A durch C geschoben wurden und remote bewegt bis C. Er konnte nicht Commits D durch F bekommen zu schieben, weil sie nicht durch einen bekannten Zweig verwiesen wird.

Hier ist, was Sie sehen, wenn Sie in diesem Zustand sind:

$ git branch
* (no branch)
master

Die Lösung ist master nach oben in der baumelnden Kette von Commits F. Hier ist, wie ich es tat.

  • Erstellen Sie einen legitimen Zweig für den aktuellen Zustand:

    git checkout -b tmp

    • Der tmp Zweig zeigt nun auf F im Diagramm begeht oben
  • Vorspulen master tmp

    git checkout master

    git merge tmp

    • master jetzt zeigt auf F begehen.
  • Werfen Sie Ihre temporären Zweig

    git branch -d tmp

  • Sie können gerne an die Remote-Repository schieben und es sollte alle Änderungen.

  • senden

Andere Tipps

Von Git 1.7.3 ab, so können Sie dies mit einem einfachen Befehl:

git checkout -B master

Die -b Schaltmittel „Zweig schaffen hier, bevor es außer Kontrolle“ und -B ist die bedingungslose Version, dass „selbst wenn der Zweig bereits vorhanden ist - in diesem Fall ist es bewegt sich hier, bevor sie auszuchecken“.


Ein sehr einfacher Ansatz für diese Art von Problem zu lösen ist, nur den master Zweig zu löschen und neu erstellen. Immerhin Niederlassungen in git sind nur Namen für Commits und der master Zweig ist nichts Besonderes.

So unter der Annahme, dass die aktuelle begehen ist, die Sie master sein wollen, können Sie einfach tun

git branch -D master

den bestehenden master Zweig zu löschen, dann tun

git checkout -b master

a) erstellen Sie einen neuen Zweig namens master, die die aktuellen Punkte commit und b) Update HEAD zum master Zweig zu zeigen. Danach wird HEAD master bewegt sich vorwärts master und deshalb angebracht werden, wenn Sie zu begehen.

Überprüfen Sie, ob Sie die richtigen Zweige drängen, und dass die Zweige tatsächlich haben, was Sie denken, sie haben. Insbesondere, wenn Sie nicht über eine freistehende HEAD haben, was ziemlich verwirrend sein kann, wenn nicht absichtlich getan.

Der einfachste Weg, um zu überprüfen ist gitk --all zu verwenden, die grafisch alle Zweige zeigt, die HEAD und vieles mehr.

Ich nehme an, das erste, was ich tun würde, git fsck auf Ihrem lokalen Repository laufen würde, um sicherzustellen, dass alles in Ordnung ist.

Ich habe dieses Problem noch nie gesehen, und ich kann nicht denken, was falsch sein könnte.

Ich habe nicht den Ruf kommentieren direkt auf CesarB früheren Antwort, aber gitk --all nicht in diesem Fall arbeiten, weil es nur bekannt Zweige listet.

gitk HEAD zeigt dieses Problem, aber es ist nicht ganz klar. The Smoking Gun ist, dass master zeigt nach oben nach unten dem Baum begehen, anstatt auf dem jüngsten begehen.

Also, es stellt sich heraus, dass beide: der Commit Hash in .git / refs / heads / Master war in richtig, und die Informationen in .git / logs / refs / heads / master unvollständig war; dass ich meine es waren nur auf und enthalten den Hash-Commit angegeben in .git / refs / heads / master.

Wenn ich diese Dateien (von Hand) fixiert und zurückgeschoben zu Github, war alles wieder Soße. Ich habe immer noch keine Ahnung , was passierte Dinge in diesem Zustand zu erhalten, aber ich bin froh, dass ich zumindest das Update herausgefunden.

Falls sich jemand fragt: .git / refs / heads / master zu beheben, ich ersetzt nur den Inhalt dieser Datei mit dem neuesten Commit Hash (HEAD) und zu beheben .git / logs / refs / heads / master ich kopiert einfach den Inhalt von .git / logs / HEAD in .git / logs / refs / heads / master. Kinderleicht ... NICHT.

Ich habe das gleiche Problem zweimal habe, und endlich herausgefunden, was ich tat, dass es verursacht wurde. In dem Verfahren ein alte mit git rebase -i der Bearbeitung begeht, statt git commit --amend des Aufrufs war ich git commit -a durch die Macht der Gewohnheit nennen, unmittelbar gefolgt von git rebase --continue gefolgt, natürlich. Jemand anderes könnte in der Lage sein, zu erklären, was hinter den Kulissen vor sich geht, aber es scheint, dass das Ergebnis ist das frei stehende HEAD Problem.

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