Mam dwie gałęzie devel
i next
. W wersji deweloperskiej mam mniej lub bardziej dużą liczbę zatwierdzeń. Niektóre z zatwierdzeń są niezwykle przydatne next
. Dodałem także kilka zatwierdzeń do następnego, które są scalane do devel
.
Teraz chciałbym zobaczyć, czego brakuje next
, więc mogę szczegółowo przetestować zmiany, zanim je wprowadzę next
. Moje pytanie brzmi teraz, jak mogę zobaczyć, które zmiany są w grze, devel
a nie w następnej?
Odpowiedzi:
Rzadko używane polecenie
git cherry
pokazuje zatwierdzenia, które nie zostały jeszcze wybrane. Dokumentacja dlagit cherry
jest tutaj , ale krótko mówiąc, powinieneś być w stanie zrobić:... i zobacz wyjście trochę w ten sposób:
Commity zaczynające się od
+
będą tymi, których jeszcze nie wybrałeśnext
. W tym przypadku wybrałem jak dotąd tylko jedną rewelacyjną zmianę. Możesz chcieć dodać-v
parametr dogit cherry
polecenia, aby wyświetlał również wiersz tematu każdego zatwierdzenia.źródło
git checkout devel
, po prostu możesz to zrobićgit cherry next devel
.-v
” ? Wiśnia bez-v
jest jakls
bez-la
. ; -Jcherry
na zaznaczenie lub wykluczenie równoważnych zatwierdzeń, prawda?cherry
wydaje się być poleceniem wodno-kanalizacyjnym, ale nie oferuje wielu opcji. To, w czym obecnie jestem,git cherry
daje mi fałszywe alarmy, ale @ sehegit log --cherry-pick
poprawnie wyklucza wcześniej wybrane / ponownie bazowane zatwierdzenia.Możesz także użyć
Aby uzyskać listę miłe z rzeczywistych różnych zatwierdzeń nie dzielonych między gałęziami.
Słowem operacyjnym jest
--cherry-pick
Aktualizacja Jak wspomniano w komentarzu, dodano najnowsze wersje git
--cherry-mark
:źródło
Możesz spróbować wykonać podzbiory dziennika git:
źródło
--left-only
byłoby lepsze). Jednak można to nieco ulepszyć, dodając,--no-merges
aby pominąć wszelkie zatwierdzenia scalające (np. Jeśli funkcja lub gałąź poprawki została scalona (osobno) zarówno do wersji devel, jak i następnej). Ściśle mówiąc, rozwiązywanie konfliktów podczas fuzji może powodować inne różnice, ale zwykle tak nie jest. Tę--no-merges
opcję można z powodzeniem zastosować także do innych odpowiedzi.Co powiesz na
Wynik jest podobny do odpowiedzi Byrana (inna kolejność zatwierdzeń), ale obie nasze odpowiedzi spowodują zmiany w różnych gałęziach, pokazując raczej, co jest w jednej gałęzi, a nie w drugiej.
źródło
git log next..
Aby uzyskać listę zatwierdzeń, które nie zostały zintegrowane z gałęzią wydania (dalej), możesz użyć:
Sprawdź listę git-rev-list, aby uzyskać więcej informacji.
źródło
next...devel
@Mark Longair przytoczył to w swojej odpowiedzi tutaj , ale chciałbym dodać dodatkowe informacje.
Powiązane i odpowiadanie na pytanie, jak rozbić duże żądanie ściągnięcia (PR), zwłaszcza gdy zgniatanie twoich zatwierdzeń jest niepraktyczne ze względu na jedno lub więcej połączeń mastera z twoją gałęzią funkcji
Moja sytuacja:
zrobiłem duży
feature_branch
z 30 zatwierdzeniami i otworzyłem pull request (PR) na GitHub, aby go scalićmaster
. Oddziałmaster
zmienił tonę pode mną i otrzymał 200 zatwierdzeń,feature_branch
których nie miałem. Aby rozwiązać konflikty, zrobiłemgit checkout feature_branch
igit merge master
scaliłemmaster
zmiany w moimfeature_branch
. Zdecydowałem sięmerge
zamiastrebase
na najnowszą wersję master, więc musiałem rozwiązywać konflikty tylko raz zamiast potencjalnie 30 razy (raz na każde z moich zatwierdzeń). Nie chciałem najpierw zmiażdżyć moich 30 zatwierdzeń do 1, a następnie bazować na najnowszychmaster
ponieważ może to wymazać historię komentarzy przeglądu GitHub w PR. Tak więc scaliłem master z moją gałęzią funkcji i rozwiązałem konflikty 1 raz. Wszystko było dobrze. Mój PR był jednak zbyt duży, aby moi koledzy mogli go przejrzeć. Musiałem to rozdzielić. Poszedłem zmiażdżyć moje 30 commits i O NIE! GDZIE ONI SĄ? WSZYSCY ZWIĄZANI Zmaster
200 ostatnich zatwierdzeń teraz, ponieważ połączyłemmaster
się z moimfeature_branch
! CO JA ROBIĘ?git cherry
użycie w przypadku, gdy chcesz spróbowaćgit cherry-pick
indywidualnych zatwierdzeń:git cherry
na ratunek (w pewnym sensie)!Aby zobaczyć wszystkie zatwierdzenia, które są w środku,
feature_branch
ale NIE w nichmaster
, mogę zrobić:LUB, mogę sprawdzić zatwierdzenia z DOWOLNEJ gałęzi BEZ upewnienia się, że jestem na
feature_branch
pierwszym, robiąc wgit cherry [upstream_branch] [feature_branch]
ten sposób. Ponownie, to sprawdza, które zatwierdzenia SĄ,feature_branch
ale NIEupstream_branch
(master
w tym przypadku):Dodanie
-v
pokazuje również wiersze tematu wiadomości o zatwierdzeniu:Potok do „word count” „-lines” (
wc -l
) zlicza liczbę zatwierdzeń:Możesz porównać tę liczbę z liczbą zatwierdzeń pokazaną w swoim PR GithHub, aby poczuć się lepiej wiedząc,
git cherry
że naprawdę działa. Możesz także porównać skróty git jeden po drugim i zobaczyć, czy pasujągit cherry
do GitHub. Zauważ, żegit cherry
nie będą się liczyć żadnych zobowiązuje korespondencji seryjnej, gdzie połączyłymaster
sięfeature_branch
, ale GitHub woli. Więc jeśli zauważysz niewielką rozbieżność w liczbie, przeszukaj stronę zatwierdzenia PR GitHub w poszukiwaniu słowa „scalanie”, a prawdopodobnie zobaczysz, że to winowajca, który się nie pojawiagit cherry
. Na przykład: zatwierdzenie zatytułowane „Merge branch 'master' into feature_branch” pojawi się w GitHub PR, ale nie po uruchomieniugit cherry master feature_branch
. To jest w porządku i oczekiwane.Więc teraz mam sposób, aby dowiedzieć się, które różnice mogę chcieć wybrać na świeżą gałąź funkcji, aby podzielić ten różnicę: mogę użyć
git cherry master feature_branch
lokalnie lub spojrzeć na zatwierdzenia w GitHub PR.Jak zgniatanie mogłoby pomóc - gdybyśmy tylko mogli zgnieść:
Alternatywą jednak, aby podzielić moją dużą różnicę, jest zgniecenie wszystkich 30 moich zatwierdzeń w jedną, załatanie tego na nową gałąź funkcji, miękkie resetowanie zatwierdzenia poprawki, a następnie użycie
git gui
do dodawania elementów plik po pliku, kawałek po kawałku lub linia po linii. Gdy dostanę jedną podfunkcję, mogę zatwierdzić to, co dodałem, a następnie sprawdzić nową gałąź, dodać więcej, zatwierdzić, sprawdzić nową gałąź itp., Aż moja duża funkcja zostanie podzielona na kilka podfunkcji . Problem polega na tym, że moje 30 zatwierdzeń jest przeplatanych z pozostałymi 200 zatwierdzeniami innych osób z powodugit merge master
mojegofeature_branch
, więc zmiana bazy jest zatem niepraktyczna, ponieważ musiałbym przesiać przez 230 zatwierdzeń, aby zmienić kolejność i zgnieść moje 30 zatwierdzeń.Jak użyć pliku poprawki jako znacznie łatwiejszego zamiennika dla zgniatania:
Aby obejść ten problem, wystarczy po prostu uzyskać plik łatki zawierający „odpowiednik squasha” wszystkich 30 moich zatwierdzeń, załatać go na nowy rozwidlenie
master
(nowej gałęzi podrzędnej) i zacząć od tego w następujący sposób:Teraz mam moją łatkę z 30 zatwierdzeniami, wszystkie zaaplikowane lokalnie, ale nie na scenie i niezatwierdzone.
Teraz użyj,
git gui
aby dodać pliki, fragmenty i / lub linie i rozbić swój duży PR lub „różnicę”:Zauważ, że jeśli nie masz
git gui
, możesz łatwo zainstalować go w Ubuntu za pomocąsudo apt install git-gui
.Mogę teraz uruchomić
git gui
i rozpocząć dodawanie plików, fragmentów i / lub linii (klikając prawym przyciskiem myszy w programie git GUI) i podzielić gałąź funkcji 30 commit na podgałęzie, jak opisano powyżej, wielokrotnie dodając, zatwierdzając, a następnie rozwidlając nowa gałąź funkcji i powtarzanie tego cyklu, aż wszystkie zmiany zostaną dodane do gałęzi podrzędnej, a moja funkcja z 30 zatwierdzeniami zostanie pomyślnie podzielona na 3 lub 4 funkcje podrzędne. Mogę teraz otworzyć osobny PR dla każdej z tych podfunkcji i mojemu zespołowi będzie łatwiej je przejrzeć.Bibliografia:
źródło