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.


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.


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> 

19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

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

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)


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.


-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


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