Robię coś bardzo prostego złego. Próbuję przygotować zwykły plik poprawki, więc mogę ponownie zastosować kilka zmian:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Z something_here
zaślepką prawie działa, ale nazwy plików nie są w porządku. Myślę, że po prostu brakuje mi jakiejś opcji.
W prawdziwym życiu zamierzam dokonać scalenia po wymeldowaniu, więc łatka może się tam nie udać, ale widzisz, do czego zmierzam.
Edytuj
tutaj Mój błąd za zadanie niewłaściwego pytania. Właściwe pytanie brzmi: chcę zapisać swoje zmiany, wykonać scalenie, a następnie ponownie zastosować zmiany, jeśli to możliwe? Poprosiłem o to w niewłaściwy sposób, ponieważ jestem przyzwyczajony do używania łatki do rozwiązywania tego rodzaju problemów i git diff
wyglądało na to, że właśnie tego chciałem.
Komentarz Charlesa Baileya zawierał właściwą odpowiedź. Dla mnie git-apply to właściwa rzecz (git-stash wygląda na cięższą niż potrzebuję, a zmiana bazy i pakiety zdecydowanie przekraczają mój obecny poziom umiejętności). Przyjmę odpowiedź, której udzielił Charles (ponieważ ty nie może przyjąć komentarza). Dzięki za wszystkie sugestie.
Edytuj, 6 lat później
Jak każdy obeznany w temacie wie, przeszacowałem trudność git stash
. Prawie każdego dnia będę używał następującej sekwencji:
$ git stash
$ git merge
$ git stash pop
patch
raczej użyć niżgit apply
?git stash
lub innych narzędzi git?git stash
jest to najłatwiejsze rozwiązanie tego, co próbujesz zrobić, ale istnieje wiele podejść, które działają.git-svn
.Odpowiedzi:
Jeśli chcesz używać łatki, musisz usunąć
a/
b/
prefiksy używane domyślnie przez git. Możesz to zrobić za pomocą--no-prefix
opcji (możesz to również zrobić za pomocą łatki-p
opcją ):Zwykle jednak łatwiej jest używać go prosto
git diff
a następnie używać wyjścia do podawaniagit apply
.Przez większość czasu staram się unikać poprawek tekstowych. Zwykle jedno lub więcej tymczasowych zatwierdzeń w połączeniu z rebase
git stash
i pakietami są łatwiejsze w zarządzaniu.Myślę, że dla twojego przypadku użycia
stash
jest to najbardziej odpowiednie.źródło
git diff --no-prefix master > diff.patch
a potemgit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
przed wydaniem ostatniej komendy.patch
poza gitem (może używając pliku łatki wygenerowanej przezdiff
) w bardziej ogólnym przypadku użycia.Po prostu użyj
-p1
: i tak będziesz musiał użyć-p0
w--no-prefix
etui, więc możesz po prostu pominąć--no-prefix
i użyć-p1
:źródło
git diff
wyprowadza linię, którapatch
ignoruje.git apply
jest droga do zrobienia.Pliki różnicowe git mają dodatkowy segment ścieżki dołączony do ścieżek plików. Możesz usunąć ten wpis w ścieżce, podając -p1 z łatą, na przykład:
źródło
save.patch
plik w dowolne miejsce (w tym pliki binarne).git apply <file>
źródło
git diff > save.patch
igit checkout .
zamiast resetu, ale tak ...git apply
lub czyni różnicę stosownym do twojego stanu i wskaźnika do ostatniego dostępnego zatwierdzenia. Po prostugit diff
nic nie dałogit apply
. Chodzi ogit diff
to (myślę), że chodzi o używaniegit reset
- problemem są relacje między repozytorium, indeksem i obszarem roboczym.Przydatna sztuczka pozwalająca uniknąć tworzenia tymczasowych plików poprawek:
źródło
git stash show -p stash@{3} | patch -p1 -d [dst-dir]