Как git cherrypick все изменения, внесенные в конкретную ветку

Фоновая информация:

Из-за ограничений в рабочем процессе с существующими системами нам нужно настроить несколько неортодоксальный процесс git.

(patch)    A-B---F
             |   |
(hotfix)     C-D-E
                 |
(dev)      1-2-3-G

На ветке патча есть некоторые коммиты. Файлы здесь похожи, но не идентичны тем, что есть на dev (сценарии синхронизации переключаются вокруг порядка настроек во многих файлах, что делает их отображаемыми, когда они функционально одинаковы).

В этой ветке требуется исправление, поэтому ветвь исправления создается и обрабатывается. Эта ветвь затем сливается обратно в патч, пока что так хорошо.

Это же исправление необходимо развернуть в ветки dev, чтобы он оставался относительно синхронным с патчем, но попытка слияния ветки исправления приводит к git, пытающемуся объединить все несвязанные и неизменные файлы из A и B а не только C, D и E.

Вопрос:

Кажется, что cherry-pick делает то, что мы хотим с точки зрения получения изменений только от выбранных коммитов, но мне бы очень хотелось, чтобы вишневый выбор всех коммитов в данной ветке сразу, без необходимости искать фиксацию ids каждый раз.

Ответ 1

Кажется, что cherry-pick делает то, что мы хотим, только в том, чтобы получать изменения от выбранных коммитов, но мне бы очень хотелось, чтобы вишня-пикап выбрала все коммиты в данной ветке сразу, без необходимости каждый раз искать идентификаторы коммитов.,


Использование cherry-pick

git cherry-pick позволяет вам выбирать любые коммиты, сделанные вами в любой ветке, в любую другую ветку. В вашем случае вы можете просто извлечь основную ветку и затем cherry-pick все коммиты из любой ветки, которую вы пожелаете (cherry-pick поддерживает диапазоны, поэтому вы можете указать начальный и конечный коммит вместо перечисления всех коммитов).

Таким образом, вы можете контролировать, как ваши коммиты будут отображаться в нужной ветке.

Например:

git cherry-pick ebe6942..905e279

# Find the range of commits you wish to re-add to your branch.
# then use cherry-pick to add them back to the branch
git cherry-pick start..end

# If you wish to include the start commit as well add the ^
# This will result in a cherry-pick of the start commit included as well 
git cherry-pick start^..end

Как найти первый коммит ветки?

git log

 # print out the latest commit (first one) of the given branch
 git log  --oneline | tail -1

merge-base

Используйте команду merge-base чтобы найти, где ветвь была отделена от исходной ветки:

git merge-base A B

Ответ 2

Оформите свою ветку (целевую ветку) и сделайте

git cherry-pick -m 1 хэш-код

Ответ 3

Если вы хотите выбрать все коммиты из ветки dev.

Пытаться:

мерзкая вишня

Ответ 4

Это также должно работать. Мы называем точку расхождения между ГОЛОВКОЙ (в данном случае мастером) и ветвью и передаем ее вишневому пику.

git merge-base origin/dev_single_doc_fit HEAD | xargs git cherry-pick {}..HEAD^

Ответ 5

еще один способ перемотки вперед.

Дело:

Вы запустили newBranch, сделали первый коммит и сбросили Hard.

В результате вы получили пустой newBranch, нет того позднего коммита и git tree чист в HEAD. Вы находитесь в ветке newBranch (можете проверить с помощью git branch).

Вот два шага действия:

  • получить список коммитов в 'мусор'

git fsck --lost-found

  • передайте пропущенный коммит обратно в вашу ветку с помощью:

git cherry-pick --ff 43a7a2d