Grundproblem
Ich habe gerade den gesamten Code aus einer Datei in meinem Projekt gelöscht und die Änderung (absichtlich) an meinem lokalen Git übergeben. Ich tat
git pull upstream master
vom Upstream abrufen und zusammenführen (theoretisch sollte der gelöschte Code zurück sein).
Git sagt mir, dass alles auf dem neuesten Stand ist.
Alles ist definitiv NICHT auf dem neuesten Stand - der gesamte gelöschte Code wird immer noch gelöscht.
Sonstige relevante Informationen
Ich habe nur einen Zweig namens "Master".
Ich habe kürzlich "master" eingerichtet, um Upstream wie folgt zu verfolgen:
Zweigstellenmaster eingerichtet, um den Remote-Zweigstellenmaster vom Upstream zu verfolgen.
Der Befehl git branch -vv
ergibt:
* master 7cfcb29 [upstream/master: ahead 9] deletion test
Warum warum warum passiert das? Ich bin kurz davor, meinem Projektmanager alle Änderungen, die ich an unserem Code vornehme, per E-Mail zu senden.
Aktualisieren
Ich dachte, es wäre offensichtlich, aber das ist trotzdem mein Ziel:
Holen Sie sich den neuesten Code auf meinem System.
Entschuldigen Sie meine Wut hier, aber warum muss eine so einfache Aufgabe so schwer sein?
Antworten:
Ich denke, Ihr grundlegendes Problem hier ist, dass Sie falsch interpretieren und / oder falsch verstehen, was Git macht und warum es es tut.
Wenn Sie ein anderes Repository klonen, erstellt git eine Kopie dessen, was "dort drüben" ist. Es nimmt auch "ihre" Verzweigungsbezeichnungen, wie z. B.
master
, und erstellt eine Kopie dieser Bezeichnung, deren "vollständiger Name" in Ihrem Git-Baum (normalerweise) lautetremotes/origin/master
(aber in Ihrem Fallremotes/upstream/master
). Meistens können Sie dasremotes/
Teil auch weglassen , sodass Sie auf diese Originalkopie als verweisen könnenupstream/master
.Wenn Sie jetzt Änderungen an Dateien vornehmen und festschreiben, sind Sie der einzige mit diesen Änderungen. In der Zwischenzeit können andere Personen das ursprüngliche Repository (aus dem Sie Ihren Klon erstellt haben) verwenden, um andere Klone zu erstellen und diese Klone zu ändern. Sie sind natürlich die einzigen mit ihren Veränderungen. Möglicherweise hat jemand Änderungen, die er an den ursprünglichen Eigentümer zurücksendet (über "Push" oder Patches oder was auch immer).
Der
git pull
Befehl ist meistens nur eine Abkürzung fürgit fetch
gefolgt vongit merge
. Dies ist wichtig, da Sie verstehen müssen, was diese beiden Vorgänge tatsächlich tun.Der
git fetch
Befehl besagt, dass Sie dorthin zurückkehren sollen, wo Sie geklont haben (oder sich anderweitig als Abrufort eingerichtet haben) und "neue Inhalte suchen, die von einer anderen Person hinzugefügt, geändert oder entfernt wurden". Diese Änderungen werden kopiert und auf Ihre Kopie dessen angewendet , was Sie zuvor von ihnen erhalten haben . Sie werden nicht auf Ihre eigene Arbeit angewendet, sondern nur auf ihre.Der
git merge
Befehl ist komplizierter und genau dort, wo Sie schief gehen. Was es ein wenig vereinfacht macht, ist, "was Sie in Ihrer Kopie geändert haben" mit "Änderungen zu vergleichen, die Sie von jemand anderem abgerufen und somit zu Ihrer Kopie der Arbeit eines anderen hinzugefügt haben". Wenn Ihre Änderungen und ihre Änderungen nicht in Konflikt zu geraten scheinen, werden sie durch diemerge
Operation zusammengeführt und erhalten ein "Merge Commit", das Ihre Entwicklung und ihre Entwicklung miteinander verbindet (obwohl es einen sehr häufigen "einfachen" Fall gibt, in dem Sie keine haben ändert sich und Sie erhalten einen "schnellen Vorlauf").Die Situation, der Sie jetzt begegnen, ist eine, in der Sie Änderungen vorgenommen und diese festgeschrieben haben - neun Mal, daher die "Voraus 9" - und sie haben keine Änderungen vorgenommen. Also
fetch
holt pflichtbewusst nichts ab,merge
nimmt dann ihren Mangel an Veränderungen und tut auch nichts.Was Sie wollen, ist, sich "ihre" Version des Codes anzusehen oder vielleicht sogar "zurückzusetzen".
Wenn Sie es sich nur ansehen möchten, können Sie sich einfach diese Version ansehen:
Das sagt git, dass Sie das aktuelle Verzeichnis in den Zweig verschieben möchten, dessen vollständiger Name tatsächlich lautet
remotes/upstream/master
. Sie sehen ihren Code ab dem letzten Mal, als Sie ausgeführt habengit fetch
und den neuesten Code erhalten haben.Wenn Sie alle Ihre eigenen Änderungen aufgeben möchten, müssen Sie die Idee von git ändern, welche Revision Ihr Label
master
benennen soll. Derzeit wird Ihr letztes Commit benannt. Wenn Sie zu diesem Zweig zurückkehren:dann können Sie mit dem
git reset
Befehl sozusagen "das Etikett verschieben". Das einzige verbleibende Problem (vorausgesetzt, Sie sind wirklich bereit, alles aufzugeben, was Sie nicht tun) besteht darin, herauszufinden, wohin das Etikett zeigen soll.git log
Sie können die numerischen Namen finden - solche Dinge wie7cfcb29
-, die permanente (sich nie ändernde) Namen sind, und es gibt eine lächerliche Anzahl anderer Möglichkeiten, sie zu benennen, aber in diesem Fall möchten Sie nur den Namenupstream/master
.Um das Etikett zu verschieben, löschen Sie Ihre eigenen Änderungen (alle Änderungen, die Sie vorgenommen haben, können tatsächlich für eine Weile wiederhergestellt werden, aber danach ist es viel schwieriger. Seien Sie also sehr sicher):
Der
--hard
git git soll löschen, was Sie getan haben, die aktuelle Verzweigungsbezeichnung verschieben und dann das angegebene Commit überprüfen.Es ist nicht üblich, wirklich
git reset --hard
eine Menge Arbeit zu wollen und auszulöschen. Eine sicherere Methode (die es viel einfacher macht, diese Arbeit wiederherzustellen, wenn Sie der Meinung sind, dass sich ein Teil davon gelohnt hat) besteht darin, Ihren vorhandenen Zweig umzubenennen:und dann mache einen neuen lokalen Zweig mit dem Namen
master
"Tracks" (ich mag diesen Begriff nicht wirklich, da ich denke, dass er die Leute verwirrt, aber das ist der Git-Begriff :-)) der Ursprungs- (oder Upstream-) Master:womit Sie sich dann beschäftigen können:
Die letzten drei Befehle (es gibt Verknüpfungen, mit denen nur zwei Befehle erstellt werden können) ändern den Namen, der auf dem vorhandenen Etikett eingefügt ist, erstellen dann ein neues Etikett und wechseln zu diesem:
bevor Sie etwas tun:
nachher
git branch -m
:nachher
git branch -t master upstream/master
:Hier
C0
ist das letzte Commit (ein vollständiger Quellbaum), das Sie erhalten haben, als Sie das erste Mal Ihr Commit ausgeführt habengit clone
. C1 bis C9 sind Ihre Commits.Beachten Sie , dass dies das letzte Bild ändern würde , wenn Sie es
git checkout bunchofhacks
danngit reset --hard HEAD^^
tun würden:Der Grund dafür ist, dass
HEAD^^
die Revision zwei vom Kopf des aktuellen Zweigs (kurz vor dem Zurücksetzenbunchofhacks
) nach oben benannt undreset --hard
dann die Beschriftung verschoben wird. Die Commits C8 und C9 sind jetzt größtenteils unsichtbar (Sie können Dinge wie das Reflog verwenden undgit fsck
sie finden, aber es ist nicht mehr trivial). Ihre Etiketten können Sie bewegen, wie Sie möchten. Derfetch
Befehl kümmert sich um diejenigen, die mit beginnenremotes/
. Es ist üblich, "Ihre" mit "Ihnen" abzugleichen (wenn sie also einen habenremotes/origin/mauve
, würden Sie auch Ihren Namen nennenmauve
), aber Sie können "Ihre" eingeben, wann immer Sie Commits benennen / sehen möchten, die Sie "von ihnen" erhalten haben. (Denken Sie daran, dass "ein Commit" ein ganzer Quellbaum ist. Sie können eine bestimmte Datei aus einem Commit auswählen,git show
z.quelle
git merge
als würden Sie als Befehlszeilenbefehl ausgeführt (was ich selbst mache, es ist eine vernünftige Methode). Beachten Sie jedoch, dass diesgit pull
zuerst ausgeführt wirdgit fetch
, dann ausgeführt wirdgit merge
(odergit rebase
wenn Sie es stattdessen anweisen). Es ist der Abrufschritt , die tatsächlich bringt über die neuen Commits (oder umbasiert-only) zusammengeführt werden.git status
, mit dem ich sehen kann, ob das Upstream-Repo meinem aktuellen Repo voraus ist? Die Nachricht, die ich mit der Meldunggit status
"Ihre Filiale ist mit 'origin / master' auf dem neuesten Stand" erhalte, verwirrt mich zu der Annahme, dass ich die neuesten Änderungen habe, wenn ich dies nicht tue. Manchmal erhalte ich eine Nachricht mit der Aufschrift "Ursprung / Master ist 5 Commits vor Ihrem Zweig" (Paraphrasierung). Aber es ist nicht konsistent.git status
"Ihr Zweig ist auf dem neuesten Stand" lautet, wenn ein Sofortgit fetch
über hundert Objekte herunterzieht und fast hundert Deltas auflöst, mehrere neue Zweige und ein paar neue Tags erwähnt und die Haupt- (Fernbedienung) ändert Tracking) Branch Head Commit - und dann sagt ein anderer Git-Status fröhlich und unaufrichtig immer noch "Ihre Filiale ist auf dem neuesten Stand". Es ist klar, dass viel vom Ursprung kam, aber der Zweig war vorher und nachher "auf dem neuesten Stand des Ursprungs"?git pull
läuftgit fetch
zuerst, danngit merge
(oder einem anderen zweiten Befehl Ihrer Wahl). Dergit fetch
Schritt aktualisiert die Erinnerung Ihres Git an den Status ihres Git, indem er seinen Git aufruft und etwas Neues von ihm erhält. Siegit status
überprüfen nur die Erinnerung Ihres Git an deren Git.Ich hatte das gleiche Problem wie du.
Ich tat es
git status
git fetch
git pull
, aber mein Zweig war immer noch im Rückstand. Ich hatte Ordner und Dateien auf Remote verschoben und ich sah die Dateien im Web, aber auf meinem lokalen fehlten sie.Schließlich aktualisierten diese Befehle alle Dateien und Ordner auf meinem lokalen:
oder wenn Sie eine Niederlassung wollen
quelle
Alle Änderungen, die Sie festschreiben, wie das Löschen aller Ihrer Projektdateien, bleiben auch nach einem Pull erhalten. Alles, was Sie tun, ist, die neuesten Änderungen von einem anderen Ort in Ihrem eigenen Zweig zusammenzuführen. Wenn Ihr Zweig alles gelöscht hat, kommt es bestenfalls zu Zusammenführungskonflikten, wenn sich vorgelagerte Änderungen auf von Ihnen gelöschte Dateien auswirken. Kurz gesagt, ja, alles ist auf dem neuesten Stand.
Wenn Sie beschreiben, welches Ergebnis Sie anstelle von "Alle Dateien gelöscht" haben möchten, kann möglicherweise jemand eine geeignete Vorgehensweise vorschlagen.
Aktualisieren:
Was Sie nicht zu verstehen scheinen, ist, dass Sie bereits den neuesten Code haben, der Ihnen gehört. Wenn Sie wirklich die neueste Arbeit eines anderen sehen möchten , die sich in der Hauptniederlassung befindet, gehen Sie einfach wie folgt vor :
Beachten Sie, dass Sie dadurch nicht in der Lage sind, Ihre eigene Arbeit sofort (neu) zu beginnen. Wenn Sie wissen müssen, wie Sie etwas, das Sie getan haben, rückgängig machen oder Änderungen, die Sie oder eine andere Person vorgenommen haben, auf andere Weise rückgängig machen können, geben Sie bitte Details an. Informieren Sie sich auch darüber, wozu die Versionskontrolle dient, da Sie den Grundzweck falsch zu verstehen scheinen.
quelle
upstream/master
. Meine Antwort wurde aktualisiert.Ziehen Sie, wie auf den anderen Postern angegeben, Änderungen aus dem Upstream in Ihr Repository. Wenn Sie das, was sich in Ihrem Repository befindet, durch das ersetzen möchten, was sich im Upstream befindet, haben Sie mehrere Möglichkeiten. Von der Manschette würde ich mit gehen
quelle
Die beste Antwort ist in Bezug auf Breite und Tiefe der gegebenen Informationen viel besser, aber es scheint, als ob Sie Ihr Problem fast sofort beheben möchten und es Ihnen nichts ausmacht, auf einige der Grundprinzipien der Versionskontrolle zu treten, Sie könnten ...
Zum Master wechseln
Löschen Sie Ihren unerwünschten Zweig. (Hinweis: Es muss das -D anstelle des normalen -d-Flags haben, da Ihr Zweig dem Commit viele Commits voraus ist.)
Erstellen Sie einen neuen Zweig
quelle
Während keine dieser Antworten für mich funktionierte, konnte ich das Problem mit dem folgenden Befehl beheben.
git fetch origin
Das hat mir einen Trick getan.
quelle
Nur eine freundliche Erinnerung, wenn Sie lokal Dateien haben, die nicht in Github sind und doch Ihre
git status
sagtEs kann passieren, wenn sich die Dateien in befinden
.gitignore
Versuche zu rennen
und zu sehen, ob diese Dateien dort angezeigt werden. Das würde erklären, warum Git sie nicht auf die Fernbedienung verschieben möchte.
quelle