Как я могу создать ветку и новую удаленную ветку отслеживания сразу? - PullRequest
0 голосов
/ 23 апреля 2020

Обычно я создаю новую ветку через git checkout -b ..., и в первый раз, когда я добавляю sh, мне предлагают использовать аргумент --set-upstream для создания новой удаленной ветви отслеживания. Могу ли я сделать это одной командой при создании ветки? Я попробовал следующее (согласно инструкциям здесь ):

   % git checkout -b mybranch20200423 --track origin/mybranch20200423                          
fatal: 'origin/mybranch20200423' is not a commit and a branch 'mybranch20200423' cannot be created from it

   % git checkout -b mybranch20200423 origin/mybranch20200423        
fatal: 'origin/mybranch20200423' is not a commit and a branch 'mybranch20200423' cannot be created from it

Я что-то не так делаю? Почему git считает, что origin / mybranch20200423 должен быть коммитом?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

У меня нет всех деталей команды git branch, но похоже, что параметры --track и --set-upstream ожидают только существующих имен ветвей:

$ git branch --set-upstream origin/foo/bar
error: the requested upstream branch 'origin/foo/bar' 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.

Предоставление имени удаленной ветви можно выполнить при нажатии с помощью git push -u <branchname>.


Чтобы обработать случай «pu sh a new branch», я использую следующую команду:

git push origin -u $(git rev-parse --abbrev-ref HEAD)
  • git rev-parse --abbrev-ref HEAD даст имя текущей активной ветви,
  • $(...) вставит его в качестве аргумента для внешней команды,
  • git push -u <branchname> выведет sh текущий коммит в удаленную ветку <branchname> и добавление origin/branchname в качестве отслеживаемой восходящей ветви.

Я добавил для него псевдоним:

git config --global config.pushnew '! git push origin -u $(git rev-parse --abbrev-ref HEAD)'

так что при наборе:

git pushnew

в терминале из новой ветки моя новая ветвь выдвигается без необходимости повторения имени ветви.

1 голос
/ 24 апреля 2020

См. LeGE C ответ .

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

git fetch origin            # update origin/master if/as needed
git push origin origin/master:newbranch

Первый шаг, который вам нужен только в том случае, если ваши ветки удаленного слежения устарели (но их можно использовать в любое время), попросите Git вызвать их Git, получить от них новые коммиты, сохранить их в своем клоне, и обновите все ваши origin/* имена. (Мне также нравится использовать --prune здесь, но я делаю это с git config fetch.prune true, чтобы Git просто делал это автоматически.)

На шаге git push ваш Git вызывает Git на origin и просит их создать или обновить имя ветви newbranch на основе вашего origin/master, который - если вы обновились достаточно недавно - синхронизируется c с их master. То есть вы просите их создать их ветвь newbranch на основе (вашей копии) их master, поскольку newbranch еще не существует в их хранилище.

Предполагая, что они подчиняются этому вежливому запросу «создать или обновить», newbranch теперь существует на origin. Теперь, когда newbranch существует на origin, ваш собственный Git создает origin/newbranch.

Теперь вы можете просто запустить:

git checkout newbranch

, который обнаружит, что gosh, у вас нет ветки с именем newbranch, но у вас есть origin/newbranch, поэтому она должна создать newbranch из origin/newbranch. Если ваш Git предшествует Git 2.23, вы можете использовать git checkout --track origin/newbranch, чтобы избежать двусмысленности, а если это 2.23 или более поздняя версия, вы можете использовать git switch newbranch, но в целом это в основном работает.

Я не делаю ничего из вышеперечисленного: я просто создаю ветку самостоятельно, в зависимости от ситуации. Затем на первом git push я использую сокращение git push -u origin HEAD (после двойной проверки с git status, что я нахожусь на правильной ветке, и все готово).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...