Czy można pobrać tylko jeden plik w Git?


177

Pracuję na gałęzi Git, która ma kilka uszkodzonych testów i chciałbym pobrać (scalić zmiany, a nie tylko nadpisać) te testy z innej gałęzi, w której są już naprawione.

Wiem, że potrafię

git pull origin that_other_branch

ale to spróbuje scalić wiele innych plików, na to nie jestem jeszcze gotowy.

Czy można pobrać i scalić tylko określony plik (a nie wszystko) z innej gałęzi?

To nie jest duplikat żądania ściągnięcia Git dla tylko jednego pliku, ponieważ wszystkie odpowiedzi na to pytanie dotyczą tego, jak przywrócić lokalnie zmieniony plik do wersji repozytorium, bez zmiany jakichkolwiek gałęzi.


7
Myślę, że żaden z wpisów na tej stronie nie zawiera odpowiedzi na to pytanie. Pytanie oznacza pobranie tylko jednego pliku ze zdalnego serwera, a nie pobranie wszystkich plików i sprawdzenie lokalnie tylko jednego. Dlatego pytanie powinno zostać powtórzone lub wybrana odpowiedź odznaczona jako rozwiązanie pytania.
mljrg

Odpowiedzi:


153

Możesz pobrać, a następnie wypisać tylko jeden plik w ten sposób:

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

Odnośnie git checkoutpolecenia: <revision> - nazwa gałęzi, tj. origin/master <yourfilepath>Nie zawiera nazwy repozytorium (którą można uzyskać klikając copy pathprzycisk na stronie pliku na GitHubie), tj.README.md


23
Kody skrótu wymagane przez przełącznik -m można wydrukować poleceniem git branch -v. Niesamowite!
Audrius Meskauskas

2
Doskonały. Pomogło mi to niejednokrotnie. Aby wyjaśnić, opcja -m wydaje się być zadowolona z skrótu zatwierdzenia, z którego chcesz wyciągnąć pojedynczy plik.
rd108

1
U mnie to też zadziałało. Chociaż uruchomiłem dziennik git w moim zdalnym oddziale, aby znaleźć przywrócenie: np. $ Git log remotes / origin / master
Dan

6
Czy można pobrać określony plik bez pobierania innych plików?
czuć się dobrze i programować

3
@aleroot, co oznacza <revision>?
Wakan Tanka

240

Oto nieco łatwiejsza metoda, którą właśnie wymyśliłem podczas badania tego:

git fetch {remote}
git checkout FETCH_HEAD -- {file}

4
fatal: nieprawidłowy numer referencyjny: FETCH_HEAD
Antony D'Andrea

4
W tej odpowiedzi prawdopodobnie brakuje działającego przykładu. Nie jest jasne, czy trzeba zobowiązać się dalej.
Dr_Zaszuś

@Chris czy potrzebujemy {remote}, jeśli jesteśmy już w oddziale? Jeśli tak, dlaczego?
Cloud Cho

2
To nie to samo, co pull, co spowoduje próbę scalenia, dlatego chcemy użyć pull.
JosephK

22
git checkout master -- myplugin.js

master = nazwa oddziału

myplugin.js = nazwa pliku


i czy jest sposób na powrót?
liyuan

1
nie zapomnijcie wcześniej 'git pull';)
matson kepson

16

@ Odpowiedź Mawardy działała dla mnie, ale moje zmiany były na pilocie, więc musiałem określić pochodzenie

git checkout origin/master -- {filename}

2

Tak, oto proces:

# 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.