В чем разница между Checkout и Cherry Pick?

Я получил конкретное исправление ошибки из удаленного репозитория. Теперь у меня есть два варианта:

  1. git checkout FETCH_HEAD
  2. git cherry-pick FETCH_HEAD

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

Хотя похоже, что я получил то, что мне было нужно, я все же хочу лучше понять, что происходит в обоих случаях.

Я видел этот вопрос и ответы, но я не понимаю ответа, потому что я не знаю, что означают следующие фразы:

  1. "рабочий каталог отражает X"
  2. «X приносит Y»

person Roman    schedule 05.02.2018    source источник


Ответы (3)


Вы правы - первой командой вы просто переключились на удаленные изменения, а последней применили удаленные изменения на вашей текущей ветке.

Помимо использования для разных задач, наиболее существенное отличие состоит в том, что git-cherry-pick изменяет историю ветки, а git checkout используется только для перехода к определенному моменту времени (конкретному коммиту) в истории ветки, не изменяя ее.

Переключение ветвей или восстановление файлов рабочего дерева

git-checkout используется для просмотра истории ветвей, указывая переменную HEAD на конкретную фиксацию. Он также используется для переключения между ветвями

Примените изменения, внесенные некоторыми существующими коммитами

git-cherrypick наоборот, используется для размещения одного коммита из другой ветки поверх истории веток.

Например, говорит, что у вас есть следующие ветки:

master:
-------
commit1 1ae4d13257425e6a0d67f35fa13e9d76c4e6987b
Date:   Thu Feb 1 15:59:15 2018 +0200


commit2 cbc7776d5542f59e1e6c7c8a22add729b
Date:   Thu Feb 1 15:44:41 2018 +0200

branch:
-------
commit1 c591438ff5abbcebcbf9c06f47de7aa840
Date:   Thu Feb 1 15:45:24 2018 +0200

Вы можете переключиться на ветку branch, используя:

git checkout branch

и из branch вы можете выполнить следующее:

git cherry-pick 1ae4d132

воспроизвести commit1 из мастера поверх commit1 из ветки, сделав это:

branch:
-------
commit1 1ae4d13257425e6a0d67f35fa13e9d76c4e6987b
Date:   Thu Feb 1 15:59:15 2018 +0200

commit1 c591438ff5abbcebcbf9c06f47de7aa840
Date:   Thu Feb 1 15:45:24 2018 +0200

Вы можете просмотреть свою историю и увидеть ее состояние, используя checkout:

 git checkout c591438ff5

Это укажет HEAD на фиксацию c591438ff5, показывая вам состояние ветки до выбора вишни (но это не изменит историю)

person Shmulik Klein    schedule 05.02.2018

cherry-pick позволяет вам взять один коммит из верхней части другой ветки (или из истории другой ветки) и применить его поверх вашей текущей ветки.

checkout - в вашем случае полностью заменяет вашу ветку на ветку из удаленного репозитория. UPD. На самом деле ваша предыдущая ветка все еще будет существовать в вашем локальном хранилище git, но после проверки ваша текущая ветка, и все ваши файлы в рабочем каталоге будут заменены той веткой, которую вы извлекаете.

person anber    schedule 05.02.2018

Проверьте, вы получите все изменения с самого начала, в то время как Cherry выберете, вы получите только определенные изменения.

person Noriel    schedule 05.02.2018
comment
что ты имеешь в виду с самого начала? Начало чего? - person Roman; 05.02.2018
comment
Запуск целой ветки вашего проекта. - person Noriel; 05.02.2018
comment
в какой-то момент пользователь вытащил мастер и внес всего одно изменение. Это изменение не было возвращено в master. Позже я вытащил мастер и внес свои изменения. Теперь я просто хочу применить изменение, сделанное другим пользователем, поверх моего кода. Итак, в этом контексте я не вижу никакой разницы между изменениями формы начала и просто конкретным изменением. Есть только одно изменение, которое я хочу применить к своей локальной версии кода. - person Roman; 05.02.2018