Как "git pull" в ветку, которая не является текущей?
при выполнении git pull на master ветка, она обычно тянет от origin/master. Я в другой ветке под названием newbranch, но мне нужно запустить команду, которая делает git pull С origin/master на master но я не могу запустить git checkout чтобы изменить выбранную ветвь до завершения вытягивания. Есть ли способ сделать это?
чтобы дать некоторый фон, репозиторий хранит веб-сайт. Я внес некоторые изменения в 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), но без изменения рабочего каталога на более раннюю версию во время процесса.
7 ответов:
у вас есть рабочее дерево, которое вы не хотите трогать, поэтому используйте другое. Клон дешевый, он построен для этого.
git fetch origin master # nice linear tree git clone . ../wip -b master # wip's `origin/master` is my `master` cd ../wip # . git pull origin origin/master # merge origin's origin/master git push origin master # job's done, turn it in. cd ../main rm -rf ../wip # wip was pushed here, wip's done git checkout master # payload
простой: обновление из удаленной ветви в ветвь, которая в настоящее время не извлечена мастер:
git fetch origin master:masterздесь происхождения ваш пульт дистанционного управления, и вы в настоящее время проверены в какой-то ветке, например dev.
Если вы хотите обновить текущую ветку в дополнение к указанной ветке на одном дыхании:
git pull origin master:master
это ответ здесь: слияние, обновление и вытягивание ветвей 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
Как оказалось, ответ обманчиво прост:
$ 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ветка без переключения на нее до после он был обновлен.
вы беспокоитесь о чем-то, что не может быть исправлено, так как операции Git не являются атомарными. Вы всегда будете иметь отверстие, где ваш рабочий каталог наполовину между ветвями, даже если вы обновляете master без первого переключения на него. Вот почему Git не является инструментом развертывания.
поскольку вы на самом деле не совершаете код в своей производственной среде (я надеюсь), вы на самом деле не нужно чтобы проверить ветку. Вы можете просто сделать
git fetchобновить удаленные ссылки, а потомgit checkout origin/masterдля перемещения рабочего каталога напрямую к фиксации, на которую указываетorigin/master. Это приведет вас в отстраненное состояние головы, но опять же, поскольку вы не совершаете код, это не имеет значения.Это самое маленькое отверстие, которое вы получите, но, как я уже сказал, отверстие все еще существует;
checkout- это не атомные.
вы можете использовать update-ref для этого:
git fetch git update-ref refs/heads/master origin/master git checkout masterобратите внимание, что это отбросит любые локальные коммиты в главной ветви. В вашем случае их не будет, так что все в порядке. Для других людей, пытающихся сделать это там, где есть локальные коммиты, я не думаю, что это возможно, так как слияние может выполняться только в текущей ветке.
решение Malvineous работает для меня
$ 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
спасибо
Comments