Czy istnieje sposób, aby ukryć tylko zmiany etapowe? Scenariusz, z którym mam problemy, polega na tym, że pracowałem nad kilkoma błędami w danym momencie i wprowadziłem kilka nieetapowych zmian. Chciałbym mieć możliwość stopniowania tych plików indywidualnie, tworzenia plików .patch i przechowywania ich do momentu zatwierdzenia kodu. W ten sposób, po zatwierdzeniu, mogę ukryć całą (bieżącą) sesję, usunąć ten błąd i przesłać kod.
Czy robię to w niewłaściwy sposób? Czy nie rozumiem, w jaki sposób git może działać na inne sposoby, aby uprościć mój proces?
Odpowiedzi:
Tak, jest to możliwe dzięki DOUBLE STASH
git stash --keep-index
. To polecenie utworzy skrytkę ze WSZYSTKIMI zmianami ( etapowymi i nieetapowymi ), ale pozostawi zmiany etapowe w katalogu roboczym (nadal w stanie przemieszczonym).git stash push -m "good stash"
"good stash"
ma tylko wystawił plików .Teraz, jeśli potrzebujesz plików niestacjonarnych przed skrytką, po prostu zastosuj pierwszą skrytkę ( tę utworzoną za pomocą
--keep-index
), a teraz możesz usunąć pliki, które zostały schowane"good stash"
.Cieszyć się
źródło
-u
przełącznika.git stash apply --index
opcji. Spróbuje to utrzymać stan un (inscenizowany). Łatwiej jest teraz usunąć niechciane zmiany z działającego drzewa.W najnowszym git możesz użyć
--patch
opcjiI git poprosi cię o każdą zmianę w twoich plikach, aby dodać lub nie w skrytce.
Po prostu odpowiadasz
y
lubn
UPD
Alias dla DOUBLE STASH :
Teraz możesz wyeksponować pliki, a następnie uruchomić
git stash-staged
.W rezultacie pliki tymczasowe zostaną zapisane w skrytce .
Jeśli nie chcesz zachować przemieszczanych plików i chcesz przenieść je do przechowalni. Następnie możesz dodać kolejny alias i uruchomić
git move-staged
:źródło
-u|--include-untracked
opcjęgit-stash
Stworzyłem skrypt, który ukrywa tylko to, co aktualnie jest wystawiane i pozostawia wszystko inne. To niesamowite, gdy zaczynam wprowadzać zbyt wiele niepowiązanych zmian. Po prostu zrób scenę, która nie jest związana z pożądanym zatwierdzeniem i ukryj właśnie to.
(Podziękowania dla Bartłomieja za punkt wyjścia)
źródło
Oto prosty jednowarstwowy:
Aby dodać wiadomość po prostu:
źródło
Aby osiągnąć to samo ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Bum. Pliki, których nie chcesz, są przechowywane. Wszystkie potrzebne pliki są gotowe.
źródło
W tym scenariuszu wolę tworzyć nowe gałęzie dla każdego wydania. Używam przedrostka temp /, więc wiem, że mogę później usunąć te gałęzie.
Dokonaj edycji plików, które naprawiają błąd 1, i zatwierdź je.
Następnie możesz wybrać wiśni z odpowiednich oddziałów zgodnie z wymaganiami i przesłać żądanie ściągnięcia.
źródło
Dlaczego nie zatwierdzasz zmiany dla określonego błędu i nie tworzysz łatki z tego zatwierdzenia i jego poprzednika?
Następnie, aby utworzyć odpowiednie łatki, użyj
git format-patch
:Spowoduje to utworzenie dwóch plików:
0001-fix-bug-123.patch
i0002-fix-bug-321.patch
Lub możesz utworzyć osobne gałęzie dla każdego błędu, abyś mógł indywidualnie scalać lub rozdzielać poprawki błędów, a nawet usuwać je, jeśli się nie uda.
źródło
git stash --keep-index
jest dobrym rozwiązaniem ... oprócz tego, że nie działało poprawnie na usuniętych ścieżkach, co zostało naprawione w Git 2.23 (III kwartał 2019)Zobacz zatwierdzenie b932f6a (16 lipca 2019 r.) Autor: Thomas Gummerer (
tgummerer
) .(Połączone przez Junio C Hamano -
gitster
- w commit f8aee85 , 25 lipca 2019)źródło
Przechowywanie tylko indeksu (zmiany etapowe) w Git jest trudniejsze niż powinno. Znalazłem @ Joe odpowiedź do pracy dobrze i odwrócił odmianę drobne go do tego aliasu:
Pcha zarówno zmiany etapowe, jak i niestacjonarne do tymczasowej skrytki, pozostawiając same zmiany etapowe. Następnie wypycha zmiany etapowe do skrytki, która jest skrytką, którą chcemy zachować. Argumenty przekazywane do aliasu, takie jak
--message "whatever"
zostaną dodane do tego polecenia ukrywania. Na koniec wyskakuje tymczasowa skrytka, aby przywrócić pierwotny stan i usunąć tymczasową skrytkę, a następnie w końcu „usuwa” ukryte zmiany z katalogu roboczego za pomocą aplikacji łatki odwrotnej.W przypadku odwrotnego problemu ukrywania tylko niestabilnych zmian (alias
stash-working
) zobacz tę odpowiedź .źródło
Czy absolutnie konieczna jest praca nad kilkoma błędami jednocześnie? I przez „od razu” mam na myśli „edytowanie plików pod kątem wielu błędów jednocześnie”. Ponieważ chyba, że jest to absolutnie potrzebne, pracuję tylko nad jednym błędem na raz w twoim środowisku. W ten sposób możesz korzystać z lokalnych oddziałów i bazy danych, co uważam za znacznie łatwiejsze niż zarządzanie złożoną skrytką / sceną.
Powiedzmy, że master jest w zatwierdzeniu B. Teraz pracuj nad błędem nr 1.
Teraz jesteś na gałęzi bug1. Wprowadź zmiany, zatwierdź, poczekaj na sprawdzenie kodu. Jest to lokalne, więc nie wpływasz na nikogo innego i powinno być łatwo zrobić łatkę z git diffs.
Teraz pracujesz nad bug2. Idź z powrotem do opanowania z
git checkout master
. Utworzyć nowy oddział,git checkout -b bug2
. Wprowadź zmiany, zatwierdź, poczekaj na sprawdzenie kodu.Udawajmy, że ktoś inny popełnia E & F na masterie, gdy czekasz na recenzję.
Po zatwierdzeniu kodu możesz zmienić jego podstawę w celu opanowania, wykonując następujące czynności:
Spowoduje to:
Następnie możesz wcisnąć, usunąć lokalny oddział bug1 i gotowe. Jeden błąd na raz w twoim obszarze roboczym, ale przy użyciu lokalnych oddziałów twoje repozytorium może obsłużyć wiele błędów. I to pozwala uniknąć skomplikowanego tańca scenicznego / skrytkowego.
Odpowiedz na pytanie ctote w komentarzach:
Cóż, możesz wrócić do ukrywania każdego błędu i pracować tylko z jednym błędem na raz. Przynajmniej oszczędza to problemu z inscenizacją. Ale po wypróbowaniu tego osobiście uważam to za kłopotliwe. Skrytki są nieco niechlujne na wykresie git log. A co ważniejsze, jeśli coś spieprzysz, nie możesz cofnąć. Jeśli masz brudny katalog roboczy i wyskakujesz skrytkę, nie możesz „cofnąć” tego popu. Znacznie trudniej jest zepsuć już istniejące zatwierdzenia.
Więc
git rebase -i
.Po zmianie podstawy jednej gałęzi na drugą możesz to zrobić interaktywnie (flaga -i). Kiedy to zrobisz, możesz wybrać, co chcesz zrobić z każdym zatwierdzeniem. Pro Git to niesamowita książka, która jest również dostępna online w formacie HTML i ma fajną sekcję na temat zmiany bazy i squashingu:
http://git-scm.com/book/ch6-4.html
Dla wygody ukradnę ich przykład. Udawaj, że masz następującą historię zatwierdzeń i chcesz zmienić bazę i zgnieść błąd1 na master:
Oto, co zobaczysz podczas pisania
git rebase -i master bug1
Aby zmiksować wszystkie zatwierdzenia gałęzi w jednym zatwierdzeniu, zachowaj pierwszy zatwierdzenie jako „pick” i zamień wszystkie kolejne wpisy „pick” na „squash” lub po prostu „s”. Otrzymasz również możliwość zmiany komunikatu zatwierdzenia.
Więc tak, zgniatanie jest trochę uciążliwe, ale nadal zalecałbym to nad intensywnym używaniem skrytek.
źródło
git checkout master; git checkout -b bug2
można to skrócićgit checkout -b bug2 master
. To samo dotyczygit checkout bug1; git rebase master; git checkout master; git merge bug1
, co jest identyczne zgit rebase master bug1; git push . bug1:master
(push
oczywiście , sztuczka nie jest oczywista)Z twoich komentarzy do odpowiedzi Mike'a Monkiewicza sugeruję użycie prostszego modelu: używaj zwykłych gałęzi programistycznych, ale użyj opcji squash połączenia, aby uzyskać pojedyncze zatwierdzenie w gałęzi master:
Zaletą tej procedury jest to, że możesz użyć normalnego przepływu pracy git.
źródło
Po utworzeniu aliasu:
Tutaj
git diff
zwraca listę--staged
plików,--name-only
a następnie przekazujemy tę listę
pathspec
dogit stash
komendy.Od
man git stash
:źródło
Aby przyciąć przypadkową zmianę, w szczególności usunięcie wielu plików, wykonaj następujące czynności:
innymi słowy, schowaj bzdury i wyrzuć je razem ze skrytką.
Testowane w wersji git 2.17.1
źródło