Как "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), но без изменения рабочего каталога на более раннюю версию во время процесса.

608   7  

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

    Ничего не найдено.