Почему исключение коммитов через символ каретки фактически не исключает коммиты в командной строке? - PullRequest
0 голосов
/ 10 января 2019

С https://git -scm.com / docs / git-rev-parse # _specifying_ranges :

Фиксация исключений

^ (каретка) Обозначение

Чтобы исключить коммиты, достижимые из коммита, используется префикс ^. Например. ^ r1 r2 означает коммиты, достижимые из r2, но исключая достижимы из r1 (то есть r1 и его предков).

У меня есть тестовый репозиторий, в котором я опробовал этот синтаксис. Для целей этого вопроса он состоит из трех обычных коммитов:

git log --pretty=oneline topic1
77ffe1ada25be4b465be9fc9b46f63981ecc8b16 (origin/topic1, topic1) second commit of topic 1
b5803f6c59cbc9ae6b4bba81b0d5ad8cfbd8f23a start of topic 1
75400b34ebc0936dd28513c686c8adb526f063e6 (origin/master) Initial Commit

Давайте попробуем исключить все, кроме самого последнего коммита:

git log --pretty=oneline ^topic1~ topic1
77ffe1ada25be4b465be9fc9b46f63981ecc8b16 (origin/topic1, topic1) second commit of topic 1
b5803f6c59cbc9ae6b4bba81b0d5ad8cfbd8f23a start of topic 1
75400b34ebc0936dd28513c686c8adb526f063e6 (origin/master) Initial Commit

Это не сработало. Это кажется странным, учитывая, что мы отлично следуем обозначениям карета. Предположим, мы вместо этого пытаемся использовать хеш коммита:

git log --pretty=oneline ^b5803 topic1
77ffe1ada25be4b465be9fc9b46f63981ecc8b16 (origin/topic1, topic1) second commit of topic 1
b5803f6c59cbc9ae6b4bba81b0d5ad8cfbd8f23a start of topic 1
75400b34ebc0936dd28513c686c8adb526f063e6 (origin/master) Initial Commit

Все еще не работает. Напротив, другие обозначения работают как ожидалось:

git log --pretty=oneline topic1 --not topic1~
77ffe1ada25be4b465be9fc9b46f63981ecc8b16 (origin/topic1, topic1) second commit of topic 1

git log --pretty=oneline topic1~..topic1
77ffe1ada25be4b465be9fc9b46f63981ecc8b16 (origin/topic1, topic1) second commit of topic 1

Почему запись исключения каретки не ведет себя так же?

Ответы [ 2 ]

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

Вы не сказали, какую платформу вы используете. Но позвольте мне предположить: вы находитесь в Windows, и вы вводите эти команды в командной строке Windows, CMD.

CMD - странный зверь. В частности, каретка ^ - это какой-то экранирующий символ. Чтобы передать один вызов в вызываемую программу, вы должны ввести в командной строке два символа:

git log --pretty=oneline ^^topic1~ topic1

Я обычно держусь подальше от ^ и использую --not вместо:

git log --pretty=oneline topic1 --not topic1~

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

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

Командная строка обрабатывает символ вставки как escape-символ, то есть карат заставляет командную строку интерпретировать символ, следующий за ним, как литерал. Это приводит к тому, что каретка не действует в этом случае. В командной строке вы можете использовать две каретки (^^) всякий раз, когда вы обычно используете одну:

git log --pretty=oneline ^^topic1~ topic1
77ffe1ada25be4b465be9fc9b46f63981ecc8b16 (origin/topic1, topic1) second commit of topic 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...