Powiedz, że mam niezatwierdzone zmiany w moim katalogu roboczym. Jak mogę zrobić łatkę z tych bez konieczności tworzenia zatwierdzenia?
Powiedz, że mam niezatwierdzone zmiany w moim katalogu roboczym. Jak mogę zrobić łatkę z tych bez konieczności tworzenia zatwierdzenia?
Odpowiedzi:
git diff
dla zmian nieetapowych. git diff --cached
dla etapowych zmian.
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:
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 add
każ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ć --staged
jako synonimu --cached
.
git diff --no-color
. W przeciwnym razie wygląda to na problem z kodowaniem.
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ć 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):
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ęAby utworzyć łatkę ze zmodyfikowanymi i nowymi plikami (przemieszczanymi), możesz uruchomić:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
nie działa.
file_name.patch
być użyte przez patch
polecenie? Czy są ze sobą kompatybilne?
Podoba mi się:
git format-patch HEAD~<N>
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:
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. Łatka będzie zawierać wszystkie zmiany i nieśledzone pliki widoczne dla następnego polecenia:
git status .
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
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
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!