Git: Как перейти из «без ветки» в новую удаленную ветку?

#git #branch #push #remote-branch

#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.
  

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

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

1. Хороший вопрос! Конечно, если вы могли бы внести какие-либо дополнительные изменения здесь, вы бы хотели продолжить и создать ветку для обеспечения безопасности.

Ответ №1:

попробуйте

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

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

1. Вы должны быть в состоянии опустить часть «ссылки / заголовки /».

2. Я думаю, если она еще не существует, вы должны быть явными.

Ответ №2:

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

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

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

  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». Если эта ветка ранее не существовала, или если вы перезаписываете в ней некоторые коммиты (т. Е. не-ff push), используйте . В противном случае не делайте этого. Конечный результат:

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

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