Почему при копировании коммита git cherry-pick копирует всю ветку?

Здравствуйте!

При изучении git столкнулся с непониманием как оно должно работать в случае копирования веток.
Поговаривают, что cherry-pick берет git diff -U0 feature^ HEAD и копирует его в HEAD, но у меня не получилось .

Вот список моих коммитов:
spoiler

$ git log --oneline
5cab6cb (HEAD -> feature) Add D
a3f623d Add C
9b26f0e Add B
f5f7ec0 (master) Add A
449d5e5 Add .keep


В проекте один файл; в файле на каждый коммит приходится одно добавление строки указанное в комментарии.

Вот мой git diff -U0 feature^ HEAD:
spoiler

Anton@anton-home-001 MINGW64 /k/dev/git/test_2 (feature)
$ git diff -U0 feature^ HEAD
diff --git a/script.txt b/script.txt
index 05c9ba8..aa5292a 100644
--- a/script.txt
+++ b/script.txt
@@ -6,0 +7,2 @@ C
+D
+


А вот что я получаю, когда выполняю cherry-pick:
spoiler

Anton@anton-home-001 MINGW64 /k/dev/git/test_2 (master)
$ git cherry-pick feature
Auto-merging script.txt
CONFLICT (content): Merge conflict in script.txt
error: could not apply 5cab6cb... Add D
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'


Ок. Возник конфликт. Но почему? В ветке master после начала добавления коммитов в ветку feature не делались коммиты и в ветке feature только добавлялись строки.

Что в файле конфликта:
spoiler

A
<<<<<<< HEAD
||||||| parent of 5cab6cb (Add D)

B

C

=======

B

C

D

>>>>>>> 5cab6cb (Add D)


И как видно тут совсем не "diff -U0 feature^ HEAD", а что-то вроде "$ git diff -U0 master...feature", т.е. то что мне добавил cherry-pick больше похоже на то, что сделал бы merge, кроме метаданных, которые копируются.

1. Это я неправильно понимаю как должна работать эта команда или здесь что-то пошло не так?
2. Каков алгоритм работы cherry-pick?
3. Если cherry-pick работает также как merge, то может лучше тогда делать для копирования squash?
  • Вопрос задан
  • 480 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Ок. Возник конфликт. Но почему?

Потому что изменения применяются как патчи, с учётом контекста. А не тупо в лоб "вставить две строки со следующим содержимым начиная со строки 7".

1. Это я неправильно понимаю как должна работать эта команда или здесь что-то пошло не так?

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

3. Если cherry-pick работает также как merge, то может лучше тогда делать для копирования squash?

cherry-pick не работает как merge. merge сливает историю веток целиком, cherry-pick применяет одно единственное изменение.

Попробуй вносить свои изменения (Add A, Add B, Add C, Add D) в разные файлы чтобы увидеть разницу.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы