Случайное слияние ветки "release" с "master" - PullRequest
1 голос
/ 06 марта 2020

Недавно я сделал ошибку, добавив что-то, предназначенное для основной ветки, в ветку релиза и, что еще хуже, я слил ветку релиза в ветку master.

У меня есть коммиты в ветке релиза которые не объединены с основной веткой, потому что они предназначены только для выпуска.

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

Ошибка Mistake

Как и должно быть How it should be

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Вот ваша диаграмма с выделенными коммитами 'M' и 'A':

                previous correct state for Master
                v
Master:   *-----M------*
           \     \    /
Release:    *--*--*--A
                  ^  ^
               v0.2  accidental commit

Вы можете "исправить" историю локально и опубликовать sh, используя push --force.

Если это общий репозиторий, сначала уточните у своих коллег, есть ли у них какая-то работа, основанная на «неправильных» фиксациях, и сообщите им, что им придется повторно применить / повторно выполнить свою работу после ваших операций.

  • , чтобы установить Master в ожидаемое состояние:

    выполните следующие действия:

    # from your master branch :
    git checkout Master
    
    # reset it to its previous M state :
    git reset --hard M
    
    # cherry-pick commit A :
    git cherry-pick A
    
    # publish the 'fixed' Master branch using push --force :
    git push --force origin Master
    

    замените M и A в приведенных выше командах их соответствующими ша.

  • , чтобы отменить случайный коммит на Release:

    # replace 'v0.2' with the actual name of the tag, or the sha of `v0.2` the commit,
    # replace 'Release' with the actual name of the release branch
    git push origin --force v0.2:Release
    
1 голос
/ 06 марта 2020

Git имеет две разные команды для возврата коммита, которые работают по-разному.

Сброс
git reset <commit> сбросит текущую ветвь обратно к указанному коммиту , Есть также несколько псевдонимов для отмены последнего коммита et c. По умолчанию он сохранит изменения из коммита в вашей рабочей копии, но в виде изменений без изменений. Если вы хотите полностью избавиться, используйте опцию --hard.

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

Revert
git revert <commit> делает то же самое, сбрасывая текущую ветвь к предыдущему коммиту, но вместо удаления нежелательных коммитов добавляет новый коммит, который отменяет изменения , Это означает, что ваша история потенциально немного сложнее, но она намного безопаснее, поскольку вы не переписываете историю.

Выбор вишни
Есть еще одна команда, которая может оказаться полезной. Если вы делаете коммит в неправильную ветку или даже просто хотите скопировать коммит без полного слияния, вы можете использовать git cherry-pick <commit>.

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

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