Pushing sendet ein vorhandenes Git Repository GitHub nur etwa die Hälfte der Commits?
-
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 ...
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 aufF
im Diagramm begeht oben
- Der
-
Vorspulen
master
tmp
git checkout master
git merge tmp
-
master
jetzt zeigt aufF
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.