Git: Wie aktualisiere / checke ich eine einzelne Datei vom Remote Origin Master?

362

Das Szenario:

  1. Ich mache einige Änderungen in einer einzigen Datei lokal und lief git add, git commitundgit push
  2. Die Datei wird in das Remote-Ursprungs-Master-Repository verschoben
  3. Ich habe ein anderes lokales Repository, das über Capistrano mit der Methode "remote_cache" aus diesem Remote-Repository bereitgestellt wird
  4. Jetzt möchte ich nicht die gesamte Anwendung bereitstellen, sondern nur diese einzelne Datei aktualisieren / auschecken.

Ist das mit git irgendwie möglich? Ich konnte nichts finden, was funktionieren würde, und ich konnte es auch nicht herausfinden. Mit SVN habe ich gerade svn up fileund voila.

Foresth
quelle
19
Möglicherweise möchten Sie die akzeptierte Antwort in die Antwort ändern, die Ihre Frage tatsächlich beantwortet. ;)
Schritte
6
Nach mehr als 6 Jahren können wir davon ausgehen, dass dies nicht passieren wird @steps ...
Félix Gagnon-Grenier
Mit Git 2.23 (August 2019) ist es git restore -s origin/master -- path/to/file. Siehe meine Antwort unten .
VonC

Antworten:

914

Dies ist möglich (im bereitgestellten Repository).

git fetch
git checkout origin/master -- path/to/file

Der Abruf lädt alle zuletzt vorgenommenen Änderungen herunter, fügt sie jedoch nicht in Ihren aktuell ausgecheckten Code (Arbeitsbereich) ein.

Beim Auschecken wird der Arbeitsbaum mit der jeweiligen Datei aus den heruntergeladenen Änderungen aktualisiert ( origin/master).

Zumindest funktioniert dies bei diesen kleinen Tippfehlern, bei denen es seltsam ist, einen Zweig usw. zu erstellen, nur um ein Wort in einer Datei zu ändern.

qzio
quelle
1
Super praktisch, das hat super funktioniert. Ich musste eine composer.json-Datei herunterladen und ein Update ausführen, bevor ich den Rest der Site in der Produktion aktualisierte. Wenn ich die Dateien composer.json / lock manuell platziert hätte, würde es beim Ziehen zu Konflikten kommen, wenn die Dateien bereits vorhanden wären. Auf diese Weise erkannte git die Dateien ohne Beanstandung.
David
6
Dies ist die Antwort, nach der ich gesucht habe.
Javadba
20
@Mymozaaa Der doppelte Bindestrich gibt an, dass das Folgende ein Dateiname ist. Es soll verhindern, dass git Ihren Dateinamen als Zweig interpretiert, falls Sie zwei mit demselben Namen haben.
Joel Mellon
Das Problem ist, dass Sie immer noch abrufen, und wenn es sich um ein großes Repo handelt, ist dies die teure Operation. Ich befürchte, dass die einzige Alternative darin besteht, gitweb auf der Fernbedienung zu installieren und dann darauf zuzugreifen, um die Datei oder dergleichen abzurufen.
Christian Goetze
kleine Frage, danach gehe ich zu einer anderen Maschine, dann mache ich Ihre oben aufgeführten Aktionen, aber dann git statussehe ich sie als Changes to be committed:- was bedeutet, ich muss sie erneut festschreiben? (Ich habe nur bemerkt, dass ich eine einzelne unberührte Datei aktualisieren wollte, aber das Repo selbst wird auf einem anderen Computer berührt.)
Ricky Levi
42

Der folgende Code hat bei mir funktioniert:

     git fetch
     git checkout <branch from which file needs to be fetched> <filepath> 
Shagun Pruthi
quelle
19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip
Dmitry R.
quelle
1
Dies ist eine gute Lösung für über ssh geklonte Repos, scheint jedoch über https nicht unterstützt zu werden: git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x Gibt mir eine Fehlermeldung:fatal: Operation not supported by protocol.
Alderath
1
war schön kombiniert mit tar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se
19

Mit Git 2.23 (August 2019) und dem neuen (noch experimentellen) Befehl git restore, der unter " Wie werden alle Dateien aus dem Arbeitsverzeichnis, aber nicht aus dem Staging-Bereich zurückgesetzt? " Zu sehen ist, wäre dies:

git fetch
git restore -s origin/master -- path/to/file

Die Idee ist: git restorebefasst sich nur mit Dateien, nicht wie Dateien und Zweige git checkout.
Siehe " Verwirrt vongit checkout ": hier git switchkommt herein)


Codersam fügt in den Kommentaren hinzu :

In meinem Fall wollte ich die Daten von meinem Upstream (von dem ich gabelte) erhalten.
Also einfach geändert zu:

git restore -s upstream/master -- path/to/file
VonC
quelle
2
Was für eine Erleichterung, dass dieser Befehl endlich existiert ... Was machten git-ahnungsvolle Leute vorher? Ich habe das Ganze wiederhergestellt und die einzelnen Dateien kopiert, die ich brauchte, aber es war schmerzhaft.
Mike Wise
Dies funktionierte für mich, aber in meinem Fall wollte ich die Daten von meinem Upstream (von dem ich gabelte) erhalten. Also gerade geändert zugit restore -s upstream/master -- path/to/file
coderSam
@coderSam Vielen Dank für dieses Feedback. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
8

Was Sie tun können, ist:

  1. Aktualisieren Sie Ihr lokales Git-Repo:

    git fetch

  2. Erstellen Sie eine lokale Niederlassung und checken Sie darauf aus:

    git branch pouet && git checkout pouet

  3. Wenden Sie das gewünschte Commit auf diesen Zweig an:

    git cherry-pick abcdefabcdef

    (abcdefabcdef ist der sha1 des Commits, den Sie anwenden möchten)

jag
quelle
4
Nebenbei kann Ihr zweiter Schritt auch in einem Befehl als ausgeführt werden git checkout -b pouet.
Greg Hewgill
4
'pouet' ist der beste Filialname für dieses Beispiel.
Hussard
2

Oder git stash (wenn Sie Änderungen haben) in dem Zweig, in dem Sie sich befinden, checken Sie den Master aus, suchen Sie nach den neuesten Änderungen und holen Sie sich diese Datei auf Ihrem Desktop (oder in der gesamten App). Kasse der Filiale, in der Sie waren. Git-Stash wird wieder auf den Status angewendet, in dem Sie sich befanden. Korrigieren Sie dann die Änderungen manuell oder ziehen Sie sie, um die Datei zu ersetzen.

Dieser Weg ist nicht sooooo cool, aber er funktioniert auf jeden Fall, wenn ihr nichts anderes herausfinden könnt.

jahrichie
quelle
-10

Ich glaube, ich habe einen einfachen Hack gefunden.

Löschen Sie die Datei, die sich im lokalen Repository befindet (die Datei, die vom letzten Commit auf dem Remote-Server aktualisiert werden soll).

Und dann mach ein git pull

Da die Datei gelöscht wird, liegt kein Konflikt vor

Viswadeep Sarangi
quelle
Dadurch werden alle eventuell an dieser Datei lokal vorgenommenen Änderungen entfernt und auch alle anderen Dateien abgerufen. Dies ist insbesondere das, was das OP nicht tun möchte.
Legrojan
Anstatt den Remote-Zweig zu aktualisieren, ist das Entfernen von local sehr schlecht.
c0der512