Git: как перейти от "Нет ветки" к новой удаленной ветке?


Я сделал:

git co upstream/master  # To no branch.
<then did a trivial edit on some file...>
git commit -a -m "Trivial edit"
git push origin NewBranch

Но получилось вот что:

$ git push origin ignore-netbeans-config
error: src refspec ignore-netbeans-config does not match any.

Можно ли перейти в новую ветвь, не создавая локальную?

2 9

2 ответа:

Давайте сначала проясним несколько мелких деталей:

  1. ветвь-это "ref" в пространстве имен refs/heads. Просто ls .git/refs/heads и cat файлы там, чтобы увидеть, что я имею в виду.
  2. тег является " ref " в пространстве имен refs/tags. Просто ls .git/refs/tags, чтобы увидеть все своими глазами.
  3. HEAD просто еще один "ref", но он особенный в том аспекте, что он может быть"символическим". Просто cat .git/HEAD и посмотрите, что там написано.

Операция push работает на "ref", и "отображение" по умолчанию сохраняет пространство имен. Это означает, что когда я нажимаю на ветку, она будет отображаться как ветка на пульте дистанционного управления; когда я нажимаю на тег, он будет отображаться как тег на пульте дистанционного управления. Рассмотрим следующие сценарии:

  1. Я хочу нажать тег moo и заставить его появиться в виде ветки на удаленном сервере (да, я по существу "преобразую" тег в ветку). Вот как я это сделаю:

    git push origin moo:refs/heads/moo

  2. Git нуждается в способе различать быстрые и не-ff толчки, так что люди не переписывают чужие работы по ошибке. Допустим, я хочу раздвинуть ветки.master, next, и pu, из которых только pu не является ff. Вот как я это сделаю (обратите внимание, что вы должны предоставить явное отображение, когда вы используете +):

    git push origin master next +pu:pu

  3. А теперь давайте перейдем к вашему вопросу. Вы хотите протолкнуть свой HEAD так, чтобы он появился в пространстве имен refs/heads на удаленном устройстве в виде ветви с именем "ignore-netbeans-config". Если бы эта ветвь не существовала раньше, или если вы перезаписываете некоторые коммиты в нем (т. е. non-ff push), используйте +. В противном случае, нет. Конечный результат:

    git push origin +HEAD:refs/heads/ignore-netbeans-config

TL;DR версия: git push origin +HEAD:refs/heads/ignore-netbeans-config

Попробуйте

git push origin HEAD:refs/heads/ignore-netbeans-config