Как объединить текущую ветку в другую? - PullRequest
176 голосов
/ 09 сентября 2010

У меня есть две ветви, master и dev. Я всегда работаю над dev и проверяю код в основной ветке только после того, как он будет одобрен для производственного использования. Когда я делаю это, я должен сделать следующее:

git checkout master
git merge dev
git checkout dev

Это ужасно многословно, и, поскольку я делаю это часто, я бы хотел минимизировать это. Есть ли какая-нибудь команда git, которую я могу использовать для слияния из моей текущей ветки dev в другую master ветки без предварительной проверки master ветки? Что-то вроде:

git merge dev to master

было бы здорово. Я просмотрел документацию по git и ничего не увидел.

Ответы [ 7 ]

90 голосов
/ 01 декабря 2011

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
55 голосов
/ 26 декабря 2013

Текущий ответ @zerome с наибольшим количеством голосов является хорошим, но немного бесполезным.

В основе вашего репозитория git вы можете просто сделать это:1005 * Более обобщенное решение, которое будет работать в любом месте дерева:

git push $(git rev-parse --show-toplevel) dev:master
43 голосов
/ 09 сентября 2010

Лучше всего было бы использовать псевдоним, размещенный в вашем глобальном gitconfig (~/.gitconfig):

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

так что вы можете вызвать его из любого хранилища как

git merge-to master dev
38 голосов
/ 18 октября 2011

Небольшая модификация псевдонима Jefromi, которая не требует от вас ввода текущей ветви.

Таким образом, вы используете это как: git merge-to dev.

Это переключится наdev ответвление, объедините его с CURRENT, а затем переключитесь обратно.

Например, если вы находитесь на master ответвлении, оно объединит мастер в dev, и вы все равно останетесь на нем.1010 *

Это определенно относится к моим точечным файлам:)

[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"
6 голосов
/ 03 марта 2016

Это старый, но ...

Объединение решений из @ 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
3 голосов
/ 25 ноября 2017

Чтобы объединить текущую ветку с другой веткой без проверки другой ветки:

Быстрое слияние

Это действительно легко. По определению, ускоренное слияние просто означает, что указатель ветви перемещается вперед в дереве фиксации. Так что все, что вам нужно сделать, это просто имитировать , что:

git branch -f master dev

Предостережения: Предполагается, что master указывает на коммит, который также находится в dev ветви или некоторой другой ветви. Если этого не произойдет, вы рискуете потерять работу! В отличие от git merge, который создаст коммит слияния (или будет жаловаться), когда ускоренная перемотка вперед невозможна, этот метод тихо заставляет указатель ветки, указывающий на другой коммит.

Это также предполагает, что вы являетесь единственным, кто работает в репо, и / или вы знаете, что делаете.

Подсказка: Если вы сделали git fetch и у вас есть новые коммиты в origin/master, вы можете переместить ветку master без проверки с помощью:

git branch -f master origin/master

Слияние с помощью коммита слияния

Это не всегда возможно. Чтобы создать коммит слияния, вы должны выполнить операцию слияния. И чтобы выполнить операцию слияния, вы должны иметь коммиты в другой ветке, которых нет в текущей ветке.

Если у вас есть коммиты в ветке master, которые не в dev ветке, вы можете:

Отказ от ответственности: Это просто подтверждение концепции, просто чтобы показать, что иногда можно выполнить слияние с другой веткой без проверки. Если вы хотите использовать его каждый день, вы, вероятно, захотите создать для него псевдоним с помощью перенаправления оболочки или создать для него сценарий оболочки. Опять же, вы также можете создать сценарий оболочки для более короткого процесса, показанного в вопросе.

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

Пояснение:

  1. Извлечение временной ветки, которая указывает на тот же коммит, что и текущая ветка.
  2. Слияние master с временной веткой и запуск редактора сообщений коммита. Если вы хотите, чтобы коммит слияния выглядел как , вы слили ветку dev в master, отредактируйте его из этого:

    Merge branch 'master' into temp
    

    на это:

    Merge branch 'dev'
    

    Совет: Вы можете использовать -m "Merge branch 'dev'" вместо -e, чтобы быть быстрее.

  3. Обновите указатель ветки master, чтобы он указывал на коммит слияния.
  4. Проверьте ветку dev.
  5. Принудительно удалить временную ветку.

Это все еще касается вашего рабочего дерева, но минимально так. Он не откатывает дерево до состояния первоначального master, чтобы просто внести изменения в разработку. Некоторым может быть все равно, но для других это может быть важно.

1 голос
/ 23 февраля 2017

Часто вы приходите из ветви, в которую хотите объединить текущую ветку.В этом случае вы можете сделать:

git co - && git merge @{-1}

, например:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...