Git cherry-wybierz składnię i połącz gałęzie

Więc zrobiłem niezliczoną ilość Cherry picks wcześniej i wydaje się, że muszę zawieść w życiu z tym teraz, próbuję cherry pick z jednej gałęzi do drugiej, co powinno być łatwe, jak kiedykolwiek dostanę błąd, że to jest połączenie, ale nie podano-m?

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given.
fatal: cherry-pick failed

To wygląda wrong.......it powinno być:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0

Od kiedy muszę dostarczać funkcję a - m?

Author: Frank, 2012-09-27

5 answers

Musisz podać -mjeśli commit jest merge commit , tzn. commit z więcej niż jednym rodzicem.

Zwykle to, co robi git cherry-pick REV można opisać jako:

  1. Weź zmiany między rev a jego rodzicem.

  2. Zastosuj te zmiany do bieżącej nagłówka i zatwierdź wynik za pomocą komunikatu zatwierdzającego rev.

Commit merge łączy dwie linie rozwoju. Na przykład jedna linia implementuje widżet, a inna linia usuwa bałagan. Połączenie daje kod z widżetem, bez bałaganu.

Teraz rozważ krok # 1 procesu cherry-pick: git nie może zgadnąć, czy chcesz usunąć bałagan, czy zaimplementować widżet. Nie możesz też zrobić obu, ponieważ informacje o tym, jak zrobić oba nie są zawarte w pojedynczym commicie scalającym, tylko zawartość powstałego scalonego drzewa jest.

Opcja -m pozwala ci powiedzieć gitowi, jak ma postępować. Na przykład, jeśli usunięcie bałaganu stało się na master I commit merge został utworzony za pomocą git merge WIDGET, następnie {[5] } wybierze nowy widżet, ponieważ różnica między scalonym drzewem a rodzicem 1 (ostatnim z commitów usuwających bałagan) będzie dokładnie dodatkiem widżetu. Z drugiej strony, git cherry-pick -m 2 merge-commit usunie bałagan, ponieważ różnica między rodzicem 2 (ostatnim z widżetów dodających commity) i merge-commit jest dokładnie tą różnicą, że nie ma bałaganu w gałęzi widżetu.

 67
Author: user4815162342,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 20:53:41

Git prosi Cię o podanie numeru rodzica (-m), ponieważ Twój commit merge ma dwóch rodziców i git nie wie, która strona merge powinna być traktowana jako główna linia. Więc za pomocą tej opcji możesz podać numer rodzica (zaczynając od 1) linii głównej i cherry-pick, aby odtworzyć zmianę względem podanego rodzica.

Aby dowiedzieć się swoich rodziców, spróbuj:

git show --pretty=raw <merge_commit>

Lub:

git cat-file -p <merge_commit>

Lub nawet dla lepszego GUI widoczność, spróbuj:

gitk <merge_commit>

W rezultacie powinieneś otrzymać coś w stylu:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit>
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>

Następnie sprawdź dane każdego rodzica przez:

git show <parent1_or_2_commit>

Dodaj --stat, aby zobaczyć listę zmodyfikowanych plików.

Lub użyj następującego polecenia, aby porównać zmiany (na podstawie powyższego rodzica):

git diff <parent1_or_2_commit>..<commit>

Dodaj --stat, aby zobaczyć listę zmodyfikowanych plików.

Lub użyj połączonego rozróżnienia, aby porównać dwoje rodziców według:

git diff --cc <parent1_commit>
git diff --cc <parent2_commit>

Następnie podaj numer rodzica począwszy od 1 dla cherry-pick, np.

git cherry-pick -m 1 <merge_commit>

Następnie uruchom git status, aby zobaczyć, co się dzieje. Jeśli nie chcesz jeszcze zatwierdzać zmian, Dodaj opcję -n, aby zobaczyć, co się stanie. Następnie, gdy nie jesteś szczęśliwy, Resetuj do głowy (git reset HEAD --hard). Jeśli pojawią się konflikty w git, prawdopodobnie będziesz musiał rozwiązać je ręcznie lub określić strategię merge (-X), zobacz: Jak rozwiązać konflikty merge w Git?

 14
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:31

Osobiście zwykle robię to tak, że ponieważ merge łączy 2 commity, na przykład jeśli mam merge commit C, który składa się z 2 rodziców, np. commit A w master I commit B z drugiej gałęzi, która jest scalana, jeśli potrzebuję cherry pick the merge nie zawracałbym sobie głowy mylącym poleceniem cherry pick the merge commit itself, ale zamiast tego po prostu cherry pick the merge commit itself, jest to również pomocne w sytuacji, gdy chcesz tylko cherry pick commit B tylko w przypadku, gdy commit a od master był już cherry-picked do gałęzi 1 jest cherry picking do przed połączeniem.

 3
Author: Wyclif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 16:48:42

Składnia stron podręcznika jest następująca:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...

Numer rodzica odnosi się do:

-m parent-number, --mainline parent-number, zazwyczaj nie możesz wybrać połączenia, ponieważ nie wiesz, która strona połączenia powinna być uważana za linię główną. Ta opcja określa numer rodzica (zaczynając od 1) linii głównej i pozwala cherry-pick odtworzyć zmianę względem podanego rodzica.

Więc chciałbym sprawdzić dwukrotnie, aby upewnić się, że masz poprawny hash commit. Może być tak, że chcesz takiego, który nie pochodzi z połączenia, ale raczej z commit przed nim. W przeciwnym razie musisz użyć tej flagi i wskazać właściwą stronę scalenia, aby rozdzielić żądanie.

 2
Author: Magikhead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 17:45:28

Spróbuj połączyć wynik:

git cherry-pick ....
git mergetool
git cherry-pick --continue
 0
Author: Knase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-30 18:36:43