Utwórz łatkę git z niezatwierdzonych zmian w bieżącym katalogu roboczym

Powiedzmy, że mam niezatwierdzone zmiany w moim katalogu roboczym. Jak mogę zrobić z nich łatkę bez konieczności tworzenia commita?

 966
Author: Antony, 2011-03-01

7 answers

git diff dla zmian nieakceptowanych.

git diff --cached dla zmian.

git diff HEAD zarówno dla zmian zainscenizowanych, jak i nieakcentowanych.

 447
Author: sigjuice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-05 19:30:07

Jeśli jeszcze nie wprowadziłeś zmian, to:

git diff > mypatch.patch

Ale czasami zdarza się, że częścią rzeczy, które robisz, są nowe pliki, które nie są śledzone i nie będą w Twoim wyjściu git diff. Tak więc, jednym ze sposobów na wykonanie poprawki jest przygotowanie wszystkiego do nowego commita (git add każdy plik, lub po prostu git add .), ale nie rób commita, a następnie:

git diff --cached > mypatch.patch

Dodaj opcję 'binary', jeśli chcesz dodać pliki binarne do łatki (np. pliki mp3):

git diff --cached --binary > mypatch.patch

Można później zastosować plaster:

git apply mypatch.patch
 2026
Author: jcarballo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-06 05:52:03

git diff i git 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ć tymczasowy commit. Po dokonaniu tymczasowych zmian możesz utworzyć łatkę za pomocą:

git format-patch <options...>

Po stworzeniu patcha uruchom polecenie:

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

Spowoduje to cofnięcie tymczasowych commitów. Wynik końcowy pozostawia kopię roboczą (celowo) brudną z tymi samymi zmianami, które pierwotnie miałem.

Po stronie otrzymującej, możesz użyć tej samej sztuczki, aby zastosować zmiany do kopii roboczej, bez posiadania historii zatwierdzeń. Wystarczy nałożyć plaster (plastry) i git reset --mixed <SHA of commit *before* the patches>.

Zauważ, że być może będziesz musiał być dobrze zsynchronizowany, aby ta cała opcja działała. Widziałem kilka błędów przy nakładaniu łat, gdy osoba je tworząca nie ściągnęła tylu zmian,co ja. Prawdopodobnie są sposoby, aby go uruchomić, ale nie zajrzałem daleko w to.


Oto jak aby utworzyć te same łatki w Tortoise Git (nie polecam używać tego narzędzia):

  1. zatwierdź zmiany pracy
  2. Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij Tortoise Git -> Create Patch Serial
    1. Wybierz zakres, który ma sens (Since: FETCH_HEAD będzie działać, jeśli jesteś dobrze zsynchronizowany)
    2. Utwórz łatkę(es)
  3. Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij Tortise Git -> Show Log
  4. Kliknij prawym przyciskiem myszy commit przed Twoim tymczasowym commit(s) i kliknij reset "<branch>" to this...
  5. wybierz opcję Mixed

I jak je stosować:

  1. Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij Tortoise Git -> Apply Patch Serial
  2. Wybierz poprawne poprawki i zastosuj je
  3. Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij Tortise Git -> Show Log
  4. Kliknij prawym przyciskiem myszy commit przed zatwierdzeniem poprawki i kliknij reset "<branch>" to this...
  5. wybierz opcję Mixed
 93
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-25 22:18:36

Aby utworzyć patch z zarówno zmodyfikowanymi jak i nowymi plikami (stsinged) można uruchomić:

git diff HEAD > file_name.patch
 38
Author: Ionel Sirbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 09:17:20

Lubię:

git format-patch HEAD~<N>

Gdzie <N> jest liczbą ostatnich zmian zapisanych jako łaty.

Szczegóły użycia polecenia znajdują się w DOC

UPD
tutaj znajdziesz sposób ich zastosowania.

UPD dla tych, którzy nie wpadli na pomysł format-patch
Dodaj alias:

git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'

Następnie w dowolnym katalogu repozytorium projektu Uruchom:

git make-patch

To polecenie utworzy 0001-uncommited.patch w bieżącym katalogu. Patch will zawiera wszystkie zmiany i pliki, które są widoczne dla następnej komendy:

git status .
 27
Author: Eugen Konkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-07 08:11:28

Jeśli chcesz zrobić plik binarny, podaj opcję --binary podczas uruchamiania git diff.

 10
Author: gitster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-21 13:32:42

Możemy również określić pliki, aby zawierały tylko pliki ze względnymi zmianami, szczególnie gdy obejmują one wiele katalogów, np.]}

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

Stwierdziłem, że nie jest to określone w odpowiedziach lub komentarzach, które są istotne i poprawne, więc postanowiłem je dodać. Explicit jest lepszy niż implicit!

 4
Author: Anshu Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-27 12:57:50