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?
Antworten:
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
Dadurch werden alle Dateien verfolgt, alle lokalen Änderungen an diesen Dateien entfernt und die Dateien dann vom Server abgerufen.
quelle
git add -A .; git stash
arbeitete für mich. Diegit add *
Variante beschwerte sich über ignorierte Pfade.Sie können den Befehl versuchen, die nicht verfolgten Dateien aus dem lokalen zu löschen
Git 2.11 und neuere Versionen:
Ältere Versionen von Git:
Wo
-d
kann 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.
quelle
-i
fü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 :-(-x
dies weh tun kann.Die einzigen Befehle, die für mich funktionierten, waren:
quelle
Ein Ersatz dafür
git merge
überschreibt nicht verfolgte DateienDie folgenden Kommentare verwenden 'FOI' für die 'Dateien von Interesse', die Dateien, die
Ein Ersatz dafür
git pull
überschreibt nicht verfolgte Dateienpull = fetch + merge
Alsogit fetch
folgen wir demgit checkout -f, git checkout, git merge
obigen Trick.Ausführliche Erklärung
git merge -f
existiert nicht,git checkout -f
tut es aber .Wir werden
git checkout -f
+ verwendengit 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).
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-branch
wir wechseln, nicht vorhanden ist.Schritt 3. Nachdem das FOI nicht vorhanden ist, werden beim Zusammenführen im Spenderzweig keine nicht verfolgten Dateien überschrieben, sodass keine Fehler angezeigt werden.
quelle
Entfernen Sie alle nicht verfolgten Dateien:
quelle
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;)
quelle
Sie können diesen Befehl versuchen
quelle
Update - eine bessere Version
Dieses Tool ( https://github.com/mklepaczewski/git-clean-before-merge ) wird:
git pull
Entsprechungen identisch sind.git pull
Entsprechungen identisch ist ,git pull
Version ,--pretend
Option, 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 pull
und löscht sie.und dann einfach:
Dies ist kein Git-Porzellan-Befehl. Überprüfen Sie daher immer genau, was damit geschehen würde:
Erklärung - weil ein Liner beängstigend ist:
Hier ist eine Aufschlüsselung dessen, was es tut:
git pull 2>&1
- Erfassen Sie diegit pull
Ausgabe und leiten Sie alles auf stdout um, damit wir es problemlos erfassen könnengrep
.grep -E '^\s
- Die Absicht ist, die Liste der nicht verfolgten Dateien zu erfassen, die von überschrieben würdengit pull
. Die Dateinamen enthalten eine Reihe von Leerzeichen, sodass wir sie verwenden, um sie abzurufen.cut -f2-
- Entfernen Sie Leerzeichen vom Anfang jeder in 2 erfassten Zeile.xargs -I {} rm -rf "{}"
- Wir müssenxargs
alle Dateien durchlaufen, ihren Namen in "{}" speichern undrm
für jede von ihnen aufrufen . Wir-rf
erzwingen 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.
quelle
git pull
durchgit checkout <branch_name>
Wenn Sie erwägen, das
-f
Flag 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 ;-Pquelle
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:
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.
quelle
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.
Mit diesem Befehl können Sie Ihre lokalen versteckten Dateien überprüfen.
git stash list
quelle
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 apply
zum Erfolg. Dann habe ich ignoreCase wieder in geändertfalse
. 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.
quelle
git pull -f
danngit checkout .
. Was ein Alptraum.Weder Clean / Reset / Hard Checkout / Rebase hat bei mir funktioniert.
Also habe ich gerade Dateien entfernt, über die sich git beschwert hat *
* 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).
quelle
In meinem Fall, als ich dieses Problem hatte. Ich hatte eine lokale Datei, die ich auf der Fernbedienung umbenannt hatte.
Beim Versuch,
git pull
Git 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 pull
bis ichgit rm
den alten Dateinamen verwendet hatte (was zunächst aufgrund meiner dummen Idee, ihn umzubenennen, nicht offensichtlich war).quelle
Wenn Sie die Dateien unter .gitignore geschrieben haben, entfernen Sie die Dateien und führen Sie git pull erneut aus. Das hat mir geholfen.
quelle