Как "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
Ответ 3
Здесь дается ответ:
Объединить, обновить и вывести ветки Git без использования проверок
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
Ответ 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
Это приведет к тому, что последний мастер перейдет в вашу текущую ветвь функции.