Ich versuche, ein Problem zu reproduzieren, das sich aus meiner versuchten Antwort auf diese Frage ergab.
Zusamenfassend
Ein Github-Benutzer hat es versucht git pull --rebase
und die lokalen Dateien dieses Benutzers wurden gelöscht. Ich habe versucht, dieses Szenario auf Github nachzubilden, aber in meinem Fall wird nichts gelöscht.
Wie kann ich also das Szenario reproduzieren, in dem Git Pull destruktiv ist?
Die Details
Teil 1:
- Ein Benutzer hat gefragt, wie lokale Änderungen mit einem neu erstellten Remote-Repository synchronisiert werden können.
git push
fehlgeschlagen, weil der Benutzer keine Remote-Änderungen hatte (wie erwartet).- Ich schlug vor, zu verwenden
git pull --rebase
dann lösen, danngit push
aufs Neue. - Aber mein Vorschlag führte dazu, dass die lokalen Dateien des Benutzers gelöscht wurden. (siehe Ausgangsfrage)
- Beachten Sie, dass die Dateien nachverfolgt (lokal festgeschrieben) wurden, sodass der Benutzer sie wiederherstellen konnte.
Teil 2:
- Ich habe ein Repo namens https: //github.com/user/myrepo erstellt, das mit README und .gitignore initialisiert wurde
-
lokal habe ich gemacht:
lokal initialisiertes Repo
> mkdir myrepo > cd myrepo > echo AAAAA > fileA.txt > echo BBBBB > fileB.txt > echo ignoreme > .gitignore > git init
die Dateien lokal übergeben
> git add . > git commit -m"initial commit"
versucht, Remote-Änderungen zu ziehen
> git remote add origin https://github.com/user/myrepo.git > git branch --set-upstream-to=origin/master master > git pull --rebase
-
Das Ergebnis war (wie erwartet):
First, rewinding head to replay your work on top of it... Applying: initial commit Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... Auto-merging .gitignore CONFLICT (add/add): Merge conflict in .gitignore error: Failed to merge in the changes. Patch failed at 0001 initial commit The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
-
An dieser Stelle, wenn ich das tue
ls
meine lokalen Dateien befinden sich immer noch in meinem Dateisystem.> ls -a . .. .git .gitignore README.md fileA.txt fileB.txt
Aktualisieren:
Hier ist ein Kommentar des ursprünglichen Benutzers, der das Problem hatte.
von user7342807:
… Ich habe heute morgen WordPress installiert und genau das getan.
git init git add . git commit -m "initial commit"
An diesem Punkt war mir klar, dass ich bereits die Github-Seite dafür erstellt hatte, MIT einer Standard-Readme darin.
Da ich nicht wusste, dass dies ein Problem sein würde, versuchte ich, es zu pushen
git remote add origin http://github.com/user/repo.git git push -u origin master
Dabei erhielt ich die Nachricht:
$ git push -u origin master To https://github.com/user/project.com ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/user/project.com' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Also, anstatt diese README-Datei auf Github zu pushen und zu löschen, habe ich es getan
git pull --rebase
und git zeigte mir diese NachrichtFirst, rewinding head to replay your work on top of it...
Ich habe ungefähr 5 Minuten gewartet, bevor ich
ctrl+C
aus dem Prozess heraus und stellte fest, dass etwa 8-9 Dateien von der WordPress-Site entfernt wurden.
git status
zeigte mir auch die entfernten Dateien.Ich konnte diese Dateien mit wiederherstellen
git reflog
die mir meinen ersten Commit auf HEAD@1 zeigte und mit dem ich meine Dateien wiederhergestellt habegit reset
--hard "HEAD@{5}"
Was könnte dazu geführt haben, dass die Dateien aus dem lokalen Dateisystem des anderen Benutzers gelöscht wurden?
Bitte beachten Sie, dass es eine ähnliche Frage gibt, die fragt, wie Dateien gelöscht werden können, wenn dies geschieht. Dieser Fall tritt also auf und die Leute verlieren ihre Dateien.
Habe den Vorfall gelöscht nicht verfolgt Dateien? Ich frage, weil git mehrere Merge-Strategien zur Verfügung stehen, und da Sie jetzt mitten in einem Merge-Konflikt sitzen, könnte es sein, wenn git entschied, dass der beste Weg, den Konflikt zu lösen, darin besteht, zu versuchen, andersherum zusammenzuführen habe einfach das changeset von der remote lokal ausgecheckt und versucht darauf einzubinden. Auf diese Weise sieht es so aus, als wären die Dateien gelöscht, aber in Wirklichkeit sitzen Sie immer noch mitten in einem Zusammenführungskonflikt. Außerdem gibt Rebase die Änderungssätze einzeln wieder, was dies erklären könnte.
– Lasse V. Karlsen
6. März 2017 um 12:27 Uhr
Dies sind nachverfolgte Dateien. Sie haben sich verpflichtet. Ich werde die Frage aktualisieren.
– martin jakubik
6. März 2017 um 12:37 Uhr
@LasseV.Karlsen Es wäre interessant, eine Datei zu erstellen, die dazu führen könnte, dass Git diese Reverse-Merge-Strategie verwendet … Ich verstehe auch Ihren Standpunkt zur Rebase-Wiedergabe, aber in diesem Fall glaube ich, dass nur ein einziger Commit aus a resultierte git init mit README + .gitignore im Github-Repo.
– martin jakubik
6. März 2017 um 12:51 Uhr
Wenn git einen anderen Änderungssatz auscheckt, hat es überhaupt keine Dateien gelöscht, sie sind immer noch im Commit-Verlauf vorhanden. Ja, es kann und wird sie aus Ihrem Arbeitsverzeichnis entfernen, aber nicht aus den Commits. Wenn das Verschieben der HEAD- oder Branch-Referenzen jedoch unterbrochen wird, kann es sein, dass Sie mit lokalen Commits enden, die anders als durch das Reflog nicht erreichbar sind.
– Lasse V. Karlsen
6. März 2017 um 12:54 Uhr
Nicht wirklich eine Antwort, aber: (1) allgemeiner Standardratschlag: Vermeiden
git pull
(2) Sie führen nicht verwandte Historien zusammen, was im neuesten Git erforderlich ist--allow-unrelated-histories
beim Benutzengit merge
; (3) wir müssten genau wissen, wie das Upstream-Repository erstellt wurde (GitHub ermöglicht es Ihnen, leere oder nicht leere zu erstellen) und Ihre lokale Git-Version; (4) es kann sich um einen Windows-Git-spezifischen Fehler handeln.– Torek
6. März 2017 um 19:32 Uhr