Git: Wie erzwingt man ein pull, das lokale Dateien überschreibt?
Du hast lokale Änderungen, der Remote ist weitergezogen, und du willst dessen
Stand — vollständig, deiner verworfen. git pull verweigert das, also liegt
--force nahe. Das funktioniert nicht, und es lohnt sich zu sehen warum.
Was git dir zuerst sagt
user@pc:~$ git pull
error: Your local changes to the following files would be overwritten by merge:
file.txt
Please commit your changes or stash them before you merge.
Aborting
Das ist git, das sich weigert, deine Arbeit ungefragt wegzuwerfen. Vernünftig.
–force bedeutet nicht, wonach es aussieht
user@pc:~$ git pull --force
error: Your local changes to the following files would be overwritten by merge:
file.txt
Aborting
file still : line one|my local edit|
Die identische Fehlermeldung. Überschrieben wurde nichts.
--force bei git pull wird an den Fetch
durchgereicht und erlaubt dort ein Update eines Remote-Tracking-Refs, das kein
Fast-Forward ist. Über dein Arbeitsverzeichnis sagt es nichts aus. Ausgerechnet
der Schalter, den jeder zuerst probiert, ist also der, der nicht helfen kann.
Was tatsächlich funktioniert
user@pc:~$ git fetch origin
user@pc:~$ git reset --hard origin/main
file now : line one|from the colleague|
status : ''
Zwei Schritte, und die Trennung ist wichtig.
git fetch holt den Stand des Remote,
ohne irgendetwas von dir anzufassen.
git reset --hard setzt dann deinen
Branch auf origin/main und überschreibt das Arbeitsverzeichnis passend
dazu.
Beachte, dass dort origin/main steht und nicht main. Du setzt auf den
Tracking-Ref zurück, den du gerade aktualisiert hast.
Sauber ist damit noch nicht alles
after reset --hard : file.txt untracked.txt
after git clean -fd : file.txt
reset --hard kümmert sich nur um getrackte Dateien. Alles Ungetrackte —
Build-Ergebnisse, eine Editor-Sicherung, eine Datei die du angelegt aber nie
gestaged hast — überlebt unangetastet.
Willst du wirklich einen sauberen Stand, ist
git clean die zweite Hälfte:
user@pc:~$ git clean -fd
-f, weil git ohne diesen Schalter nichts löscht, -d für Verzeichnisse. Führ
vorher git clean -nd aus — das -n zeigt nur an, was entfernt würde, und
löscht nichts. Für diesen Befehl gibt es kein Zurück: Ungetrackte Dateien liegen
nicht in der Objektdatenbank, es gibt also nichts, woraus man sie wiederholen
könnte.
Die Variante, die keine Arbeit wegwirft
Meistens heißt “überschreib meine Dateien” in Wahrheit “ich will den Stand vom Remote und habe über meinen nicht lange nachgedacht”. Im Zweifel park deine Arbeit lieber:
user@pc:~$ git stash
user@pc:~$ git pull
user@pc:~$ git stash pop
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
status : UU file.txt
Genau dieser Konflikt ist der Punkt. Statt dich zwischen deiner Arbeit und dem
Remote zu entscheiden, bevor du beides gesehen hast, hast du jetzt beides in der
Datei und kannst Zeile für Zeile entscheiden. Und falls sich herausstellt, dass
du deine Version doch nicht wolltest, steht dir git checkout --theirs file.txt
oder ein erneutes git reset --hard origin/main immer noch offen — der Stash
bleibt in beiden Fällen in git stash list erhalten.
Hinweis zu Netcup (Werbung)
Der deutsche Hoster Netcup bietet unter anderem günstige und zugleich leistungsstarke Webhosting Pakete, KVM-basierte Root Server und dezidierte Server an. Mit unseren Gutscheincodes kannst du noch mehr Geld sparen (6€ bei deiner ersten Bestellung, 30% Rabatt auf alle KVM-basierten Root Server, ...).