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?
7 answers
git diff
dla zmian nieakceptowanych.
git diff --cached
dla zmian.
git diff HEAD
zarówno dla zmian zainscenizowanych, jak i nieakcentowanych.
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
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):
- zatwierdź zmiany pracy
- Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij
Tortoise Git
->Create Patch Serial
- Wybierz zakres, który ma sens (
Since
:FETCH_HEAD
będzie działać, jeśli jesteś dobrze zsynchronizowany) - Utwórz łatkę(es)
- Wybierz zakres, który ma sens (
- Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij
Tortise Git
->Show Log
- Kliknij prawym przyciskiem myszy commit przed Twoim tymczasowym commit(s) i kliknij
reset "<branch>" to this...
- wybierz opcję
Mixed
I jak je stosować:
- Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij
Tortoise Git
->Apply Patch Serial
- Wybierz poprawne poprawki i zastosuj je
- Kliknij prawym przyciskiem myszy katalog główny gałęzi i kliknij
Tortise Git
->Show Log
- Kliknij prawym przyciskiem myszy commit przed zatwierdzeniem poprawki i kliknij
reset "<branch>" to this...
- wybierz opcję
Mixed
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
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 .
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
.
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!
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