Die folgenden nicht verfolgten Arbeitsbaumdateien würden durch Zusammenführen überschrieben, aber das ist mir egal

343

In meinem Zweig hatte ich einige Dateien in .gitignore

In einem anderen Zweig befinden sich diese Dateien nicht.

Ich möchte die verschiedenen Zweige in meinen zusammenführen, und es ist mir egal, ob diese Dateien nicht mehr ignoriert werden oder nicht.

Leider verstehe ich das:

Die folgenden nicht verfolgten Arbeitsbaumdateien werden durch Zusammenführen überschrieben

Wie würde ich meinen Pull-Befehl ändern, um diese Dateien zu überschreiben, ohne dass ich diese Dateien selbst suchen, verschieben oder löschen muss?

CQM
quelle
3
Mögliches Duplikat von Force Git zum Überschreiben lokaler Dateien beim Ziehen
Balog Pal
1
Dies ist die beste Antwort, da nur die Dateien entfernt werden, die Sie am Zusammenführen hindern
RedX

Antworten:

537

Das Problem ist, dass Sie die Dateien nicht lokal verfolgen, sondern identische Dateien remote verfolgt werden. Um Ihr System zu "ziehen", müsste das System die lokalen Dateien überschreiben, die nicht versioniert sind.

Versuche zu rennen

git add * 
git stash
git pull

Dadurch werden alle Dateien verfolgt, alle lokalen Änderungen an diesen Dateien entfernt und die Dateien dann vom Server abgerufen.

userFog
quelle
59
git add -A .; git stasharbeitete für mich. Die git add *Variante beschwerte sich über ignorierte Pfade.
Imsky
11
Ich habe versucht, git add., Git stash, git pull. Es hat funktioniert, aber ich verstehe immer noch nicht warum?
ARK
1
Für mich hatte ich eine entfernte Datei, die verfolgt wurde, und ich hatte eine Datei mit dem gleichen Namen in meinem lokalen Repo, die nicht verfolgt wurde. Wenn Sie also die lokale Datei hinzufügen, die Änderungen speichern und dann abrufen, sollte die entfernte Datei die lokale Datei überschreiben.
UserFog
2
Hier ist ein guter Link, um zu verstehen, wie dies funktioniert, wenn jemand interessiert ist. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay
2
//, Das geht nicht wirklich zu weit in den Zweck dieses Fehlers.
Nathan Basanese
136

Sie können den Befehl versuchen, die nicht verfolgten Dateien aus dem lokalen zu löschen

Git 2.11 und neuere Versionen:

git clean  -d  -f .

Ältere Versionen von Git:

git clean  -d  -f ""

Wo -dkann durch Folgendes ersetzt werden:

  • -x ignorierte Dateien werden ebenfalls entfernt sowie Dateien, die Git unbekannt sind.

  • -d Entfernen Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien.

  • -f ist erforderlich, um es zum Laufen zu zwingen.

Hier ist der Link , der ebenfalls hilfreich sein kann.

sKhan
quelle
23
Ich würde -ifür den interaktiven Modus hinzufügen . Neben dem Löschen des unerwünschten Verzeichnisses habe ich auch gerade meine Benutzereinstellungen für das Projekt gelöscht :-(
dumbledad
6
Es lohnt sich, die Kommentare zu einer ähnlichen Antwort zu durchsuchen, da -xdies weh tun kann.
Dumbledad
10
Aber das ist eine sehr gefährliche und nicht unlösbare Aufgabe !! Sie könnten viele Dateien verlieren! ACHTUNG!!
Mohamed Kawsara
16
Dadurch wurden alle meine Herstellerverzeichnisse in Slim Framework gelöscht . Seien Sie sehr vorsichtig mit diesem Befehl
RousseauAlexandre
2
Sie sollten das 'x' aus Ihrer Antwort entfernen. Es ist sehr gefährlich!
Earl3s
106

Die einzigen Befehle, die für mich funktionierten, waren:

git fetch --all
git reset --hard origin/{{your branch name}}
Asaf Manassen
quelle
5
Es ist zu beachten, dass diese Antwort benötigt wird, wenn Sie Submodule entfernt und als Bibliotheken im ursprünglichen Repo eingelesen haben. Ich brauchte eine Antwort und das war alles, was funktionierte.
Routhinator
Ich hatte keine Submodule und versuchte es mit Git Clean und Git Stash, wie in den anderen Antworten vorgeschlagen, aber nur das half.
kslstn
Nachdem ich eine Vielzahl von Submodulen gelöscht hatte, war dies das einzige, was auch für mich funktionierte. Besonders hervorzuheben ist, dass ich bei einer Datei auch ein Problem mit der Groß- und Kleinschreibung hatte. Ex. XML.php bis Xml.php in meinem Herstellerordner von Composer.
KazaJhodo
1
Es hat auch bei mir funktioniert. Können Sie bitte erklären, was los ist? Ich verstehe es nicht
Dimitris Karamanis
1
Dadurch wurden zwei meiner lokalen Commits gelöscht. Seien Sie vorsichtig, bevor Sie dies verwenden!
David Cian
27

Ein Ersatz dafür git mergeüberschreibt nicht verfolgte Dateien

Die folgenden Kommentare verwenden 'FOI' für die 'Dateien von Interesse', die Dateien, die

  • existieren in der Spenderbranche,
  • existieren nicht im empfangenden Zweig,
  • und blockieren die Zusammenführung, weil sie in Ihrem Arbeitsverzeichnis vorhanden und nicht verfolgt sind.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Ein Ersatz dafür git pullüberschreibt nicht verfolgte Dateien

pull = fetch + mergeAlso git fetchfolgen wir dem git checkout -f, git checkout, git mergeobigen Trick.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Ausführliche Erklärung

git merge -fexistiert nicht, git checkout -ftut es aber .

Wir werden git checkout -f+ verwenden git checkout, um die interessierenden Dateien zu entfernen (siehe oben), und dann kann Ihre Zusammenführung normal fortgesetzt werden.

Schritt 1. Dieser Schritt ersetzt zwangsweise nicht verfolgte FOI durch verfolgte Versionen des Spenderzweigs (er überprüft auch den Spenderzweig und aktualisiert den Rest des Arbeitsverzeichnisses).

git checkout -f donor-branch

Schritt 2. In diesem Schritt wird der FOI entfernt, da er in unserem aktuellen (Spender-) Zweig verfolgt wird und in dem Zweig, zu dem receiving-branchwir wechseln, nicht vorhanden ist.

git checkout receiving-branch

Schritt 3. Nachdem das FOI nicht vorhanden ist, werden beim Zusammenführen im Spenderzweig keine nicht verfolgten Dateien überschrieben, sodass keine Fehler angezeigt werden.

git merge donor-branch
Esteis
quelle
3
Dies ist zu sauber, um die 7. oder 8. Antwort zu sein!
Majed DH
1
Danke, @MajedDH, du hast meinen Tag gemacht! <3
Esteis
1
Das hier war das Instafix, nach dem ich gesucht habe! Vielen Dank
AFM-Horizon
Ich freue mich, Ihnen geholfen zu haben, @ AFM-Horizon!
Esteis
20

Entfernen Sie alle nicht verfolgten Dateien:

git clean  -d  -fx .
Abhishek Goel
quelle
8
Das Löschen möglicherweise verwendeter Dateien in einem Projekt sollte nicht die richtige Lösung sein
Erdinç Çorbacı
4
Huch, auch IDE-Dateien bereinigt :(
Kisna
18

Wenn dies eine einmalige Operation ist, können Sie einfach alle nicht verfolgten Dateien aus dem Arbeitsverzeichnis entfernen, bevor Sie den Pull ausführen. Lesen Sie Wie entferne ich lokale (nicht verfolgte) Dateien aus dem aktuellen Git-Arbeitsbaum? Informationen zum Entfernen aller nicht verfolgten Dateien.

Achten Sie darauf, nicht versehentlich nicht verfolgte Dateien zu entfernen, die Sie noch benötigen;)

mnagel
quelle
15

Sie können diesen Befehl versuchen

git clean -df
Amr Mohammed
quelle
5
Was nützt es, nicht verfolgte Verzeichnisse zu löschen? Sie können wertvoll sein, wissen Sie.
Zhekaus
Können Sie erklären, was es tut?
Safak Ozkan
12

Update - eine bessere Version

Dieses Tool ( https://github.com/mklepaczewski/git-clean-before-merge ) wird:

  • Löschen Sie nicht verfolgte Dateien, die mit ihren git pullEntsprechungen identisch sind.
  • Änderungen an geänderten Dateien zurücksetzen, deren geänderte Version mit ihren git pullEntsprechungen identisch ist ,
  • Melden Sie geänderte / nicht verfolgte Dateien, die sich von ihren unterscheiden git pull Version ,
  • Das Tool verfügt über die --pretendOption, keine Dateien zu ändern.

Alte Version

Wie unterscheidet sich diese Antwort von anderen Antworten?

Die hier vorgestellte Methode entfernt nur Dateien, die durch Zusammenführen überschrieben würden. Wenn Sie andere nicht verfolgte (möglicherweise ignorierte) Dateien im Verzeichnis haben, werden diese durch diese Methode nicht entfernt.

Die Lösung

Dieses Snippet extrahiert alle nicht verfolgten Dateien, die von überschrieben würden, git pullund löscht sie.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

und dann einfach:

git pull

Dies ist kein Git-Porzellan-Befehl. Überprüfen Sie daher immer genau, was damit geschehen würde:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Erklärung - weil ein Liner beängstigend ist:

Hier ist eine Aufschlüsselung dessen, was es tut:

  1. git pull 2>&1- Erfassen Sie die git pullAusgabe und leiten Sie alles auf stdout um, damit wir es problemlos erfassen könnengrep .
  2. grep -E '^\s - Die Absicht ist, die Liste der nicht verfolgten Dateien zu erfassen, die von überschrieben würden git pull . Die Dateinamen enthalten eine Reihe von Leerzeichen, sodass wir sie verwenden, um sie abzurufen.
  3. cut -f2- - Entfernen Sie Leerzeichen vom Anfang jeder in 2 erfassten Zeile.
  4. xargs -I {} rm -rf "{}"- Wir müssen xargsalle Dateien durchlaufen, ihren Namen in "{}" speichern und rmfür jede von ihnen aufrufen . Wir -rferzwingen das Löschen und Entfernen von nicht verfolgten Verzeichnissen.

Es wäre toll, die Schritte 1 bis 3 durch einen Porzellanbefehl zu ersetzen, aber mir ist kein Äquivalent bekannt.

matt
quelle
Vielen Dank, ich habe oft nicht verfolgte Dateien in meinem Arbeitsverzeichnis, die ich nicht löschen oder festschreiben möchte. In meinem Fall musste ich git pulldurchgit checkout <branch_name>
mihow
6

Wenn Sie erwägen, das -fFlag zu verwenden, können Sie es zuerst als Trockenlauf ausführen. Nur dass Sie im Voraus wissen, welche interessante Situation Sie als nächstes haben werden ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
Maarten
quelle
6

Zusätzlich zur akzeptierten Antwort können Sie die Dateien natürlich entfernen, wenn sie nicht mehr benötigt werden, indem Sie die Datei angeben:

git clean -f '/path/to/file/'

Denken Sie daran, es zuerst mit dem Flag -n auszuführen, wenn Sie sehen möchten, welche Dateien von git clean entfernt werden. Beachten Sie, dass diese Dateien gelöscht werden. In meinem Fall waren sie mir sowieso egal, das war eine bessere Lösung für mich.

MMM
quelle
5

Eine Möglichkeit, dies zu tun, besteht darin, lokale Änderungen zu speichern und vom Remote-Repo abzurufen. Auf diese Weise verlieren Sie Ihre lokalen Dateien nicht, da die Dateien in den Speicher gelangen.

git add -A
git stash
git pull

Mit diesem Befehl können Sie Ihre lokalen versteckten Dateien überprüfen. git stash list

AHM Forhadul Islam
quelle
3

Für diejenigen, die es nicht wissen, ignoriert git Unterschiede zwischen Groß- und Kleinbuchstaben in Dateien und Ordnern. Dies stellt sich als Albtraum heraus, wenn Sie sie mit einem anderen Fall in genau denselben Namen umbenennen.

Dieses Problem trat auf, als ich einen Ordner von "Petstore" in "petstore" umbenannte (Groß- und Kleinschreibung). Ich hatte meine .git / config-Datei so bearbeitet, dass Groß- und Kleinschreibung nicht mehr ignoriert wurde, Änderungen vorgenommen, meine Commits gequetscht und meine Änderungen gespeichert, um in einen anderen Zweig zu wechseln. Ich konnte meine versteckten Änderungen nicht auf diesen anderen Zweig anwenden.

Das Update, das funktioniert hat, bestand darin, meine .git / config-Datei vorübergehend zu bearbeiten, um den Fall vorübergehend wieder zu ignorieren. Dies führte git stash applyzum Erfolg. Dann habe ich ignoreCase wieder in geändert false. Ich habe dann alles hinzugefügt, außer den neuen Dateien im Petstore-Ordner, von denen Git seltsamerweise behauptete, sie seien aus irgendeinem Grund gelöscht worden. Ich habe meine Änderungen übernommen und bin dann gelaufengit reset --hard HEAD , um diese nicht verfolgten neuen Dateien zu entfernen. Mein Commit wurde genau wie erwartet angezeigt: Die Dateien im Ordner wurden umbenannt.

Ich hoffe, dass dies Ihnen hilft, meinen gleichen Albtraum zu vermeiden.

A. Davidson
quelle
Hat bei mir nicht funktioniert. Ich habe alle Dateien im Ordner gelöscht. Dann git pull -fdann git checkout .. Was ein Alptraum.
m.rufca
"Ja wirklich?" Es hat vor ein paar Wochen gut für mich funktioniert. Haben Sie versucht, Ihre gitconfig-Datei so zu bearbeiten, dass die Groß- und Kleinschreibung entsprechend ignoriert wird?
A. Davidson
Vielen Dank. Ich musste vom Master zusammenführen, nachdem ich das Gehäuse im Ordnerpfad repariert hatte. Ich konnte es mit git ignore case zusammenführen, danach habe ich die Groß- und Kleinschreibung einfach wieder aktiviert.
Rubenisme
3

Weder Clean / Reset / Hard Checkout / Rebase hat bei mir funktioniert.

Also habe ich gerade Dateien entfernt, über die sich git beschwert hat *

rm /path/to/files/that/git/complained/about

* Ich habe überprüft, ob diese Dateien entfernt werden können, indem ich ein brandneues Repo in einem separaten Ordner ausgecheckt habe (Dateien waren nicht vorhanden).

Michał Szkudlarek
quelle
1

In meinem Fall, als ich dieses Problem hatte. Ich hatte eine lokale Datei, die ich auf der Fernbedienung umbenannt hatte.

Beim Versuch, git pullGit zu sagen, wurde mir gesagt, dass der neue Dateiname nicht verfolgt wurde - was sich auf der Fernbedienung befand, obwohl er auf lokaler Ebene noch nicht vorhanden war.

Da es lokal keine Instanz davon gab, konnte ich dies nicht tun, git pullbis ich git rmden alten Dateinamen verwendet hatte (was zunächst aufgrund meiner dummen Idee, ihn umzubenennen, nicht offensichtlich war).

Tom Bush
quelle
0

Wenn Sie die Dateien unter .gitignore geschrieben haben, entfernen Sie die Dateien und führen Sie git pull erneut aus. Das hat mir geholfen.

uko akanowo
quelle