Как слить текущую ветку в другую ветку

У меня есть две ветки, мастер и 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"