Git Pull hält lokale Änderungen

132

Wie kann ich ein Git-Projekt sicher aktualisieren (ziehen) und bestimmte Dateien unberührt lassen, selbst wenn Änderungen vorgelagert sind?

myrepo / config / config.php

Gibt es eine Möglichkeit, selbst wenn diese Datei auf der Fernbedienung geändert wurde, beim Git-Pull alles andere zu aktualisieren, aber diese Datei bleibt unverändert (nicht einmal zusammengeführt)?

PS. Ich muss tun, was ich verlange, weil ich nur git-basierte Bereitstellungsskripte schreibe. Ich kann Konfigurationsdateien nicht in Vorlagen ändern.

Ich brauche also eine Möglichkeit, Update-Skripte zu schreiben, die nicht verlieren, was lokal geändert wurde. Ich hatte auf etwas so Einfaches gehofft wie:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

dann git pull

Johnny Everson
quelle
Sind die Änderungen config.phpzugesagt?
Mark Longair
Es ist nicht verpflichtet. Ich würde lieber nicht müssen
Johnny Everson
@JhonnyEverson: Es ist die gleiche allgemeine Problemklasse (Sie haben eine Konfigurationsdatei und möchten keine spezifischen Einstellungen
festschreiben

Antworten:

248

Es gibt eine einfache Lösung, die auf Git Stash basiert. Bewahren Sie alles auf, was Sie geändert haben, ziehen Sie alle neuen Dinge heraus und wenden Sie Ihren Vorrat an.

git stash
git pull
git stash pop

Bei Stash Pop kann es zu Konflikten kommen. In dem von Ihnen beschriebenen Fall würde es tatsächlich einen Konflikt für geben config.php. Die Lösung des Konflikts ist jedoch einfach, da Sie wissen, dass das, was Sie in den Vorrat legen, das ist, was Sie wollen. Also mach das:

git checkout --theirs -- config.php
GoZoner
quelle
5
Dieser Git Checkout - ihr Befehl ist sehr verwirrend. Es hat einmal getan, was ich wollte, und ein anderes Mal etwas wirklich Schlimmes. Hast du eine gute Dokumentation dazu?
Milimetric
3
Ja, manchmal können 'ihre' und 'unsere' verwirrend sein. In einem git merge'uns' befindet sich das, was sich derzeit im Arbeitsverzeichnis befindet. Aber für ein git rebase(oder git rebase -onto) kann die Bedeutung getauscht werden.
GoZoner
1
git stash , git pull , git stash apply Sie können das git stash drop
Versteck löschen
11
Die Sache mit git ist, dass man verstehen muss, was es tun wird. Die andere Sache mit Git ist, dass es selbst für kluge Leute oft sehr schwierig ist zu verstehen, was Git tun wird.
Brad Thomas
1
Sie sollten überprüfen, ob tatsächlich etwas zu verstauen ist. Andernfalls würden Sie versteckte Änderungen von einem früheren entfernen git stash.
Jörn Reimerdes
15

Wenn Sie eine Datei in Ihrem Repo haben, die von den meisten Pullern angepasst werden soll, benennen Sie die Datei in eine ähnliche Datei um config.php.templateund fügen Sie sie config.phpzu Ihrer hinzu .gitignore.

KurzedMetal
quelle
5
Überprüfen Sie auch diese Antwort . Sie können sie verwenden .gitattributes, um Ihre Änderungen beim Zusammenführen immer beizubehalten.
KurzedMetal
Das entspricht eher dem, was ich brauchte. Die Vorlagensache ist die elegante Lösung, aber ich fürchte, ich kann sie nicht verwenden, da ich nur Bereitstellungsskripte schreibe.
Johnny Everson
6

Update: Dies beantwortet buchstäblich die gestellte Frage, aber ich denke, KurzedMetals Antwort ist wirklich das, was Sie wollen.

Vorausgesetzt, dass:

  1. Du bist auf dem Ast master
  2. Die vorgelagerte Niederlassung befindet sich masterinorigin
  3. Sie haben keine nicht festgeschriebenen Änderungen

.... du könntest es tun:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

Sie können dafür einen Alias ​​erstellen, wenn Sie dies häufig tun müssen. Beachten Sie, dass Änderungen, an denen Sie nicht festgeschrieben haben config/config.php, diese wegwerfen würden.

Mark Longair
quelle
4

Wir können auch Git Pull mit Rebase versuchen

git pull --rebase origin dev
Bhavesh Maniya
quelle
1

Um die Frage zu beantworten: Wenn Sie bestimmte Dateien einer Kasse ausschließen möchten, können Sie die Sparse-Kasse verwenden

1) .git/info/sparse-checkoutDefinieren Sie in , was Sie behalten möchten. Hier wollen wir alle (*) außer (beachten Sie das Ausrufezeichen) config.php:

 /*
 !/config.php

2) Sagen Sie git, dass Sie Sparse-Checkout berücksichtigen möchten

 git config core.sparseCheckout true

3) Wenn Sie diese Datei bereits lokal haben, machen Sie das, was git bei einem spärlichen Checkout macht (sagen Sie ihm, dass diese Datei ausgeschlossen werden muss, indem Sie das Flag "skip-worktree" darauf setzen).

git update-index --skip-worktree config.php

4) Genießen Sie ein Repository, in dem Ihre config.php-Datei Ihnen gehört - unabhängig davon, welche Änderungen im Repository vorgenommen wurden.


Bitte beachten Sie, dass Konfigurationswerte NICHT in der Quellcodeverwaltung enthalten sein sollten:

  • Dies ist eine potenzielle Sicherheitsverletzung
  • Es verursacht Probleme wie dieses bei der Bereitstellung

Dies bedeutet, dass Sie sie ausschließen müssen (vor dem ersten Festschreiben in .gitignore ablegen müssen) und auf jeder Instanz, auf der Sie Ihre App auschecken, die entsprechende Datei erstellen müssen (indem Sie eine "Vorlagendatei" kopieren und anpassen).

Beachten Sie, dass .gitignore keine Auswirkungen mehr hat, sobald eine Datei von git übernommen wurde.

Sobald die Datei der Quellcodeverwaltung unterliegt, haben Sie nur zwei Möglichkeiten (): - Erstellen Sie den gesamten Verlauf neu, um die Datei zu entfernen (mit git filter-branch) - Erstellen Sie ein Commit, mit dem die Datei entfernt wird. Es ist, als würde man einen verlorenen Kampf führen, aber manchmal muss man damit leben.

Pierre-Olivier Vares
quelle
0

Wenn es sich um lokale, nicht festgeschriebene Änderungen handelt, vermeiden Sie Zusammenführungskonflikte beim Ziehen.

git stash save
git pull
git stash pop

Siehe - https://happygitwithr.com/pull-tricky.html

Ujjwal Roy
quelle