Frage

Wie erzwinge ich das Überschreiben lokaler Dateien auf einem git pull?

Das Szenario ist folgendes:

  • Ein Teammitglied ändert die Vorlagen für eine Website, an der wir arbeiten
  • Sie fügen einige Bilder zum Bilderverzeichnis hinzu (vergessen jedoch, sie unter Quellcodeverwaltung hinzuzufügen).
  • Sie schicken mir die Bilder später per Post
  • Ich füge die Bilder unter der Quellcodeverwaltung hinzu und schiebe sie zusammen mit anderen Änderungen auf GitHub
  • Sie können keine Updates von GitHub abrufen, da Git ihre Dateien nicht überschreiben möchte.

Dies ist der Fehler, den ich erhalte:

Fehler:Die nicht verfolgte Arbeitsbaumdatei „public/images/icon.gif“ würde durch die Zusammenführung überschrieben werden

Wie zwinge ich Git, sie zu überschreiben?Die Person ist ein Designer – normalerweise löse ich alle Konflikte von Hand, sodass der Server über die neueste Version verfügt, die sie nur auf ihrem Computer aktualisieren muss.

War es hilfreich?

Lösung

Wichtig: Wenn Sie alle lokalen Änderungen haben, werden sie verloren. Mit oder ohne --hard Option, alle lokalen Commits, die nicht gedrückt haben, gehen verloren. [*]

Wenn Sie alle Dateien, die nicht raupen von Git (z hochgeladen Benutzer-Content), werden diese Dateien nicht beeinträchtigt werden.


Ich denke, das ist der richtige Weg:

git fetch --all

Dann haben Sie zwei Möglichkeiten:

git reset --hard origin/master

ODER Wenn Sie auf einem anderen Zweig sind:

git reset --hard origin/<branch_name>

Erklärung:

git fetch lädt die neueste aus der Ferne, ohne zu versuchen, etwas zu fusionieren oder rebase.

Dann setzt die git reset den Master-Zweig zu dem, was Sie gerade geholt. Die --hard Option ändert alle Dateien in Ihrem Arbeitsbaum die Dateien in origin/master übereinstimmen


Pflegen aktuelle lokale Commits

[*] : Es ist erwähnenswert, dass es möglich ist, aktuelle lokale Commits zu erhalten, indem eine Filiale von master vor dem Zurücksetzen:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Nach diesem alle alten Commits in new-branch-to-save-current-commits gehalten werden.

Nicht festgeschriebene Änderungen

Nicht festgeschriebene Änderungen jedoch (auch inszeniert), verloren. Stellen Sie sicher, beiseite zu schaffen und sich zu verpflichten, alles, was Sie brauchen.

: Dazu können Sie das folgende laufen
git stash

Und dann diese unbestätigten Änderungen erneut anwenden:

git stash pop

Andere Tipps

Versuchen Sie folgendes:

git reset --hard HEAD
git pull

Es sollte das tun, was Sie wollen.

ACHTUNG: git clean löscht alle Ihre untracked Dateien / Verzeichnisse und kann nicht rückgängig gemacht werden können,

.

Manchmal nur clean -f hilft nicht. Falls Sie untracked DIRECTORIES haben, -d Option auch benötigt:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

ACHTUNG: git clean löscht alle Ihre untracked Dateien / Verzeichnisse und kann nicht rückgängig gemacht werden können,

.

Betrachten wir zunächst -n (--dry-run) Flag verwendet. Dies zeigt Ihnen, was, ohne tatsächlich etwas zu löschen gelöscht werden:

git clean -n -f -d

Beispiel Ausgabe:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

Wie Igel Ich denke, die Antworten sind schrecklich. Aber obwohl Hedgehog Antwort könnte besser sein, ich glaube nicht, dass es so elegant ist, wie es sein könnte. Die Art, wie ich gefunden, dies zu tun ist durch „holen“ und „merge“ mit einer definierten Strategie. Welche sollte es so machen, dass Ihre lokalen Änderungen beibehalten werden, solange sie nicht eine der Dateien, die Sie mit einem Überschreiben zu zwingen versuchen.

Erster eine Festschreibung der Änderungen tun

 git add *
 git commit -a -m "local file server commit message"

Dann die Änderungen holen und überschreiben, wenn es einen Konflikt gibt

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"- X" ist eine Option Name, und "ihr" ist der Wert für diese Option. Sie wählen „ihre“ Änderungen zu verwenden, statt „Ihre“ ändert sich, wenn es einen Konflikt gibt.

Statt tun:

git fetch --all
git reset --hard origin/master

Ich würde raten Sie folgendermaßen vorgehen:

git fetch origin master
git reset --hard origin/master

Keine Notwendigkeit, alle Fernbedienungen und Zweige zu holen, wenn Sie auf die Herkunft / Master-Zweig rechts zurücksetzen gehen?

Es sieht aus wie der beste Weg ist, zuerst zu tun:

git clean

Um alle untracked Dateien zu löschen und dann mit dem üblichen git pull weiter ...

Achtung, Dadurch wird permanent Ihre Dateien löschen, wenn Sie ein beliebiges Verzeichnis haben / * Einträge in Ihrer gitignore Datei.

Einige Antworten scheinen schrecklich zu sein. Schreckliche im Sinne dessen, was passiert ist @Lauri von David Avsajanishvili Vorschlag folgen.

Rather (git> v1.7.6):

git stash --include-untracked
git pull

Sie können später die Stash Geschichte reinigen.

Manuell, one-by-one:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutally, all-at-once:

$ git stash clear

Natürlich, wenn Sie möchten, gehen Sie zurück zu dem, was Sie verstaute:

$ git stash list
...
$ git stash apply stash@{5}

Sie können diesen Befehl hilfreich wegzuwerfen lokale Änderungen finden:

git checkout <your-branch> -f

Und dann eine Bereinigung tun (entfernt untracked Dateien aus dem Arbeitsbaum):

git clean -f

Wenn Sie untracked Verzeichnisse zusätzlich zu untracked Dateien entfernen:

git clean -fd

Statt mit git pull der Verschmelzung, versuchen Sie dies:

git fetch --all

, gefolgt von:

git reset --hard origin/master.

Das einzige, was für mich gearbeitet wurde:

git reset --hard HEAD~5

Dadurch werden Sie fünf Commits zurück und dann mit

git pull

Ich fand, dass wie ein Git fusionieren rückgängig zu machen.

Das Problem bei all diesen Lösungen ist, dass sie alle entweder zu komplex sind, oder ein noch größeres Problem ist, dass sie alle untracked Dateien aus dem Web-Server zu entfernen, was wir nicht wollen, da es immer Konfigurationsdateien benötigt werden die sich auf dem Server und nicht im Git-Repository.

Hier ist die sauberste Lösung, die wir verwenden:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Der erste Befehl holt neueste Daten.

  • Der zweite Befehl prüft, ob es irgendwelche Dateien, die dem Repository hinzugefügt werden, und löscht diese untracked Dateien aus dem lokalen Repository, die Konflikte verursachen würde.

  • Der dritte Befehl überprüft-out alle Dateien, die lokal geändert wurden.

  • Schließlich haben wir einen Zug auf die neueste Version zu aktualisieren, aber diesmal ohne Konflikte, da untracked-Dateien, die in dem Repo sind nicht mehr existieren und alle lokal geänderte Dateien sind bereits die gleiche wie in das Repository.

Zunächst einmal versuchen, die Standardmethode:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

Warnung : Über Befehle können Ergebnisse in Daten / Dateien Verlust nur, wenn Sie sie nicht begangen! Wenn Sie nicht sicher sind, die Backup machen erste Ihres gesamten Repositoryordner.

ziehen Sie sie dann wieder ein.

Wenn oben wird nicht helfen, und Sie nicht über Ihre untracked Dateien / Verzeichnisse Pflege (machen die Sicherung zunächst nur für den Fall), versuchen Sie die folgenden Schritte aus:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

Dies entfernt alle git-Dateien (Angebote solange Vorrat reicht .git/ dir, wo Sie alle Commits haben), und ziehen Sie es erneut.


Warum git reset HEAD --hard könnte in einigen Fällen versagen?

  1. Benutzerdefinierte Regeln in .gitattributes file

    eol=lf Regel in .gitattributes Mit git dazu führen könnte, einige Dateiänderungen zu ändern, indem CRLF Zeilenende in LF in einigen Textdateien zu konvertieren.

    Wenn das der Fall ist, haben Sie diese CRLF / LF Änderungen zu übernehmen (von ihnen in git status Überprüfung) oder versuchen: git config core.autcrlf false temporäre sie ignorieren

  2. .
  3. Dateisystem Inkompatibilität

    Wenn Sie Datei-System verwenden, die keine Berechtigung Attribute unterstützt. Im Beispiel haben Sie zwei Repositories, einen auf Linux / Mac (ext3 / hfs+) und ein weiteres auf FAT32 / NTFS-basiertes Datei-System.

    Wie Sie sehen, gibt es zwei verschiedene Arten von Dateisystemen, so dass die eine, die Unix-Rechte nicht grundsätzlich unterstützen kann nicht Dateiberechtigungen für System-Reset, die nicht diese Art von Berechtigungen nicht unterstützt, so egal wie --hard Sie versuchen, git immer ein paar "Veränderungen" erkennen.

Ich hatte das gleiche Problem. Niemand hat mir diese Lösung, aber es funktionierte für mich.

Ich löse es durch:

  1. Löschen Sie alle Dateien. Lassen Sie das .git Verzeichnis.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Jetzt funktioniert es.

Bonus:

Im Gespräch von Zug- / Abruf- / verschmelzen in den vorherigen Antworten, ich mag einen interessanten und produktiven Trick teilen,

git pull --rebase

Das obige Befehl ist das nützlichste Befehl in meinem Git Leben, das viel Zeit gespeichert.

Vor dem Drücken auf dem Server Ihre neu verpflichten, versuchen Sie diesen Befehl, und es wird die neuesten Server-Änderungen (mit einem Abruf + merge) und platzieren Sie Ihre commit an der Spitze im Git Protokoll automatisch synchronisieren. Es gibt keine Notwendigkeit, über manuelle Pull / merge sorgen.

Detaillierte Informationen finden Sie in Was bedeutet "git pull --rebase" tun? .

Ich hatte ein ähnliches Problem. Ich hatte dies zu tun:

git reset --hard HEAD
git clean -f
git pull

Auf der Grundlage meiner eigenen ähnlichen Erfahrungen, ist die Lösung angeboten von Strahinja Kustudić oben bei weitem die beste. Wie andere haben darauf hingewiesen, einfach wird Hard-Reset tun entfernen alle die untracked Dateien, die viele Dinge enthalten könnte, die Sie nicht entfernt werden sollen, wie zum Beispiel Konfigurationsdateien. Was ist sicherer, ist nur die Dateien zu entfernen, die im Begriff sind, hinzugefügt werden, und was das betrifft, würden Sie wahrscheinlich wollen auch alle lokal geänderten Dateien zur Kasse, die im Begriff sind, aktualisiert werden.

Das im Sinn, ich Kustudić Skript aktualisiert genau das zu tun. Ich reparierte auch einen Tippfehler (ein fehlenden "im Original).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

I zusammengefasst andere Antworten. Sie können git pull ohne Fehler ausführen:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

Warnung . Dieses Skript ist sehr mächtig, so dass Sie Ihre Änderungen verlieren

Ich glaube, es gibt zwei mögliche Ursachen von Konflikten, die separat gelöst werden müssen, und soweit ich keine der genannten Antworten befasst sich mit beiden sagen kann:

  • Lokale Dateien, die untracked Bedarf gelöscht werden soll, entweder manuell (sicherer) oder wie in anderen Antworten vorgeschlagen, durch git clean -f -d

  • Lokale Commits, die nicht auf dem Remote-Zweig ist, muß ebenfalls gelöscht werden. IMO der einfachste Weg, dies zu erreichen, ist mit: git reset --hard origin/master (ersetzen ‚Master‘ durch, was Zweig dem Sie arbeiten, und ein git fetch origin läuft zuerst)

Es scheint, als ob sich die meisten Antworten hier auf Folgendes konzentrieren master Zweig;Es gibt jedoch Zeiten, in denen ich an zwei verschiedenen Stellen am selben Feature-Zweig arbeite und möchte, dass sich ein Rebase an einer Stelle auch an der anderen Stelle widerspiegelt, ohne dass ich viel durch die Arbeit springen muss.

Basierend auf einer Kombination von Die Antwort von RNA Und Toreks Antwort auf eine ähnliche Frage, ich habe mir Folgendes ausgedacht, was hervorragend funktioniert:

git fetch
git reset --hard @{u}

Wenn Sie dies von einem Zweig aus ausführen, wird nur Ihr lokaler Zweig auf die Upstream-Version zurückgesetzt.

Dies kann gut in einen Git-Alias ​​​​eingefügt werden (git forcepull) sowie:

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Oder in Ihrem .gitconfig Datei:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

Genießen!

Eine einfachere Möglichkeit wäre:

git checkout --theirs /path/to/file.extension
git pull origin master

Dies wird Ihre lokale Datei mit der Datei auf git außer Kraft setzen

Ich hatte das gleiche Problem und aus irgendeinem Grunde, auch ein git clean -f -d würde es nicht tun. Hier ist der Grund: Aus irgendeinem Grunde, wenn die Dateien von Git ignoriert wird (über einen .gitignore Eintrag, nehme ich an), es stört noch versehentliche über dies mit einem späteren ziehen , sondern sauber wird es nicht entfernen, es sei denn, Sie -x hinzufügen.

Ich löste nur das selbst durch:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

, wo der letzte Befehl eine Liste von dem, was Ihre lokalen Änderungen waren gibt. Halten Sie die „tmp“ -Zweig modifizierende bis es akzeptabel ist, und dann zurück auf fusionieren Master mit:

git checkout master && git merge tmp

Für das nächste Mal, können Sie wahrscheinlich diese in eine sauberere Art und Weise handhaben von „git stash Zweig“ aufzublicken obwohl Stash ist wahrscheinlich, dass Sie Probleme auf den ersten paar Versuche, um zu bewirken, erste Experiment so tun auf einem unkritischen Projekt .. .

Ich kenne eine viel einfacher und weniger schmerzhafte Methode:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

Das ist es!

Ich habe eine seltsame Situation, dass weder git clean oder git reset funktioniert. Ich habe die widersprüchliche Datei von git index zu entfernen, indem Sie das folgende Skript auf jeder untracked Datei mit:

git rm [file]

Dann bin ich in der Lage ganz gut zu ziehen.

Diese vier Befehle funktionieren für mich.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Um zu überprüfen, / ziehen, nachdem diese Befehle ausführen

git pull origin master

habe ich versucht, eine Menge, aber endlich Erfolg mit diesen Befehlen.

Trotz der ursprünglichen Frage, die Top-Antworten können Probleme für die Menschen führen, die ein ähnliches Problem haben, aber nicht wollen, ihre lokalen Dateien verlieren. Zum Beispiel, siehe Al-Punk und crizCraig Kommentare.

Die folgende Version verpflichtet lokale Änderungen in einem temporären Zweig (tmp), überprüft den ursprünglichen Zweig aus (was ich gehe davon aus master ist) und führt das Updates. Sie können dies tun mit stash, aber ich habe es gefunden in der Regel einfacher, einfach den Zweig verwenden / Merge-Ansatz.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

Dabei nehmen wir an, die anderen Repository ist origin master.

Just do

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

So können Sie alle unerwünschten Nebenwirkungen zu vermeiden, wie Dateien oder Verzeichnisse löschen, die Sie behalten wollten, etc.

Setzen Sie den Index und den Kopf zu origin/master, aber nicht zurücksetzen den Arbeitsbaum:

git reset origin/master

Ich habe alle Antworten durchgelesen, aber ich suchte nach einem einzigen Befehl, um dies zu tun.Hier ist, was ich getan habe.Ein Git-Alias ​​zu .gitconfig hinzugefügt

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

Führen Sie Ihren Befehl aus als

git fp origin master

gleichwertig

git fetch origin master
git reset --hard origin/master

Anforderungen:

  1. verfolgen lokale Änderungen so niemand hier jemals sie verliert.
  2. Machen Sie das lokale Repository die Remote Herkunft Repository entsprechen.

Lösung:

  1. Stash die lokalen Änderungen.
  2. Fetch mit einem clean Dateien und Verzeichnisse Ignorieren .gitignore und Hard-Reset Herkunft .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top