Was würde git dazu bringen, lokale Dateien während git pull –rebase zu löschen?

Lesezeit: 7 Minuten

Was wurde git dazu bringen lokale Dateien wahrend git pull
martin jakubik

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 --rebasedann lösen, dann git 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 lsmeine 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 Nachricht

First, 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 habe git 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 Benutzen git 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

Ich kann aufgrund des niedrigen Repos nichts sagen, aber 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 Nachricht

First, 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 habe git reset --hard "HEAD@{5}"

  • Hi, ich kann dafür kein Kopfgeld starten. Ich habe Ihre Antwort in meine Frage kopiert … Würde es Ihnen etwas ausmachen, Ihre Antwort an dieser Stelle zu löschen?

    – martin jakubik

    8. Juni 2017 um 9:22 Uhr

  • git reflog und git reset --hard "HEAD@{...}" hat meine Dateien gerettet, danke!

    – Glückstag

    5. Juli 2019 um 10:35 Uhr

git pull löscht alle verfolgten Dateien auf einem anderen Pfad.

siehe Warum git rm –cached keine lokale jemals verfolgte Datei entfernt, sondern andere

998270cookie-checkWas würde git dazu bringen, lokale Dateien während git pull –rebase zu löschen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy