Что значит указать два больших двоичных объекта в `git rebase`?

Мой вопрос состоит из двух частей.

Первая часть: две капли в git rebase

Я знаком с git rebase -i HEAD^n, где n означает количество коммитов назад, на которое вы хотите выполнить ребазинг.

Но я также иногда вижу git rebase -i <branch> HEAD. В этом случае - как добавленный параметр <branch> имеет значение?

Вторая часть: справочная страница для git rebase

Итак.... Я проверил справочную страницу и вижу следующее:

Краткий обзор страницы руководства по git rebase

На этой справочной странице я вижу [<upstream> [<branch>]], который, я думаю, может ответить на мой вопрос к первой части.

Но особенность в том, что я знаю, что <> означает обязательный параметр, а [] означает необязательный параметр. В [<upstream> [<branch>]] я вижу обязательный параметр внутри необязательного параметра. Что это значит?


person makansij    schedule 13.09.2015    source источник
comment
<> не означает обязательный параметр. Отсутствие скобок [] означает, что. <> просто означает, что не нужно буквально помещать строку, которая находится внутри них, а заменять значение, которое имеет смысл в контексте.   -  person Chris Hayes    schedule 13.09.2015
comment
<parameter> не означает обязательный параметр. Это просто означает, что это не буквальное значение, то есть это то, что вы заменяете реальным значением, например, именем ветки. Обязательные параметры не указаны внутри [...].   -  person larsks    schedule 13.09.2015
comment
hmmmm этот источник указывает, что обязательные параметры находятся в ` ‹›`. Но то, что вы говорите, имеет больше смысла, учитывая контекст. Я предполагаю, что источник неверен?   -  person makansij    schedule 13.09.2015
comment
Blob — неправильный термин для использования. Я думаю, вы хотели сказать реф?   -  person Nayuki    schedule 13.09.2015
comment
Я думал, что ссылка — это тип blob, или я еще раз демонстрирую свое невежество?   -  person makansij    schedule 13.09.2015


Ответы (1)


Какое значение имеет добавленный параметр <branch>?

Это происходит потому, что rebase воспроизводит все коммиты между восходящим потоком и ветвью.

  • git rebase -i HEAD^n означает все коммиты между HEAD^n и текущей веткой HEAD
  • git rebase -i <branch> HEAD (или git rebase -i <branch>) означает все коммиты между <branch> HEAD (здесь это восходящая ветвь) и текущей ветвью HEAD. Например: git rebase -i origin/master HEAD: все еще не отправленные коммиты.

[<upstream> [<branch>]] означает, что оба параметра являются необязательными.
Поскольку git был создан автором Linux, см. справочные страницы — соглашения по написанию справочных страниц Linux

Квадратные скобки ([]) окружают необязательные аргументы.

Для git rebase эти необязательные параметры:

Если указано <branch>, git rebase автоматически выполнит git checkout <branch>, прежде чем делать что-либо еще. В противном случае он остается на текущей ветке.

Если <upstream> не указан, будет использоваться восходящий поток, настроенный в параметрах branch.<name>.remote и branch.<name>.merge.
Текущая ветвь сбрасывается на <upstream>. Это имеет тот же эффект, что и git reset --hard <upstream>.

Что касается <...> соглашения, см., например, Синтаксис служебного аргумента:

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

<parameter name>

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

Наконец, ссылка не является типом большого двоичного объекта.
Ссылка является (см. Git Internals — Git References) — ссылка на значение SHA1.
Большой двоичный объект представляет содержимое, хранящееся в репозитории git. См. Git Internals — Git Objects — Object storage< /а>.

person VonC    schedule 13.09.2015
comment
Это круто. Итак, будут использоваться параметры branch.<name>.remote и branch.<name>.merge — я тоже видел это на странице руководства. Но я проверил git-config(1), как там написано, и ничего по нему не нашел. Я также не смог найти его в файле config в каталоге .git. Подскажите где это найти? - person makansij; 13.09.2015
comment
@Hunle Если вы не можете найти конфигурацию в .git, это просто означает, что для этого репо еще нет локальной конфигурации. Эти две конфигурации устанавливаются, когда локальная ветвь имеет восходящую ветвь. См. git-scm.com/docs/git-branch: Когда локальная ветвь Начав с ветки удаленного отслеживания, Git настраивает ветку (в частности, записи конфигурации branch.<name>.remote и branch.<name>.merge), чтобы git pull соответствующим образом объединялся с веткой удаленного отслеживания. - person VonC; 13.09.2015
comment
Я предполагаю, что часть моего замешательства здесь связана с тем фактом, что HEAD, похоже, может относиться как к commit, так и к branch. Кажется, сначала он указывает на commit, а затем, при необходимости, может указать ветку, на которой находится этот коммит. Это правда? - person makansij; 13.09.2015
comment
@Hunle HEAD является текущим коммитом везде в git. См. мой старый ответ stackoverflow.com/a/964927/6309 и ответ выше этого старого ответа. - person VonC; 13.09.2015