git format-patchzawiera także binarne różnice i niektóre meta informacje. Właściwie to byłby najlepszy wybór do tworzenia łatki, ale afaik to działa tylko w przypadku sprawdzonych źródeł / zmian, prawda?
Eric
20
Czasami przydatne może być utworzenie łatki względem bieżącego katalogu. Aby to osiągnąć, użyjgit diff --relative
ejboy
30
git diff> a.patch, aby zapisać go do pliku
qasimzee
139
Krótko mówiąc sarkastycznie, poniższa odpowiedź jest bardziej pomocna.
Air
1864
Jeśli nie zatwierdziłeś jeszcze zmian, to:
git diff > mypatch.patch
Ale czasami zdarza się, że część rzeczy, które robisz, to nowe pliki, które nie są śledzone i nie będą w twoich wynikach git diff. Tak więc jednym ze sposobów na wykonanie poprawki jest ułożenie wszystkiego dla nowego zatwierdzenia (dla git addkażdego pliku lub po prostu git add .), ale nie wykonanie zatwierdzenia, a następnie:
git diff --cached > mypatch.patch
Dodaj opcję „binarną”, jeśli chcesz dodać pliki binarne do łatki (np. Pliki mp3):
git diff --cached --binary > mypatch.patch
Możesz później zastosować łatkę:
git apply mypatch.patch
Uwaga: możesz także użyć --stagedjako synonimu --cached.
Dziękuję bardzo za przykład. W przeciwieństwie do przyjętej odpowiedzi pokazujesz, jak to zrobić, a nie tylko rozmawiasz. Bardzo pomocny i działał dla mnie bezbłędnie :)
nuala
4
Zrobiłem dokładnie to i dostałem komunikat „fatal: nierozpoznany” po uruchomieniu git Apply. Masz pojęcie, co może to spowodować i jak to naprawić?
Witalij
6
@Vitaly: czy łatka jest czytelna, jeśli otworzysz ją za pomocą edytora tekstu? powinien być czysty, bez dziwnych znaków, na przykład jeśli ustawione jest ustawienie color.diff, łatka będzie zawierała niektóre „kolorowe znaki”, które mogą sprawić, że „zastosowanie git” nie powiedzie się, w takim przypadku spróbuj git diff --no-color. W przeciwnym razie wygląda to na problem z kodowaniem.
jcarballo
3
Powiązane z „nowymi plikami, które nie są śledzone”: „git diff” i „git diff --cached” działają tylko wtedy, gdy najpierw zostało wywołane „git add <plik>”. (Jestem nowy, żeby zacząć i zastanawiałem się, dlaczego za każdym razem dostaję pustą łatę)
Anonimowy
5
To dość łatwo wyciągnęło mnie z dziwnego piekła scalania / rebase, dzięki :)
John Hunt
86
git diffi git applybędzie działać dla plików tekstowych, ale nie będzie działać dla plików binarnych.
Możesz łatwo utworzyć pełną łatkę binarną, ale będziesz musiał utworzyć tymczasowe zatwierdzenie. Po dokonaniu tymczasowych zatwierdzeń możesz utworzyć łatkę za pomocą:
git format-patch <options...>
Po utworzeniu poprawki uruchom następujące polecenie:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Spowoduje to wycofanie tymczasowych zatwierdzeń. Ostateczny wynik pozostawia kopię roboczą (celowo) brudną z tymi samymi zmianami, co pierwotnie.
Po stronie odbierającej możesz użyć tej samej sztuczki, aby zastosować zmiany do kopii roboczej, bez posiadania historii zmian. Po prostu zastosuj łatki i git reset --mixed <SHA of commit *before* the patches>.
Pamiętaj, że może być konieczne zsynchronizowanie całej tej opcji. Widziałem błędy podczas stosowania poprawek, gdy osoba, która je stworzyła, nie usunęła tylu zmian, co ja. Prawdopodobnie istnieją sposoby, aby to zadziałało, ale nie zagłębiłem się w to.
Oto jak stworzyć te same łatki w Tortoise Git (nie polecam korzystania z tego narzędzia):
Zatwierdź zmiany robocze
Kliknij prawym przyciskiem myszy główny katalog oddziału, a następnie kliknij Tortoise Git->Create Patch Serial
Wybierz dowolny zakres, który ma sens ( Since: FETCH_HEADzadziała, jeśli jesteś dobrze zsynchronizowany)
Utwórz łatki
Kliknij prawym przyciskiem myszy główny katalog oddziału, a następnie kliknij Tortise Git->Show Log
Kliknij zatwierdzenie prawym przyciskiem myszy przed tymczasowymi zatwierdzeniami, a następnie kliknijreset "<branch>" to this...
Wybierz Mixedopcję
I jak je zastosować:
Kliknij prawym przyciskiem myszy główny katalog oddziału, a następnie kliknij Tortoise Git->Apply Patch Serial
Wybierz poprawne łatki i zastosuj je
Kliknij prawym przyciskiem myszy główny katalog oddziału, a następnie kliknij Tortise Git->Show Log
Kliknij zatwierdzenie prawym przyciskiem myszy przed zatwierdzeniem (zatwierdzeniami) łatki i kliknijreset "<branch>" to this...
Następnie w dowolnym katalogu repozytorium projektu uruchom:
git make-patch
To polecenie utworzy 0001-uncommited.patchw bieżącym katalogu. Łatka będzie zawierać wszystkie zmiany i nieśledzone pliki widoczne dla następnego polecenia:
Odpowiedzi:
git diff
dla zmian nieetapowych.git diff --cached
dla etapowych zmian.źródło
git format-patch
zawiera także binarne różnice i niektóre meta informacje. Właściwie to byłby najlepszy wybór do tworzenia łatki, ale afaik to działa tylko w przypadku sprawdzonych źródeł / zmian, prawda?git diff --relative
Jeśli nie zatwierdziłeś jeszcze zmian, to:
Ale czasami zdarza się, że część rzeczy, które robisz, to nowe pliki, które nie są śledzone i nie będą w twoich wynikach
git diff
. Tak więc jednym ze sposobów na wykonanie poprawki jest ułożenie wszystkiego dla nowego zatwierdzenia (dlagit add
każdego pliku lub po prostugit add .
), ale nie wykonanie zatwierdzenia, a następnie:Dodaj opcję „binarną”, jeśli chcesz dodać pliki binarne do łatki (np. Pliki mp3):
Możesz później zastosować łatkę:
Uwaga: możesz także użyć
--staged
jako synonimu--cached
.źródło
git diff --no-color
. W przeciwnym razie wygląda to na problem z kodowaniem.git diff
igit apply
będzie działać dla plików tekstowych, ale nie będzie działać dla plików binarnych.Możesz łatwo utworzyć pełną łatkę binarną, ale będziesz musiał utworzyć tymczasowe zatwierdzenie. Po dokonaniu tymczasowych zatwierdzeń możesz utworzyć łatkę za pomocą:
Po utworzeniu poprawki uruchom następujące polecenie:
Spowoduje to wycofanie tymczasowych zatwierdzeń. Ostateczny wynik pozostawia kopię roboczą (celowo) brudną z tymi samymi zmianami, co pierwotnie.
Po stronie odbierającej możesz użyć tej samej sztuczki, aby zastosować zmiany do kopii roboczej, bez posiadania historii zmian. Po prostu zastosuj łatki i
git reset --mixed <SHA of commit *before* the patches>
.Pamiętaj, że może być konieczne zsynchronizowanie całej tej opcji. Widziałem błędy podczas stosowania poprawek, gdy osoba, która je stworzyła, nie usunęła tylu zmian, co ja. Prawdopodobnie istnieją sposoby, aby to zadziałało, ale nie zagłębiłem się w to.
Oto jak stworzyć te same łatki w Tortoise Git (nie polecam korzystania z tego narzędzia):
Tortoise Git
->Create Patch Serial
Since
:FETCH_HEAD
zadziała, jeśli jesteś dobrze zsynchronizowany)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opcjęI jak je zastosować:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opcjęźródło
Aby utworzyć łatkę ze zmodyfikowanymi i nowymi plikami (przemieszczanymi), możesz uruchomić:
źródło
git diff --cached > mypatch.patch
nie działa.file_name.patch
być użyte przezpatch
polecenie? Czy są ze sobą kompatybilne?Podoba mi się:
gdzie
<N>
jest liczbą ostatnich zatwierdzeń do zapisania jako łatki.Szczegóły dotyczące korzystania z polecenia znajdują się w DOC
UPD
Tutaj możesz znaleźć, jak je następnie zastosować.
UPD Dla tych, którzy nie mieli pojęcia o
format-patch
dodaniu aliasu:
Następnie w dowolnym katalogu repozytorium projektu uruchom:
To polecenie utworzy
0001-uncommited.patch
w bieżącym katalogu. Łatka będzie zawierać wszystkie zmiany i nieśledzone pliki widoczne dla następnego polecenia:źródło
Jeśli chcesz robić pliki binarne, daj
--binary
opcję podczas uruchamianiagit diff
.źródło
Możemy również określić pliki, aby uwzględnić tylko pliki ze zmianami względnymi, szczególnie gdy obejmują one wiele katalogów np
Nie znalazłem tego w odpowiedziach lub komentarzach, które są odpowiednie i poprawne, więc postanowiłem je dodać. Jawne jest lepsze niż niejawne!
źródło