В репо у меня есть несколько веток, среди которых «master» и «development», которые настроены для отслеживания удаленных веток «origin / master» и «origin / development».
Можно ли указать, что я хочу, чтобы мастер и разработка были объединены (переадресованы) одновременно?
Когда я делаю git pull
сейчас, я получаю что-то вроде этого:
remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
5386563..902fb45 develop -> origin/develop
d637d67..ba81fb2 master -> origin/master
Updating 5386563..902fb45
Fast-forward
все удаленные ветви извлекаются, но только ветвь, в которой я сейчас нахожусь, объединяется с соответствующей удаленной веткой.
Так что я должен сделать git checkout master
...
Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.
... а затем git pull
снова, а затем переключиться обратно на разработку, чтобы получить желаемый результат.
Я знаю, что могу сделать псевдонимы / сценарии, которые делают эти шаги. Но я хочу избежать этого, если это возможно, так как это подвержено ошибкам и не очень эффективно .
Изменить: хорошо, позвольте мне перефразировать это. Моя цель состояла не в том, чтобы препятствовать или не одобрять настройку скриптов / псевдонимов в git. Я бы предпочел встроенное решение, если оно существует :)
git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/master
но это привело к тому, что удаленный мастер был объединен с разработчиком ..pull
строку наfetch
следующую, а затемmerge
на каждую ветку.Ответы:
Вы можете установить псевдоним, который используется
git fetch
с refspecs для быстрой перемотки слияния ваших ветвей с помощью одной команды. Установите это как псевдоним в вашем пользовательском.gitconfig
файле:Использование:
git sync
.Вот почему это работает:
git checkout --quiet HEAD
непосредственно проверяет ваш текущий коммит, переводя вас в отдельное состояние головы . Таким образом, если вы используетеmaster
илиdevelop
, вы отсоединяете свою рабочую копию от этих указателей веток, позволяя им перемещаться (Git не позволит вам перемещать ссылки на ветки, пока ваша рабочая копия их извлекает).git fetch origin master:master develop:develop
виды использования refspecs сfetch
для быстрой перемотки впередmaster
иdevelop
филиалов в местных репо. Синтаксис в основном говорит Git: «Здесь есть refspec формы<source>:<destination>
, возьмите<destination>
и перенесите его в ту же точку, что и<source>
». Таким образом, источники в псевдониме являются ответвлениямиorigin
, в то время как адресаты являются версиями этих веток для локального репо.Наконец,
git checkout --quiet -
проверяет ветку, в которой вы были в последний раз, независимо от того, был ли сбой в предыдущих командах. Так что, если вы были включены,master
когда вы бежалиgit sync
, и все прошло успешно, вы выйдете из отдельного состояния головы и проверите новое обновлениеmaster
.Смотрите также мой ответ на git: обновить локальную ветку без проверки? ,
источник
origin/develop
когда вы используете псевдоним? Это не имело бы смысла, если бы это было ваше местноеdevelop
отделение. Кроме того, указатель дляmaster
может быть перемещен, если онdevelop
извлечен, смысл в том, что если онmaster
извлечен, то вы не можете выполнить ускоренную перемотку вперед,master
поскольку это повлияет на вашу рабочую копию, поэтому вы отсоединяете рабочую копию. из него сначала с помощьюgit checkout head
. Я видел другой ответ, который описывал его как «стоящий на скале», вы должны сойти со скалы, прежде чем сможете его сдвинуть.fatal: bad config line xx in file xxx
. который вызван точкой с запятой. Вы должны заключить всю команду в двойные кавычки, чтобы избежать этой проблемы.Установите Git-Up . Это дает вам команду,
git-up
которая будет тянуть все локальные ветви в вашем хранилище.источник
Кажется, что нет встроенной опции для git, чтобы тянуть в несколько веток. По крайней мере, не в версии 1.8.0. хотя ответ @ Cupcake близок к этому.
Однако @ комментарий jjlin в заставил меня понять , что , по крайней мере мне не нужно дважды тянуть.
Так что чуть более эффективная последовательность будет:
Неизбежно я закончил тем, что создал псевдоним, но решил не использовать его и сосредоточился на быстрой перемотке другой ветви.
Конечно, без тестирования этот псевдоним предполагает, что я предоставляю правильное имя ветви ff'able в качестве 1-го аргумента, и в противном случае он имеет неопределенное поведение. Это также не оптимально для вариантов использования с более чем двумя ветвями, но это даст мне то, что мне сейчас нужно.
источник