2015-01-03 3 views
2

У меня есть вопрос, связанный с захватом вишни и конфликтами.фиксация вишни - это фиксация снимка или патча?

Книга «Pro Git» explains, которая совершает такие снимки, а не патчи/разности.

Но фиксация вишни может вести себя так, как будто это был патч.


Пример ниже, короче:

  1. создать 3 фиксаций, каждый раз редактировать первый (и сингл) строка файла

  2. сбросить ветку сначала совершить

  3. test1: попытаться выполнить третью фиксацию вихря (конфликт)

  4. тест 2: попробуйте вишни выбор второй фиксации (OK)


mkdir gitlearn 
cd gitlearn 

touch file 
git init 
Initialized empty Git repository in /root/gitlearn/.git/ 

git add file 

#fill file by single 'A' 
echo A > file && cat file 
A 

git commit file -m A 
[master (root-commit) 9d5dd4d] A 
1 file changed, 1 insertion(+) 
create mode 100644 file 

#fill file by single 'B' 
echo B > file && cat file 
B 

git commit file -m B 
[master 28ad28f] B 
1 file changed, 1 insertion(+), 1 deletion(-) 

#fill file by single 'C' 
echo C > file && cat file 
C 

git commit file -m C 
[master c90c5c8] C 
1 file changed, 1 insertion(+), 1 deletion(-) 

git log --oneline 
c90c5c8 C 
28ad28f B 
9d5dd4d A 

тест 1

#reset the branch to 9d5dd4d ('A' version) 
git reset --hard HEAD~2 
HEAD is now at 9d5dd4d A 

git log --oneline 
9d5dd4d A 

#cherry-pick 'C' version over 'A' 
git cherry-pick c90c5c8 
error: could not apply c90c5c8... C 
hint: after resolving the conflicts, mark the corrected paths 
hint: with 'git add <paths>' or 'git rm <paths>' 
hint: and commit the result with 'git commit' 

#the conflict: 
cat file 
<<<<<<< HEAD 
A 
======= 
C 
>>>>>>> c90c5c8... C 

тест 2

#same for 'B' - succeeds 
git reset --hard HEAD 
HEAD is now at 9d5dd4d A 

git cherry-pick 28ad28f 
[master eb27a49] B 
1 file changed, 1 insertion(+), 1 deletion(-) 

Пожалуйста, объясните, почему тест 1 не удалось (я мог представить себе ответ, если фиксации были патчами, но снимки hots?)

+0

В первом тесте произошел конфликт слияния. Так как вы сделали сброс во втором, это было успешно. –

+0

Г-н Поливик, спасибо за ответ, но: 1) не уверен, почему вы нарушили форматирование исходного сообщения 2) перед обеими испытаниями был жесткий сброс – MrCricket

+0

Переполнение стека может быть немного чувствительным, когда оно обнаруживает блоки кода. @ Mr.Polywhirl на самом деле не пытался ничего изменить, кроме как сделать нумерованный список, как вы можете видеть в истории изменений, щелкнув бок о бок уценку. Хотя было бы возможно определить проблемы форматирования в предварительном просмотре, я знаю по опыту, как легко его игнорировать. – hvd

ответ

7

Книга Pro Git верна: фиксация является моментальным снимком.

Вы также верны: git cherry-pick применяет патч.

Как это может быть? Ответ заключается в том, что когда вы выбираете фиксацию, вы также указываете, какой из родителей обязуется принять во внимание аргумент -m parent-number. Затем команда cherry-pick генерирует diff для этого родителя, так что полученный diff может применяться теперь.

Если вы решите выбрать нечетное объединение, то есть только один родитель, так что вы фактически не пропускаете -m, а команда использует (одиночный) родительский элемент для генерации diff. Но сама фиксация по-прежнему является моментальным снимком, и это команда cherry-pick, которая находит разницу commit^1 (первый и единственный родитель) против commit и применяет это.

+0

Извините, я до сих пор не понимаю.Из последнего абзаца вашего объяснения - что такое '' commit^1' * & * 'commit' * в моих тестах1 и test2? – MrCricket

+0

Git имеет богатый синтаксис для работы с графом фиксации. Вы можете назвать фиксацию своим сырым SHA-1 ('c18b86734113 ...' и т. Д.), Но вы также можете назвать его, отслеживая путь через граф фиксации. Каждая фиксация записывает свой родительский commit (s), а синтаксис '^' выбирает определенного родителя. Вы увидите больше на диаграммах фиксации в главе 3, например, http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging и селекторах версий в главе 7: http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection – torek

+0

Torek, я сформулировал свой вопрос неправильно, я знаю о SHA-1,^и ~. Вернемся к моим трем фиксациям A, B и C. В последнем предложении вы говорили о различии между commit и его родителем, который применяется c-p. Итак, мой вопрос: в test1 - эти коммиты - 9d5dd4d (A) и c90c5c8 (C), правильно? Таким образом, их различие «A \ n» против «C \ n», и это тот момент, который я не понимаю. Почему этот вишневый диск выходит из строя, а тест2 с разницей «A \ n» против «B \ n» преуспевает? – MrCricket

Смежные вопросы