Jak mogę sformatować poprawkę z tym, co ukryłem

140

W dupie, chowam zmiany. Czy to możliwe, że mogę stworzyć łatkę z tym, co ukryję? A potem zastosować tę poprawkę w innym repozytorium (u mojego współpracownika)?

Wiem git format-patch -1, ale myślę, że to za to, co się zobowiązałem. Ale szukam tego samego dla zmian, które odłożyłem.

Jak mogę zastosować łatkę w innym repozytorium?

Silverburgh
źródło

Odpowiedzi:

156

Jasne, git stash showobsługuje to:

git stash show -p

Więc użyj

git stash list

aby dowiedzieć się, jaki numer skrytki chcesz wyeksportować jako łatkę

git stash show -p stash@{<number>} > <name>.patch

aby go wyeksportować.

Na przykład:

git stash show -p stash@{3} > third_stash.patch
Greg Hewgill
źródło
1
Mam powiązane pytanie dotyczące zastosowania poprawki. Powiedzmy, że moja łatka dotyka wielu plików. Czy istnieje sposób na „interaktywne” nałożenie poprawki? Wybierz pliki poprawki, na które mam ją zastosować? Czy mogę to zrobić?
Silverburgh
1
@silverburgh: Przejrzałem szybko man patchi nie widziałem żadnych opcji dla interaktywnej aplikacji łatki. Jednakże, ponieważ pliki łat są same w sobie zwykłymi plikami tekstowymi, zazwyczaj wystarczy edytować łatę w edytorze tekstu, aby wyciąć odpowiednie części do zastosowania patch. Alternatywnie, jeśli stosujesz łatkę w innym repozytorium Git, możesz zastosować ją w całości, a następnie wybiórczo git checkoutpliki, których nie chcesz zmieniać ( git checkoutz nazwą pliku odrzuca zmiany niestacjonarne).
Greg Hewgill
1
@silverburgh możesz ograniczyć zestaw łatanych plików za pomocą parametrów „--exclude” i „--include” git.
Kelvin
@silverburgh możesz wykonać następujące czynności, zakładając, że masz łatkę. zastosuj łatkę w całości, a następnie zrób, git add --interactive ${YOUR_FILES}a da ci to szansę na częściowe zatwierdzenie.
Alex
15
Dzięki. To zadziałało dla mnie:git stash show -p stash@{1} > patch.txt
Ryan
63

Ta odpowiedź zawiera informacje dotyczące zarówno zapisywania poprawki, jak i stosowania jej tam, gdzie chcesz jej użyć.

Aby przechowywać dane wyjściowe w pliku:

 git stash show -p --color=never > my-patch-name.patch

Sprawdź, czy poprawka wygląda dobrze:

git apply --stat my-patch-name.patch

Sprawdź, czy nie ma błędów:

git apply --check my-patch-name.patch

Zastosuj łatkę

git apply my-patch-name.patch
calvinf
źródło
Ten działał dla mnie z plikami z kodem zwykłego tekstu, ale musiałem uwzględnić białe znaki. Sprawdź, czy poprawka wygląda dobrze: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Zastosuj łatkę: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland
Ładne i zwięzłe wyjaśnienie. Aby to zadziałało, musiałem być w katalogu głównym repozytorium podczas nakładania łatki, w przeciwnym razie git applynie odebrałem różnicy.
Max
16

Posługiwać się

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

aby uzyskać listę ostatnio przechowywanych rzeczy. W rzeczywistości Git tworzy obiekty zatwierdzania, gdy je przechowujesz.

Są zobowiązaniami jak wszystko inne. Możesz je sprawdzić w oddziale:

$> git checkout -b with_stash stash@{0}

Następnie możesz opublikować tę gałąź, a Twój współpracownik może scalić lub wybrać najlepsze zatwierdzenie.

peritus
źródło
13

Powyższe rozwiązania nie będą działać dla danych binarnych. Następujące dodają obsługę tego:

git stash show stash@{0} -p --binary

Edytować

Uwaga: chciałem tylko dodać komentarz do powyższych odpowiedzi, ale moja reputacja nie jest wystarczająca.

Davide Guerri
źródło
3

Myślę, że to może być jedna z ostatnich aktualizacji Gita. nie musisz już aktualizować zachowanych zmian. możesz po prostu zastosować zapisane zmiany w jednej gałęzi do drugiej.

powiedz w gałęzi A, że odłożyłeś kilka zmian, nazywanych stash @ {1}.

teraz przełączysz się na gałąź B. możesz po prostu:

$git stash apply stash@{1}

powoduje to zmianę gałęzi A na gałąź B.

stucash
źródło