Git: Ярлык для рабочего процесса слияния, который включает в себя интерактивное перебазирование - PullRequest
0 голосов
/ 27 июня 2018

Когда я хочу внести изменения из ветви функций в мою основную ветку, я часто делаю следующее:

$ git checkout feature-branch
$ git rebase -i master # Clean up the history
$ git checkout master
$ git reset --hard feature-branch

Есть ли ярлык для этой последовательности команд?

РЕДАКТИРОВАТЬ: Тим Biegeleisen указывает, что вместо запуска git reset --hard feature-branch я мог бы просто git merge feature-branch. Хотелось бы, чтобы у меня был ярлык типа git rebase-merge feature-branch, который приводит к той же главной ветке, что и моя последовательность команд.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Просто напишите себе небольшой сценарий или псевдоним, который выполняет перебазирование и, если (и только если!) Это удалось, выполняет операцию ускоренной перемотки на master (учитывая, что это именно тот результат, который вам нужен).

Помните, что любая перебазировка может пойти не так, как из-за того, что пользователь был прерван, так и из-за ошибки слияния во время одного из шагов выбора вишни. К счастью, git rebase сам по себе является хорошим инструментом Unix / Linux / POSIX: при успешном завершении он равен нулю, а при ошибке - ненулевым, так что вы можете определить, успешно он или нет. Другие команды Git похожи. Следовательно, это достижимо, если использовать небольшую функцию оболочки bash / sh:

rebase-merge() {
    case $# in
    1) ;; # good
    *) echo "usage: rebase-merge <branch>" 1>&2; exit 1;;
    esac
    git checkout "$1" &&
        git rebase -i master &&
        git checkout master &&
        git merge --ff-only "$1"
}

Можно заключить это в однострочное выражение, которое входит в ваш глобальный .gitconfig как псевдоним Git. Я оставляю это как упражнение для читателя.

Существуют и другие, более причудливые способы сделать это, но это буквально то, что вы делаете (но упрощено для использования git mege --ff-only, чтобы убедиться, что Git выполняет только быстрое слияние, или дает сбой, если это невозможно) Просто превратился в команду. Я добавил проверку, чтобы убедиться, что «$ #» (количество аргументов) равно 1, используя предпочитаемую мной конструкцию, поскольку она позволяет вам предоставить два аргумента, если вы решите, что вам нужна целевая ветвь (в настоящее время жестко задана как * 1012). *, дважды) необязательно: просто измените настройку с "case ..." на:

case $# in
1) target=master;;
2) target="$2";;
*) echo "usage ..." ...
esac

и затем используйте "$target" вместо литерала master.

0 голосов
/ 27 июня 2018

Я не знаю, что происходит внутри интерактивной перебазировки, но я упомяну, что это более типичный рабочий процесс перебазировки:

git checkout feature-branch
git rebase master
git checkout master
git merge feature-branch

Основная идея заключается в том, что мы переписываем ветвь функции, вводя последние коммиты от мастера, а затем повторно применяем уникальные коммиты из ветви функции. Затем мы можем просто переслать основную ветку с этими новыми коммитами из функциональной ветви.

Обратите внимание, что это не короче, чем у вас сейчас, но я считаю, что это более типичный рабочий процесс, используемый с перебазированием. В зависимости от того, что вы делаете в интерактивном ребазе, предложенный выше рабочий процесс может больше не работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...