Używam git i pracuję na gałęzi master. Ta gałąź ma plik o nazwie app.js
.
Mam experiment
oddział, w którym wprowadziłem wiele zmian i mnóstwo zmian. Teraz chcę przenieść wszystkie zmiany wykonane tylko do app.js
od experiment
do master
gałęzi.
Jak mogę to zrobić?
Po raz kolejny nie chcę łączenia. Chcę tylko przenieść wszystkie zmiany app.js
z experiment
gałęzi na master
gałąź.
git
git-checkout
Nick Vanderbilt
źródło
źródło
master
może się różnićexperiment
, np. Może zawierać zmiany scalone z innych gałęzi, które zostałyby utracone w pliku, jest po prostu kopiowany. PS z drugiej strony nie chce się łączyć, ale o ile wiem,git merge
termin dotyczy tylko gałęzi, a nie konkretnego pliku, więc tutaj nie ma sprzeczności.Odpowiedzi:
Zobacz także git, jak cofnąć zmiany jednego pliku?
Aktualizacja sierpnia 2019, Git 2.23
W przypadku nowych poleceń
git switch
igit restore
poleceń będzie to:Domyślnie przywracane jest tylko działające drzewo.
Jeśli chcesz również zaktualizować indeks (czyli przywrócić zawartość pliku i dodać go do indeksu za pomocą jednego polecenia):
Jak wspomina Jakub Narębski w komentarzach:
działa również, z tym wyjątkiem, że jak szczegółowo opisano w pytaniu SO „ Jak pobrać pojedynczy plik z konkretnej wersji w Git? ”, musisz użyć pełnej ścieżki z katalogu głównego repozytorium.
Stąd ścieżka / do / app.js użyta przez Jakuba w jego przykładzie.
Jak Frosty wspomina w komentarzu:
Ale dla
git checkout
lubgit show
możesz faktycznie odwoływać się do dowolnej wersji, jak zilustrowano w pytaniu SO „ git checkout wersja pliku w git gui ”:byłoby tak samo, jak $ FILENAME to pełna ścieżka pliku wersjonowanego.
$REVISION
może być jak pokazano nagit rev-parse
:i tak dalej.
schmijos dodaje w komentarzach :
źródło
experiment:./app.js
. (Nie musisz podawać pełnej ścieżki.) Nauczyłem się tego dzięki bardzo pomocnemu komunikatowi o błędzie git dał mi: „Czy chodziło Ci o„ mybranch: full / path / to / my / file.xsl ”aka” mybranch: ./file.xsl '? ” Tak! Nie sądzę, aby kiedykolwiek był tak zachwycony fatalnym komunikatem o błędzie.git restore -s new-feature path/to/app.js
Wszystko jest znacznie prostsze, użyj do tego git checkout.
Załóżmy
you're on master
gałąź, aby uzyskaćapp.js from new-feature
gałąź wykonaj:Spowoduje to wyświetlenie zawartości żądanego pliku. Możesz, jak zawsze, użyć części sha1 zamiast nazwy gałęzi nowej funkcji, aby pobrać plik tak, jak był w tym konkretnym zatwierdzeniu.
Uwaga :
new-feature
musi to być oddział lokalny , a nie zdalny.źródło
git checkout origin/source_branch path/to/file
ponieważ jeśli zaniedbałeś aktualizację gałęzi źródłowej lokalnego repozytorium, możesz otrzymać starą wersję pliku ... Zapytaj mnie, skąd to wiem. ;)Przykład:
To nie zadziała, jeśli nazwa twojego oddziału zawiera kropkę.
źródło
Uzupełnienie odpowiedzi VonC i chhh.
lub
źródło
--
) między nazwą gałęzi a ścieżkami są opcjonalne? Czy to tylko po to, aby ścieżki, które zaczynałyby się od myślnika, nie były traktowane jako opcje / przełączniki?--
Jest opcjonalny, ale bardziej przydatny, aby uniknąć konfliktu z nazwami oddziałów. Na przykładgit checkout -- foo
oznacza „pobierz plik foo z HEAD” (tzn. Zastąp lokalne zmiany w foo , tj. Podzbiórgit reset --hard
), alegit checkout foo
może to oznaczać, że lub „przejdźmy do gałęzi foo ”.Lub jeśli chcesz wszystkie pliki z innej gałęzi:
źródło
.
ogromna różnica: zamiast przenosić się do innej gałęzi, kopiuje wszystkie pliki stamtąd, pozostawiając cię na bieżącym. Dostajesz treść z innej branży bez wchodzenia w nią.Przejrzyj plik na github i stamtąd
Jest to pragmatyczne podejście, które nie odpowiada bezpośrednio PO, ale niektóre okazały się przydatne:
Jeśli gałąź znajduje się w GitHub, możesz przejść do żądanej gałęzi i pliku za pomocą dowolnego z wielu narzędzi oferowanych przez GitHub, a następnie kliknij „Raw”, aby wyświetlić zwykły tekst, i (opcjonalnie) skopiuj i wklej tekst jako pożądany.
Podoba mi się to podejście, ponieważ pozwala spojrzeć na cały plik zdalny przed wyciągnięciem go na komputer lokalny.
źródło
Jeśli chcesz plik z konkretnego zatwierdzenia (dowolnej gałęzi), powiedz 06f8251f
git checkout 06f8251f ścieżka_do_pliku
na przykład w systemie Windows:
git checkout 06f8251f C: \ A \ B \ C \ D \ file.h
źródło
Innym sposobem jest utworzenie łatki z różnicami i zastosowanie jej na przykład w gałęzi master. Powiedzmy, że ostatnie zatwierdzenie przed rozpoczęciem pracy nad app.js to 00000aaaaa, a zatwierdzenie zawierające żądaną wersję to 00000bbbbb
Uruchomisz to w gałęzi eksperymentu:
Spowoduje to utworzenie pliku ze wszystkimi różnicami między tymi dwoma zatwierdzeniami dla pliku app.js, które można zastosować w dowolnym miejscu. Możesz zachować ten plik w dowolnym miejscu poza projektem
Następnie w trybie głównym po prostu uruchom:
teraz zobaczysz zmiany w projektach, jakbyś dokonał ich ręcznie.
źródło
Mam nadzieję, że to ci pomoże. Daj mi znać, jeśli masz jakieś pytania.
źródło