Niedawno odkryłem patch
opcję git dla tego add
polecenia i muszę powiedzieć, że to naprawdę fantastyczna funkcja. Odkryłem również, że duży kawałek można podzielić na mniejsze kawałki, naciskając sklawisz, co zwiększa precyzję zatwierdzenia. Ale co, jeśli chcę jeszcze większej precyzji, jeśli podzielony przystojniak nie jest wystarczająco mały?
Weźmy na przykład ten podzielony przystojniak:
@@ -34,12 +34,7 @@
width: 440px;
}
-/*#field_teacher_id {
- display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
width: 300px;
}
Jak mogę dodać usunięcie komentarza CSS tylko do następnego zatwierdzenia? Ta s
opcja nie jest już dostępna!
-
postacie, a Git narzekał, że moja łatka nie ma zastosowania.git add -p
i edytowałeś przystojniake
, powinno to wpływać tylko na to, co jest ustawione, a nie na działające drzewo.Powiedzmy, że Twój
example.css
wygląd wygląda następująco:Teraz zmieńmy selektory stylów w środkowym bloku, a gdy już nad tym pracujemy, usuńmy niektóre skomentowane style, których już nie potrzebujemy.
To było łatwe, teraz popełnijmy. Ale poczekaj, chcę zachować logiczną separację zmian w kontroli wersji dla prostej krokowej weryfikacji kodu, aby mój zespół i ja mogli z łatwością przeszukiwać historię zatwierdzeń w celu znalezienia szczegółów.
Usunięcie starego kodu jest logicznie oddzielone od innej zmiany selektora stylu. Będziemy potrzebować dwóch różnych zatwierdzeń, więc dodajmy przystawki do poprawki.
Ups, wygląda na to, że zmiany są zbyt blisko, więc git podzielił je na części.
Nawet próba podzielenia go przez naciśnięcie sdaje ten sam wynik, ponieważ podział nie jest wystarczająco szczegółowy, aby wprowadzić zmiany precyzji. Niezmienne linie są wymagane między zmienionymi liniami, aby git mógł automatycznie podzielić łatkę.
Więc niech Ręcznie edycję naciskające
git otworzy łatkę w naszym wybranym edytorze.
Przyjrzyjmy się celowi:
Chcemy podzielić to na dwa zatwierdzenia:
Pierwsze zatwierdzenie obejmuje usunięcie niektórych wierszy (usunięcie komentarza).
Aby usunąć skomentowane linie, zostaw je w spokoju, są już zaznaczone, aby śledzić usunięcia w kontroli wersji tak, jak chcemy.
-/*#field_teacher_id {
- display: block;
-} */
Drugie zatwierdzenie to zmiana, która jest śledzona przez rejestrowanie zarówno usunięć, jak i uzupełnień:
Usunięcia (stare linie wyboru zostały usunięte)
Aby zachować stare linie wyboru (nie usuwaj ich podczas tego zatwierdzania), chcemy ...
... co dosłownie oznacza zastąpienie
-
znaków minus znakiem spacji.
Te trzy linie ...
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
... stanie się ( zwróć uwagę na pojedynczą spację na pierwszym z wszystkich 3 wierszy):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
Dodatki (dodano nową linię wyboru)
Aby nie zwracać uwagi na nową linię selektora dodaną podczas tego zatwierdzenia, chcemy ...
... co dosłownie oznacza usunięcie całej linii:
+#user-register form.table-form .field-type-checkbox label {
(Bonus: jeśli używasz vima jako edytora, naciśnij, ddaby usunąć linię. Użytkownicy Nano naciśnij Ctrl+ K)
Twój edytor powinien wyglądać tak po zapisaniu:
Teraz popełnijmy.
I dla pewności zobaczmy zmiany od ostatniego zatwierdzenia.
Idealnie - widać, że tylko usunięcia zostały zawarte w tym zatwierdzeniu atomowym. Teraz zakończmy zadanie i dokonaj reszty.
Wreszcie możesz zobaczyć, że ostatnie zatwierdzenie zawiera tylko zmiany selektora.
źródło
+
z#
. Rezultat jest taki sam, ale może nie czujesz się komfortowo z usunięciem (i nie możesz cofnąć) lub chcesz poeksperymentować przed zapisaniem.r
#
ponad plus xDJeśli możesz użyć git gui, pozwala to na wprowadzanie zmian linia po linii. Niestety nie wiem, jak to zrobić z wiersza poleceń - a nawet jeśli jest to możliwe.
Inną opcją, z której korzystałem w przeszłości, jest wycofanie części zmiany (pozostawienie edytora otwartego), zatwierdzenie żądanych bitów, cofnięcie i ponowne zapisanie z edytora. Niezbyt elegancki, ale wykonuje pracę. :)
EDYCJA (użycie git-gui):
Nie jestem pewien, czy git-gui jest taki sam w wersjach msysgit i Linux, użyłem tylko jednego msysgit. Ale zakładając, że jest tak samo, po uruchomieniu są cztery panele: górny lewy panel to zmiany katalogu roboczego, dolny lewy to zmiany etapów, prawy górny to diff dla wybranego pliku (czy to reż. lub wyreżyserowane), a dolny prawy to opis zatwierdzenia (podejrzewam, że nie będziesz go potrzebować). Po kliknięciu pliku w prawym górnym rogu zobaczysz różnicę. Jeśli klikniesz prawym przyciskiem linię różnicową, zobaczysz menu kontekstowe. Dwie opcje do odnotowania to „stage hunk for commit” i „stage stage for commit”. Ciągle wybierasz „linię etapu do zatwierdzenia” w liniach, które chcesz zatwierdzić, i gotowe. Możesz nawet wybrać kilka linii i ustawić je, jeśli chcesz.
Jeśli chodzi o zatwierdzanie, możesz użyć narzędzia GUI lub wiersza polecenia.
źródło
git-gui
ale nie mam pojęcia, jak osiągnąć to, co opisujesz.Jednym ze sposobów na to jest pominięcie fragmentu,
git add
cokolwiek jeszcze potrzebujesz, a następniegit add
ponowne uruchomienie . Jeśli jest to jedyny fragment, będziesz mógł go podzielić.Jeśli martwisz się kolejnością zatwierdzeń, po prostu użyj
git rebase -i
.źródło
git add -p
znów biegnę , ale nie mogę go podzielić. Rozumiem:Stage this hunk [y,n,q,a,d,/,e,?]?
a następnie naciśnięcie „s” drukuje pomoc. BTW, miałeś na myśliadd patch
, niepatch add
? Czy jestgit patch
wtyczka, którą powinienem zainstalować?git rebase -i
. Który jest bardziej elastyczny niżcommit --amend