Как объединить текущую ветку в другую ветку
у меня есть две ветви, master и dev. Я всегда работаю над dev и только проверяю код в главной ветви, как только он был одобрен для использования в производстве. Когда я делаю это, я должен сделать следующее:
git checkout master
git merge dev
git checkout dev
это ужасно многословно, и поскольку я делаю это часто, я хотел бы свести его к минимуму. Есть ли какая-либо одна команда git, которую я могу использовать для слияния с моей текущей веткой dev на другой ветвь master без необходимости сначала проверять главную ветвь? Что-то может например:
git merge dev to master
было бы круто. Я просмотрел документацию git и ничего не увидел.
7 ответов:
1. добавьте удаленный псевдоним для вашего локального репозитория, например:
git remote add self file:///path/to/your/repository(или на windows
git remote add self C:\path\to\your\repository)2. нажмите на пульт дистанционного управления, например:
git push self dev:master
текущий ответ с самым высоким голосованием от @zerome является хорошим, но немного бесполезно многословным.
в базе вашего git РЕПО вы можете просто сделать это:
git push . dev:masterболее обобщенное решение, которое будет работать в любом месте в дереве будет:
git push $(git rev-parse --show-toplevel) dev:master
лучше всего было бы просто использовать псевдоним, помещенный в ваш глобальный gitconfig (
~/.gitconfig):[alias] merge-to = "!f() { git checkout && git merge && git checkout -; }; f", Так что вы можете вызывать его из любого репозитория как
git merge-to master dev
небольшая модификация из псевдонима Jefromi, которая не требует ввода в текущей ветке.
значит вы используете его как:
git merge-to dev.это переключится на
devветвь, объединить его с текущим, а затем переключится обратно.например, предполагая, что вы находитесь на
masterфилиал, он объединит мастера в dev, и вы все равно будете на мастере.это определенно идет в мои dotfiles :)
[alias] merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"
Это старый, но...
объединение решений от @kevin-lyda и @dmytrii-nagirniak выше. этот псевдоним объединяет текущую ветвь в указанную ветвь. Он использует метод remotes и использует команды git для получения контекста.
[alias] merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:; } && gitmergeto"для использования как:
git merge-to other-branch-name
чтобы объединить текущую ветвь в другую ветвь, не проверяя другую ветвь:
перемотка вперед сливаться
это очень легко. По определению, быстрое слияние просто означает, что указатель ветви перемещается вперед в дереве фиксации. Так что все, что вам нужно сделать, это просто моделирование что:
git branch -f master devпредостережения: это предполагает, что
masterуказывает на фиксацию, которая также находится вdevфилиала или некоторые другая ветка. Если это не так, вы рискуете потерять работу! в отличие отgit mergeкоторый будет создавать слияние фиксации (или жаловаться), когда быстрая перемотка вперед невозможна, этот метод молча сил указатель ветви для указания на другую фиксацию.это также предполагает, что вы единственный, кто работает над РЕПО, и/или вы знаете, что делаете.
Совет: если ты
git fetchи у вас есть новые коммиты вorigin/master, вы можете двигайmasterфилиал без проверки с помощью:git branch -f master origin/masterслияние через фиксацию
это не всегда возможно. Чтобы создать фиксацию слияния, необходимо выполнить операцию слияния. И чтобы выполнить операцию слияния, вы должны иметь фиксации в другой ветви, которые не находятся в текущей ветви.
если у вас есть коммиты в
masterветви, которые не indevфилиал, вы можете:отказ от ответственности: это просто доказательство концепции, просто чтобы показать, что это иногда можно сделать слияние с другой веткой без проверки. Если вы хотите использовать его каждый день, вы, вероятно, хотите сделать псевдоним для него с помощью перенаправления оболочки или сделать сценарий оболочки для него. Опять же, вы также можете сделать сценарий оболочки для более короткого процесса, показанного в вопрос.
git checkout -b temp git merge --no-ff -e master git branch -f master temp git checkout dev git branch -D tempобъяснение:
- Проверьте временную ветвь, которая указывает на ту же фиксацию, что и текущая ветвь.
слияние
masterво временную ветку и запустите редактор сообщений фиксации. Если вы хотите, чтобы слияние зафиксировалось в выглядеть вы слилиdevфилиала вmaster, отредактируйте его из этого:Merge branch 'master' into tempto это:
Merge branch 'dev'Совет: можно использовать
-m "Merge branch 'dev'"вместо-eбудет быстрее.- обновить
masterуказатель ветви для указания на фиксацию слияния.- Проверьте
devфилиала.- принудительно удалить временную ветку.
это все еще касается вашего рабочего дерева,но минимально. Он не откатывает дерево полностью до состояния оригинала
masterпросто принести в развитие снова меняется. некоторые могут не заботиться, но для других это может быть важно.
много раз вы приходите из ветви, в которую вы хотели бы объединить текущую ветвь. В этом случае вы могли бы сделать:
git co - && git merge @{-1}например:
git checkout somebranch // (while on master) // add some commits git co - && git merge @{-1} // will merge somebranch into master
Comments