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, ...).