Как "git тянуть" в ветку, которая не является текущей?

Когда вы запускаете git pull в ветки master, она обычно тянет от origin/master. Я находится в другом ветки с именем newbranch, но мне нужно запустить команду, которая делает git pull из origin/master в master, но я не могу запустить git checkout, чтобы изменить выбранную ветвь, пока после завершения pull, Есть ли способ сделать это?

Чтобы дать некоторый фон, хранилище хранит веб-сайт. Я внес некоторые изменения в newbranch и развернул их, переключив веб-сайт на newbranch. Теперь эти изменения были объединены вверх по течению в ветвь master, я также пытаюсь переключить веб-сайт обратно в ветвь master. На этом этапе newbranch и origin/master идентичны, но master отстает от origin/master и нуждается в обновлении. Проблема в том, что если я делаю это традиционным способом:

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

Мне нужно добиться того же, что и выше (git checkout master && git pull), но не меняя рабочий каталог на более раннюю версию процесса.

Ответ 1

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

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip 'origin/master' is my 'master'
cd ../wip                     # .
git pull origin origin/master # merge origin origin/master
git push origin master        # job done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip done

git checkout master           # payload

Проблема со всеми другими ответами здесь в том, что они на самом деле не делают тягу. Если вам нужно слияние или перебазирование, для которого вы настроили pull, вам понадобится другое рабочее дерево и описанная выше процедура. Иначе просто git fetch; git checkout -B master origin/master подойдет.

Ответ 2

Простое: обновление из удаленной ветки до не извлеченной в настоящий момент основной ветки:

git fetch origin master:master

где ваш удаленный источник, и вы в настоящее время проверены в какой-либо ветке, например, девиация

Если вы хотите обновить текущую ветку в дополнение к указанной ветке за один раз:

git pull origin master:master

Ответ 4

Как оказалось, ответ обманчиво прост:

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

Это позволяет обновить ветвь master, не переключаясь на нее, пока она не будет обновлена.

Ответ 5

Вы обеспокоены тем, что не может быть исправлено, поскольку операции Git не являются атомарными. У вас всегда будет дыра, где ваш рабочий каталог на полпути между ветвями, даже если вы обновляете мастер, не переключаясь сначала на него. Вот почему Git не является инструментом развертывания.

Поскольку вы на самом деле не совершаете код в своей производственной среде (надеюсь), вам действительно не нужно проверять филиал. Вы можете просто сделать git fetch, чтобы обновить ваши удаленные ссылки, а затем git checkout origin/master, чтобы переместить рабочий каталог непосредственно в фиксацию, на данный момент указываемую на origin/master. Это приведет вас в состояние отдельной головы, но опять же, поскольку вы не совершаете код, это не имеет значения.

Это самая маленькая дыра, которую вы получите, но, как я уже сказал, дыра все еще существует; checkout не является атомарным.

Ответ 6

Вы можете использовать update-ref для этого:

git fetch
git update-ref refs/heads/master origin/master
git checkout master

Обратите внимание, что это отбросит любые локальные коммиты в основной ветке. В вашем случае их не будет, так что это нормально. Для других людей, пытающихся сделать это, когда есть локальные коммиты, я не думаю, что это возможно, так как слияние может выполняться только в текущей ветке.

Ответ 7

Malvineous solution работает для меня

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

Просто введите ошибку


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

Итак, я запускаю с опцией -D

спасибо

Ответ 8

git fetch origin master:master

  • "Тянет" (фактически извлекает) master.
  • Если у вас есть изменения в master, которые еще не были переданы, origin/master объединяется с вашим мастером.
  • Если есть конфликты слияния, вам придется сначала их разрешить.

Ответ 9

Не делает ли это это (предполагая, что вы находитесь в своей ветке функций):

git pull origin master

Это приведет к тому, что последний мастер перейдет в вашу текущую ветвь функции.