Git: Как перейти с «без ветки» на новую удаленную ветку? - PullRequest
9 голосов
/ 10 ноября 2011

Я сделал:

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 ]

11 голосов
/ 10 ноября 2011

1001 * попробовать *

git push origin HEAD:refs/heads/ignore-netbeans-config
10 голосов
/ 11 ноября 2011

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

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

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

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

...