#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
он отказывается использовать имя удаленного отслеживания, которого еще не существует (пока или больше), но базовые механические биты будут разбиты на части, и, как вы говорите, это обычно происходит, когда ветвь другого удаленного устройства удаляется, и вы сделали обрезку.