git giff | merge не игнорирует пробелы как одинаковые - PullRequest
0 голосов
/ 12 января 2019

Я имею в виду, моя проблема в точности противоположна Игнорировать * все * изменения пробелов при помощи git-diff между коммитами

(Ubuntu, git 2.17.1)

$ git checkout development
$ git diff development master
...
-// some text
+    // some text
...

Хорошо, нет критических списков различий, автоматическое объединение должно быть успешно выполнено. Но вот что:

$ git merge master
up to date.

Я хочу объединить точно так же! Более ранние проекты, над которыми я работал с Windows, нашли и объединили абсолютно все эти тривиальные различия. По какой причине Git не объединяет эти различия, хотя "git diff" обнаруживает это?
Вот мой

$ git config --list
diff.tool=meld
difftool.prompt=false
difftool.meld.cmd=meld $LOCAL $REMOTE
merge.tool=meld
mergetool.meld.cmd=meld $LOCAL $MERGED $REMOTE --output $MERGED
credential.https://....git.beanstalkapp.com.username=gitusername
color.ui=auto
user.email=gitusername@server.de
user.name=gitusername
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=https://....git.beanstalkapp.com/liebesschloss.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.development.remote=origin
branch.development.merge=refs/heads/development

Кто-нибудь может поддержать меня в настройке и / или использовании git, чтобы позаботиться обо всех пробелах?
Может быть, я не могу видеть дерево через весь лес?

1 Ответ

0 голосов
/ 12 января 2019

Я хочу объединить точно так же!

Это не то, что делает 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...