Ist es möglich, nur eine Datei in Git zu ziehen?

177

Ich arbeite an einem Git-Zweig, der einige fehlerhafte Tests aufweist, und ich möchte diese Tests aus einem anderen Zweig ziehen (Änderungen zusammenführen, nicht nur überschreiben), in dem sie bereits behoben sind.

Ich weiß, dass ich es kann

git pull origin that_other_branch

aber dies wird versuchen, viele andere Dateien zusammenzuführen, dafür bin ich noch nicht bereit.

Ist es möglich, nur die angegebene Datei (und nicht alles) aus diesem anderen Zweig zu ziehen und zusammenzuführen?

Dies ist kein Duplikat der Git-Pull-Anforderung für nur eine Datei, da alle Antworten auf diese Frage lauten, wie die lokal geänderte Datei auf die Repository-Version zurückgesetzt werden kann, ohne dass Zweige geändert werden.

Audrius Meskauskas
quelle
7
Ich glaube, keiner der Einträge auf dieser Seite gibt eine Antwort auf die Frage. Die Frage bedeutet, nur eine Datei von einem Remote-Server abzurufen, nicht alle Dateien abzurufen und nur eine lokal auszuchecken. Daher sollte die Frage wiederholt oder die ausgewählte Antwort nicht als Lösung für die Frage markiert werden.
mljrg

Antworten:

153

Sie können auf diese Weise nur eine Datei abrufen und dann auschecken:

git fetch
git checkout -m <revision> <yourfilepath>
git add <yourfilepath>
git commit

In Bezug auf den git checkoutBefehl: <revision> - Ein Zweigstellenname, dh origin/master <yourfilepath>enthält nicht den Repository-Namen (den Sie durch Klicken auf die copy pathSchaltfläche auf einer Dateiseite auf GitHub erhalten können), dhREADME.md

aleroot
quelle
23
Die für den Schalter -m erforderlichen Hash-Codes können mit dem Git-Zweig -v gedruckt werden. Genial!
Audrius Meskauskas
2
Ausgezeichnet. Dies hat mir mehr als einmal geholfen. Zur Verdeutlichung scheint das Flag -m mit dem Hash des Commits zufrieden zu sein, aus dem Sie Ihre einzelne Datei ziehen möchten.
Rd108
1
Das hat auch bei mir funktioniert. Allerdings habe ich Git Log auf meinem Remote-Zweig ausgeführt, um die Umkehrung zu finden: zB $ Git Log Remotes / Origin / Master
Dan
6
Ist es möglich, bestimmte Dateien abzurufen, ohne andere Dateien abzurufen?
Wohlfühlen und Programmieren
3
@aleroot wofür steht <revision>?
Wakan Tanka
240

Hier ist eine etwas einfachere Methode, die ich mir gerade ausgedacht habe, als ich dies untersucht habe:

git fetch {remote}
git checkout FETCH_HEAD -- {file}
Chris
quelle
4
tödlich: ungültige Referenz: FETCH_HEAD
Antony D'Andrea
4
Dieser Antwort fehlt möglicherweise ein funktionierendes Beispiel. Es ist unklar, ob man sich als nächstes verpflichten muss.
Dr_Zaszuś
@ Chris brauchen wir {remote}, wenn wir bereits in Branch sind? Wenn ja, warum?
Cloud Cho
2
Nicht dasselbe wie Pull, das eine Zusammenführung versucht, weshalb wir Pull verwenden möchten.
JosephK
22
git checkout master -- myplugin.js

master = Filialname

myplugin.js = Dateiname

Mawardy
quelle
und gibt es eine Möglichkeit, zurück zu kehren?
Liyuan
1
Vergiss nicht, vorher 'git pull' zu machen;)
matson kepson
16

@ Mawardys Antwort funktionierte für mich, aber meine Änderungen waren auf der Fernbedienung, so dass ich den Ursprung angeben musste

git checkout origin/master -- {filename}
Luke Flournoy
quelle
2

Ja, hier ist der Prozess:

# Navigate to a directory and initiate a local repository
git init        

# Add remote repository to be tracked for changes:   
git remote add origin https://github.com/username/repository_name.git

# Track all changes made on above remote repository
# This will show files on remote repository not available on local repository
git fetch

# Add file present in staging area for checkout
git check origin/master -m /path/to/file
# NOTE: /path/to/file is a relative path from repository_name
git add /path/to/file

# Verify track of file(s) being committed to local repository
git status

# Commit to local repository
git commit -m "commit message"

# You may perform a final check of the staging area again with git status

quelle