Git слияние без включения коммитов из одной ветки в другую

Во время разработки мне часто нужно совершать и нажимать "промежуточные" коммиты, т.е. фиксировать код, который не компилируется или находится в середине изменения чего-либо, и т.д. Я не хочу делать такие коммиты, но это требуется для упрощения продолжая свою работу от офиса до дома, иногда для других разработчиков, чтобы получить их базу, на которой они могут начать свою работу.

Я думал, что нашел решение этой проблемы:

  • Я создаю отдельную ветку "dev" и делаю все промежуточные коммиты.

  • Как только код находится в хорошем состоянии, сделайте слияние для овладения. Таким образом, мастер не будет содержать "промежуточных" коммитов, но только "нормальный" совершает.

  • Удалите ветвь "dev" со всеми промежуточными коммитами.

Но это не работает. Когда я делаю слияние, не только объединение слияния включается в master, но и все "промежуточные" совершают также из ветки "dev". Поэтому удаление ветки "dev" ничего не дает, ее "промежуточные" фиксации остаются там.

Итак, вопросы: возможно ли объединить то, как хозяин будет включать только свои собственные коммиты + слияние и не включать в себя коммиты со второй ветки? Если это невозможно, не могли бы вы посоветовать мне, как достичь моей цели - иметь возможность временно сохранять промежуточные результаты, а также легко удалять их позже?

Ответ 1

Когда вы объединяете ветвь "dev" в master, попробуйте

git checkout master
git merge --squash dev
git commit -m "Add new feature."

Параметр --squash будет выдавать все ваши промежуточные изменения в одно большое изменение.

Вы также можете использовать git rebase --interactive, если вам требуется более ограниченный контроль (например, переупорядочение совершает и делает несколько небольших squash). Этот ответ объясняет различия между git merge --squash и git rebase --interactive.

Ответ 2

Что вы хотите, это слияние "сквоша":

git checkout master
git merge --squash dev
git commit -m 'current stable work from dev branch'

Это означает, что вы создаете одно и то же состояние в рабочем дереве как регулярное слияние, но не создаете фиксацию слияния со всеми промежуточными коммитами в качестве предков. Промежуточные фиксации не будут частью истории ветки master. Документация для этой опции из справочной страницы git merge гласит:

Создайте рабочее дерево и состояние индекса, как если бы произошло реальное слияние (за исключением информации о слиянии), но на самом деле не делают фиксацию или переместите HEAD, или запишите $GIT_DIR/MERGE_HEAD, чтобы вызвать следующий gitcommit для создания слияния. Это позволяет создать single commit поверх текущей ветки, эффект которой такой же, как и слияние другой ветки (или больше в случае осьминогов).

Ответ 3

добавьте еще одну ветвь с именем RC (кандидат на выпуск). В этой ветке будут объединены только завершенные ветки функций. Вы можете держать Dev, чтобы опробовать незавершенные ветки вместе. Вы интегрируетесь только в мастер-релизы, которые не содержат ничего, кроме объединенных готовых функций.

Ответ 4

Вы можете использовать .patch из GitHub, например. https://github.com/rails/rails/pull/123.patch

git apply 123.patch
# review changes, edit files etc.
git add .
git commit -m "committing #123"

Ответ 5

Вы не можете удалить фиксации во время слияния. Вы можете раздавать промежуточные коммиты, но это плохая идея, которая, вероятно, не будет работать для вас, когда вы их опубликуете. Вы также можете выкачать их в ведущую ветвь без слияния (git merge --squash, а затем git commit), а затем объединить главную ветвь в ветвь dev.