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?





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.


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.


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}}

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

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 .

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


15

Sie können diesen Befehl versuchen

git clean -df

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.


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.

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.


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


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.


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


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.