Muszę przenieść zmiany wprowadzone w jednym oddziale do innego. Mogę to zrobić za pomocą Cherry Pick. Jednak w moim przypadku chcę zastosować zmiany, które są istotne tylko dla jednego pliku, nie muszę wybierać całego zatwierdzenia. Jak to zrobić?
108
Odpowiedzi:
Masz różne opcje w zależności od tego, co chcesz osiągnąć:
Jeśli chcesz, aby zawartość pliku była taka sama jak w gałęzi docelowej, możesz użyć
git checkout <branch> -- <filename>
. Nie będzie to jednak „wybierać” zmian, które zaszły w pojedynczym zatwierdzeniu, ale po prostu przyjmie wynikowy stan wspomnianego pliku. Więc jeśli dodałeś linię w zatwierdzeniu, ale poprzednie zatwierdzenia zmieniły się bardziej i chcesz tylko dodać tę linię bez tych innych zmian, to pobranie nie jest tym, czego chcesz.W przeciwnym razie, jeśli chcesz zastosować poprawkę wprowadzoną w zatwierdzeniu tylko do jednego pliku, masz wiele opcji. Możesz uruchomić
git cherry-pick -n
, tj. Bez zatwierdzania go, edytować zatwierdzenie (na przykład zresetować wszystkie pliki za pomocągit reset -- .
i dodać tylko ten plik, który chcesz zmienić za pomocągit add <filename>
). Lub możesz utworzyć różnicę dla pliku i zastosować ją następnie:źródło
Utwórz
patch file
i zastosuj.EDYTOWAĆ:
Ponieważ musisz pobrać zmiany z zatwierdzenia, utwórz łatkę w następujący sposób:
źródło
git diff sha1
(lubgit diff branch
- jest tak samo, jeśli gałąź wskazuje na ten sam skrót) wygeneruje tylko różnicę bieżącego katalogu roboczego w odniesieniu do tego skrótu, ale nie to, co zmienia zatwierdzenie wprowadzone samodzielnie.git checkout
z nazwą pliku to właściwy młotek do tego gwoździa. Obie te opcje są niepotrzebnie złożone.checkout
nie zadziała, ponieważ może obejmować inne niechciane wcześniejsze zmiany i może nie zawierać zmian wprowadzonych w bieżącej gałęzi.Inną przydatną rzeczą jest pobranie poprawki lokalnie, a następnie użycie:
To jednak nie jest najlepszy wybór.
źródło
Git ma wszystko gotowe :)
Po prostu użyj
git checkout <sha> <path-to-file>
źródło
działa to, jeśli chcesz skopiować pojedynczy plik z innej gałęzi do bieżącej gałęzi roboczej
źródło
Oto czego szukasz:
sha1 jest opcjonalne
źródło
Zwykle używam
git ls-tree
po prostu zrób:
Spowoduje to wydrukowanie wszystkich nazw plików pasujących do twojego grep i da klucze SHA1 plików w zatwierdzeniu.
Git show może być również używany do plików spoza twojej gałęzi. użycie
>
ze swojej powłoki potokiem wyjścia do pliku daje wynik, którego szukasz.źródło
Możesz spróbować to zrobić:
Na przykład:
źródło
przenosi pliki do etapu przed zatwierdzeniem
usuwa z pamięci
Teraz twoja gałąź jest całkiem czysta (przywrócona do poprzedniego zatwierdzenia)
źródło