Как слить текущую ветку в другую ветку
У меня есть две ветки, мастер и dev. Я всегда работаю над dev и только проверяю код в мастер-ветку, как только он будет одобрен для использования в производстве. Когда я это сделаю, я должен сделать следующее:
git checkout master
git merge dev
git checkout dev
Это ужасно многословие, и, поскольку я делаю это часто, я хотел бы свести его к минимуму. Есть ли какая-нибудь одна команда git, которую я могу использовать для слияния с моей текущей веткой dev с другим мастером ветки без необходимости сначала проверить главную ветвь? Что-то может быть похоже:
git merge dev to master
будет потрясающе. Я просмотрел документацию git и ничего не видел.
Ответы
Ответ 1
1. Добавьте удаленный псевдоним для своего локального репозитория, например:
git remote add self file:///path/to/your/repository
(или на окнах git remote add self C:\path\to\your\repository
)
2. Нажмите на себя, например:
git push self dev:master
Ответ 2
Нынешний голос с наибольшим голосом от @zerome является хорошим, но немного ненужным многословным.
В базе вашего репозитория git вы можете просто сделать это: git push . dev:master
Более обобщенное решение, которое будет работать в любом месте дерева, будет:
git push $(git rev-parse --show-toplevel) dev:master
Ответ 3
Лучше всего использовать псевдоним, размещенный в глобальном gitconfig (~/.gitconfig
):
[alias]
merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"
чтобы вы могли вызывать его из любого репозитория как
git merge-to master dev
Ответ 4
Небольшая модификация псевдонимов Jefromi, которая не требует ввода текущей ветки.
Итак, вы используете его как: git merge-to dev
.
Это переключится на ветвь dev
, объединит ее с CURRENT и затем вернется.
Например, если вы находитесь на ветке master
, он объединит мастер в dev, и вы все равно будете на главном сервере.
Это определенно относится к моим dotfiles:)
[alias]
merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"
Ответ 5
Это старый, но...
Объединение решений из @kevin-lyda и @dmytrii-nagirniak выше. этот псевдоним объединяет текущую ветвь в указанную ветвь. Он использует метод remotes и использует команды git для получения контекста.
[alias]
merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"
Используется как:
git merge-to other-branch-name
Ответ 6
Чтобы слить текущую ветку в другую ветку, не проверяя другую ветку:
Ускоренное слияние
Это очень просто. По определению быстрое слияние просто означает, что указатель ветки перемещается вперед в дереве фиксации. Так что все, что вам нужно сделать, это просто имитировать:
git branch -f master dev
Предостережения: Предполагается, что master
указывает на фиксацию, которая также находится в ветке dev
или какой-либо другой ветке. Если это не так, вы рискуете потерять работу! В отличие от git merge
, которая создаст слияние (или жалобу), когда ускоренная перемотка вперед невозможна, этот метод бесшумно заставляет указатель ветки, указывающий на другую фиксацию.
Это также предполагает, что вы работаете только на репо и/или знаете, что делаете.
Совет: Если вы сделали git fetch
, и у вас есть новые коммиты в origin/master
, вы можете переместить ветвь master
без проверки:
git branch -f master origin/master
Объединить с помощью объединения
Это не всегда возможно. Чтобы создать слияние, вы должны выполнить операцию слияния. И чтобы выполнить операцию слияния, вы должны зафиксировать в другой ветке, которая не находится в текущей ветке.
Если вы вступили в ветвь master
, которая находится в не в ветке dev
, вы можете:
Отказ от ответственности: Это просто доказательство концепции, просто чтобы показать, что иногда можно выполнить слияние с другой веткой без проверки. Если вы хотите использовать его каждый день, вы, вероятно, захотите сделать псевдоним для него с помощью перенаправления оболочки или сделать для него оболочку script. Затем вы также можете сделать оболочку script для более короткого процесса, показанного в вопросе.
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 temp
:
Merge branch 'dev'
Совет. Вы можете использовать -m "Merge branch 'dev'"
вместо -e
для ускорения.
- Обновите указатель ветки
master
, чтобы указать на фиксацию слияния.
- Проверьте ветвь
dev
.
- Принудительно удалите временную ветку.
Это все еще касается вашего рабочего дерева, но минимально. Он не откатывает дерево вплоть до состояния исходного master
, чтобы снова внести изменения в разработку. Некоторым может быть все равно, но для других это может быть важно.
Ответ 7
Много раз вы приходите из ветки, в которую вы хотите объединить текущую ветку. В этом случае вы можете сделать:
git co - && git merge @{-1}
например:
git checkout somebranch // (while on master)
// add some commits
git co - && git merge @{-1} // will merge somebranch into master
Ответ 8
Мое решение аналогично другим ответам со следующими отличиями:
- функция разбита на несколько строк для удобства чтения
- функция вызывает
set -ex
, поэтому каждая команда печатается, и если команда не выполняется, функция сразу же завершается
- псевдоним передает свои аргументы, кроме первого (целевая ветвь),
git merge
- функция включает в себя пустую команду
: git merge
, которая обеспечивает завершение табуляции с некоторыми настройками оболочки (например, gitfast
из oh-my-zsh)
[alias]
merge-to = "!f() { : git merge ; \
set -ex ; \
local this=$(git rev-parse --abbrev-ref HEAD) ; \
local target=$1 ; \
shift ; \
git checkout $target ; \
git merge $this \"[email protected]\" ; \
git checkout $this ; \
} ; f"