Я хочу объединить точно так же!
Это не то, что делает git merge
.
Сделайте шаг назад и подумайте, что цель git merge
состоит в том, чтобы объединить работу . Предположим, что вы и какой-то другой парень, назовем его Фред, начнем с одинаковых файлов. Одним из них является файл, который использует //
комментариев.
Фред изменяет код в строке 55. Между тем, вы замечаете, что в комментарии неправильно написано:
// some tuxt
следует читать:
// some text
и, возможно, стоит отступить по-другому. Итак вы исправьте строку 12.
Теперь, в какой-то момент в будущем вы получите коммиты Фреда. Вы запускаете:
git diff <mine> <fred>
или
git diff <fred> <mine>
Одна из вещей, которая появляется по-другому, это исправление комментария , которое вы сделали. Если git merge <fred>
просто сделает ваш файл таким же , что и у Фреда, это отменит ваше исправление орфографии . Следовательно, git merge
не использует результат git diff
двух коммитов ветки tip.
Итак, что использует git merge
?
Операция Git по слиянию зависит от нахождения базы слияния . Основой слияния, по сути, является общий коммит, с которого вы и Фред оба начали. Нахождение базы слияния - это вопрос изучения графика коммитов .
График коммитов появляется из-за того, что каждый коммит имеет родительский коммит. 1 Родитель вашего текущего коммита - тот, который был непосредственно перед вами или кем бы то ни было сделал ваш текущий коммит. Родитель этого коммита - тот, который был до него и так далее. Git работает, следуя этим обратным родительским цепочкам. Более подробно об этом см. Многие другие мои ответы на похожие вопросы о слиянии.
В частности, вы запустили:
git merge master
и получил:
Already up to date.
Это конкретное сообщение появляется, когда ваша ветвь на опережает master. То есть предположим, что граф фиксации выглядит так:
... <-F <-G <-H <-- master
\
I <-J <-- development (HEAD)
Ваш текущий коммит - это коммит J
(здесь J
обозначает большой некрасивый хеш-идентификатор), чьим родителем является коммит I
, чьим родителем является коммит H
. Так что, если в нашей маленькой «комбинированной работе», master
представляет последнюю работу Фреда, а development
представляет вашу, то команда: Объединить работу Фреда с моей тривиально удовлетворена: вы оба начали с Последний Фред, совершить H
. Вы сделали некоторые изменения с тех пор. Git просто сохраняет то, с чего вы начали.
1 Некоторые коммиты имеют двух родителей. Эти коммиты немного особенные в том смысле, что они являются merge коммитами. По крайней мере один коммит в репозитории имеет нет родителей, потому что это был самый первый коммит и не могло быть родителя.
Просмотр графика коммитов
Существует много способов просмотра графика фиксации, в том числе с различными графическими интерфейсами или средством просмотра на основе tcl / tk gitk
, которое поставляется с Git. В некоторых случаях они лучше, чем средство просмотра текстовых графиков, встроенное непосредственно в Git, но это средство просмотра всегда присутствует и не зависит от внешнего программного обеспечения, как эти графические средства просмотра.
Запустите git log --graph
и Git сгенерирует график. Поскольку вывод git log
длинный, вы не увидите ничего на странице, поэтому вы можете указать git log
использовать одну строку для каждого коммита:
git log --oneline --graph
Это покажет вам график, начиная с вашего текущего коммита и работая в обратном направлении. Чтобы убедиться, что Git сообщает вам, что первый коммит является вашим текущим коммитом, вы можете добавить опцию --decorate
или включить log.decorate
в вашей конфигурации:
git log --decorate --oneline --graph
(или git config log.decorate auto
, что подразумевает --decorate
автоматически при использовании git log
в командной строке). И, чтобы Git начал работать в обратном направлении от всех ветвей и всех тегов, вы можете добавить --all
: 2
git log --all --decorate --oneline --graph
Или в данном конкретном случае вы можете использовать:
git log --decorate --oneline --graph master develop
, чтобы сказать Git: начиная с master
и develop
, покажите мне коммиты вместе с их родительскими отношениями. Это позволит вам просмотреть график и проинформирует вас (в некоторой степени, по крайней мере, ) о том, что Git увидит в качестве базы слияния между master
и develop
.
2"Весь граф Oneline" - очень полезная комбинация, которую можно запомнить с помощью мнемоники: получить помощь от A СОБАКА от Симпатичные графы веток git .