Gibt es eine Möglichkeit, eine git pull
die alle lokalen Datei-Änderungen ignoriert, ohne das Verzeichnis zu zerstören und eine git clone
?
Antworten
Zu viele Anzeigen?Wenn Sie meinen, dass der Pull lokale Änderungen überschreiben soll, indem Sie den Merge so durchführen, als ob der Arbeitsbaum sauber wäre, dann bereinigen Sie den Arbeitsbaum:
git reset --hard
git pull
Wenn es nicht verfolgte lokale Dateien gibt, können Sie Folgendes verwenden git clean
um sie zu entfernen.
git clean -f
um nicht verfolgte Dateien zu entfernen-df
um nicht verfolgte Dateien und Verzeichnisse zu entfernen-xdf
um nicht verfolgte oder ignorierte Dateien oder Verzeichnisse zu entfernen
Wenn Sie andererseits die lokalen Modifikationen irgendwie beibehalten wollen, würden Sie Stash verwenden, um sie vor dem Ziehen zu verstecken, und sie danach wieder anbringen:
git stash
git pull
git stash pop
Ich glaube nicht, dass es sinnvoll ist, wörtlich ignorieren. Die Hälfte von pull ist merge, und es muss die committed Versionen der Inhalte mit den Versionen, die es geholt hat, zusammenführen.
Bei mir hat das folgende funktioniert:
(1) Holen Sie zunächst alle Änderungen:
$ git fetch --all
(2) Setzen Sie dann den Master zurück:
$ git reset --hard origin/master
Hinweis - Für Nutzer von github wurde "master" im Oktober 2020 durch "main" ersetzt. Für Projekte, die seither erstellt wurden, müssen Sie möglicherweise stattdessen "main" verwenden, z. B:
$ git reset --hard origin/main
(3) Abrufen/Aktualisieren:
$ git pull
Sie wollen nur einen Befehl, der genau das gleiche Ergebnis liefert wie rm -rf local_repo && git clone remote_url
richtig? Ich möchte auch diese Funktion. Ich frage mich, warum Git nicht einen solchen Befehl anbietet (wie git reclone
o git sync
), noch bietet svn einen solchen Befehl (wie svn recheckout
o svn sync
).
Probieren Sie den folgenden Befehl aus:
git reset --hard origin/master
git clean -fxd
git pull
Der folgende Befehl wird nicht immer funktionieren . Wenn Sie nur tun:
$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.
$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla
$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
und so weiter...
An wirklich neu beginnen, die Verzweigung herunterladen und alle lokalen Änderungen überschreiben, tun Sie es einfach:
$ git checkout thebranch
$ git reset --hard origin/thebranch
Das wird schon klappen.
$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.
$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...
$ git status
# On branch thebranch
nothing to commit (working directory clean)
$ git checkout thebranch
Already on 'thebranch'
- See previous answers
- Weitere Antworten anzeigen
29 Stimmen
Meinen Sie mit "ignorieren" "überschreiben"?
5 Stimmen
@Cascabel Es bedeutet, alle lokalen Änderungen rückgängig zu machen, alle lokalen Commits aufzuheben, alle lokalen neuen Dateien und Verzeichnisse zu löschen, alle lokal gelöschten Dateien und Verzeichnisse wiederherzustellen, usw. Kurz gesagt, führen Sie einfach einen Befehl aus, als ob
rm -rf local_repo && git clone remote_url
.1 Stimmen
Ist damit Ihre Frage beantwortet? Wie zwinge ich "git pull" dazu, lokale Dateien zu überschreiben?
1 Stimmen
11 Jahre später warte ich immer noch auf eine einfache und zuverlässige Möglichkeit, dies zu tun. Ich verabscheue "git" so sehr... es verschwendet so viel meiner Zeit.