разница между статусом git branch.upstream и branch.ab

#git

Вопрос:

Я просто читаю git status документы (версия 2.34.0) и нашел что-то вроде этого:

 Line Notes ------------------------------------------------------------ # branch.oid lt;commitgt; | (initial) Current commit. # branch.head lt;branchgt; | (detached) Current branch. # branch.upstream lt;upstream_branchgt; If upstream is set. # branch.ab  lt;aheadgt; -lt;behindgt; If upstream is set and the commit is present. ------------------------------------------------------------  

Так что теоретически branch.upstream и branch.ab появляются при разных условиях, но, судя по моим тестам, они всегда появляются в одно и то же время.
Может ли кто-нибудь поставить условие, при котором появляется только branch.upstream ? Спасибо!

Комментарии:

1. Спасибо за ваши ответы! Я провел еще несколько экспериментов и выяснил, что ab также основан на файлах ref-ссылок/пультов дистанционного управления/ каталога. Эти файлы содержат последние фиксации этой ветви в origin. Поэтому, когда они существуют, ab также существует.

Ответ №1:

Я немного расширю свой комментарий к ответу LeGEC здесь.

Предположим, у вас есть хранилище:

 $ cd lt;somewhere-with-repositorygt;  

и у этого хранилища есть удаленное имя, например, origin , и у удаленного есть какая-то ветвь(ветви). Теперь мы сделаем git status --porcelain=v2 все возможное, чтобы получить пример вывода:

 $ git status --porcelain=v2 -b # branch.oid 2808ac68000c62c3db379d73e3b7df292e333a57 # branch.head master # branch.upstream origin/master # branch.ab  0 -0  

В этом конкретном хранилище есть только master и origin/master :

 $ git branch -a * master  remotes/origin/master  

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

 $ git switch -c foo Switched to a new branch 'foo' $ git status --porcelain=v2 -b # branch.oid 2808ac68000c62c3db379d73e3b7df292e333a57 # branch.head foo  

Теперь нам нужно установить значение вверх по origin/foo течению , но git branch -u мы отказываемся это делать:

 $ git branch -u origin/foo error: the requested upstream branch 'origin/foo' does not exist hint:  hint: If you are planning on basing your work on an upstream hint: branch that already exists at the remote, you may need to hint: run "git fetch" to retrieve it. hint:  hint: If you are planning to push out a new local branch that hint: will track its remote counterpart, you may want to use hint: "git push -u" to set the upstream config as you push.  

Но мы можем обойти это, используя базовые branch.foo.remote и branch.foo.merge настройки:

 $ git config branch.foo.remote origin $ git config branch.foo.merge refs/heads/foo # branch.oid 2808ac68000c62c3db379d73e3b7df292e333a57 # branch.head foo # branch.upstream origin/foo  

Использование git branch -vv показывает нам это:

 $ git branch -vv * foo 2808ac6 [origin/foo: gone] add xheap, for a priority queue for py3k  master 2808ac6 [origin/master] add xheap, for a priority queue for py3k  

Это то, что мы бы также увидели git push -u origin foo , если бы за этим последовало удаление origin/foo нашего собственного чернослива refs/remotes/origin/foo .

(Немного любопытно, что git branch -u это не позволит вам настроить эту ситуацию напрямую, так как это избавит вас от необходимости в git push -u дальнейшем и, следовательно, будет полезно в сценариях. Но git config команды более низкого уровня позволяют вам настроить эту ситуацию.)

Ответ №2:

Вы можете установить восходящий поток для ветви :

 git branch -u some/upstream  

Если yostate u выберет восходящий поток, который еще не существует (например: git branch -u origin/doesnt/exist/yet ), вы должны быть в этом «Если установлен восходящий поток». без»… и коммит присутствует».

[редактировать] : на самом деле (как отметил @torek), git branch -u some/upstream проверит, что some/upstream существует, и не позволит вам отслеживать несуществующую ветвь.
«отслеживание филиалов» хранится в конфигурации вашего репозитория, вы можете отредактировать файл конфигурации, чтобы принудительно установить несуществующую удаленную ветвь :

 [branch "test"]  remote = origin  merge = refs/heads/doesnt/exist  

На практике, однако, у вас не часто будет такая ситуация.

Как правило , вы устанавливаете отслеживание ветвей с помощью таких команд, как git checkout lt;origin/somebranchgt; или git push -u ... , обе из которых гарантируют, что «удаленная ветвь» существует во время создания или обновления ссылки.

Ситуация может возникнуть, когда удаленная ветвь будет удалена кем-то другим, и одна из ваших локальных ветвей все еще настроена на отслеживание этой удаленной ветви.

Комментарии:

1. Обратите внимание, что git branch --set-upstream-to он отказывается использовать имя удаленного отслеживания, которого еще не существует (пока или больше), но базовые механические биты будут разбиты на части, и, как вы говорите, это обычно происходит, когда ветвь другого удаленного устройства удаляется, и вы сделали обрезку.