Представляет ли `branch. <name>.merge 'удаленную ветвь отслеживания или восходящую ветвь? - PullRequest
0 голосов
/ 14 января 2019

Представляет ли branch.<name>.merge удаленную ветвь отслеживания или восходящую ветвь?

  1. Контроль версий с помощью Git говорит

    Но как Git узнал, как объединить эти конкретные ветви? Ответ исходит из файла конфигурации:

    [branch "master"]
            remote = origin
            merge = refs/heads/master
    

    Перефразируя, это дает Git два ключевых элемента информации: когда master текущая, извлеченная ветвь, используйте origin в качестве удаленного по умолчанию из которого можно получить обновления во время выборки (или извлечения). Далее, на этапе слияния git pull, используйте refs/heads/master из удаленного в качестве ветви по умолчанию, чтобы слить в это, мастер филиал.

    Цитата говорит "на этапе слияния git pull используйте refs/heads/master с пульта как ветка по умолчанию для объединения в этом, мастер ветвь. "Мне кажется, что branch.<name>.merge представляет удаленную ветвь отслеживания вместо ветвь вверх по течению.

    Но refs/heads/master в merge = refs/heads/master не выглядит как ветка удаленного отслеживания (которая должна выглядеть refs/remotes/<remote>/master), но ветка темы, так кажется мне только ветка вверх по течению.

  2. Руководство git config говорит

    branch.<name>.merge
    

    Определяет вместе с ответвлением ... удаленную ветвь для данная ветка.

    Кажется, что branch.<name>.merge представляет восходящую ветвь вместо удаленной ветки отслеживания.

  3. Возможно ли, что branch.<name>.merge подразумевает оба пульта отслеживание ветки и ветки вверх по течению? Я не думаю, что это возможно, потому что ветка удаленного отслеживания и соответствующая ей Восходящая ветвь (и) может иметь разные базовые имена, в зависимости от того, как remote.<remote>.fetch настроено.

Ответы [ 2 ]

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

git config remote.origin.fetch покажет вам "refspec", который отображает имена ссылок на пульте origin в локальную "ветку удаленного отслеживания" refs.

По умолчанию

+refs/heads/*:refs/remotes/origin/*

и он говорит, что нужно извлечь все ссылки на источник, которые запускают "refs /heads" и заменить текст * 'd в локальном переписывании, поэтому refs/heads/master * равно master, и вот что получает вставку для * в локальной ссылке, «ветке удаленного отслеживания» ref 1 .

В файле конфигурации указывается, из какого хранилища вышла ветка ветки, и каково имя в этом хранилище. Когда вы перебираете, извлекаете или объединяете неявный апстрим, Git просматривает имя ветви и refspec для его исходного репо, обычно origin, и выясняет, какой ref будет отображаться в этом репозитории.

So

[branch "master"]
        remote = origin
        merge = refs/heads/master

[remote "origin"]
        url = git://github.com/git/git
        fetch = +refs/heads/*:refs/remotes/origin/*

локальная ветвь master отслеживает origin ветвь master и извлекает из origin отображает эту ветвь здесь на refs/remotes/origin/master здесь, так что это история rebease и pull и, вероятно, некоторые другие проверяют по умолчанию чтобы найти, где или разошлись ли истории.


1 Ведущий + просто означает «не жалуйся, если выборка откажется от истории», что, конечно, именно так, как вы хотите, чтобы выборка работала, когда вы просто отслеживаете, что происходит с рефами пульта. Посмотрите документы выборки для большего количества его поведения по умолчанию, например. есть моменты, когда вы хотите получить теги, времена, когда вы не

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

Вкратце, branch.<name>.merge содержит имя удаленной ветви на удаленном сервере: это восходящая ветвь.

Как убедить себя, что это правда:

Предполагая, что ветвь origin/dev1 существует, но пока не существует локального dev1, запустите:

git checkout dev1
git branch -m dev1 dev2

Эти команды устанавливают dev1 как имеющий origin/dev1 в качестве восходящего направления, затем переименовывает его в dev2.

Результаты в моем .git/config таковы:

[branch "dev2"]
    remote = origin
    merge = refs/heads/dev1

Теперь refs/heads/dev1 - это то, чего нет нигде в моей песочнице, только на пульте.

Некоторые дополнительные уточнения имен, основанные на обсуждении в комментариях:

локальная ветвь : master или dev2 - это локальные ветки, которые могут обновляться из своей восходящей ветки.

ветвь удаленного отслеживания : origin/master или refs/remotes/origin/master - это указатель, сохраненный локально для состояния удаленной ветки на момент последнего git fetch или git pull.

восходящая ветка : это настоящая удаленная ветвь на самом удаленном сервере, а не что-то локальное.

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