Вернуть слияние и отменить историю из git

Наш обычный процесс в команде — объединить наши ветки функций в ветку QA, протестировать эту ветку, а затем переместить нашу ветку функций в Master. Кто-то в команде следовал обычному процессу, но вместо того, чтобы объединить свою ветку с Master после того, как она прошла контроль качества, он объединил все QA с Master. Это испортило нашу основную ветку, так как элементы, которые не были проверены другими разработчиками, попали в ветку.

Слияние было сделано из интерфейса gitLab, а не из терминала. Что мы хотим сделать, так это полностью отменить это слияние и все 102 коммита. Мы не хотим никакой истории об этом после возвращения. Как лучше всего это сделать на нашем пульте? Я видел, как люди упоминали об использовании -m с git revert, но, если я правильно понимаю, это портит историю. Нет ли настоящей «отмены» для слияний? Мы здесь немного в отчаянии. Спасибо!


person Mr. BigglesWorth    schedule 18.11.2014    source источник


Ответы (3)


Вы можете сбросить master, например.

        master
          |
          V
o--o---o--o
          /
         /       
o---o---o
        ^
        |
       qa_branch

Если ваш репозиторий выглядит так, вы можете сделать

$ git checkout master
$ git reset --hard HEAD^

HEAD^ — это ярлык для первого родительского коммита HEAD. Вы также можете использовать HEAD^1.

После того, как вы сделали это, ваш репозиторий выглядит так

     master
       |
       V
o--o---o


o---o---o
        ^
        |
       qa_branch

Предупреждение

Теперь вы должны принудительно перезаписать файл origin/master. В этом случае вы должны убедиться, что за это время ни один другой разработчик не внес изменений поверх origin/master. В противном случае эти изменения будут потеряны.

Принудительный толчок делается таким образом

$ git push -f origin master
person René Link    schedule 18.11.2014

Я считаю, что лучшее решение — создать новую ветку из последней хорошей точки вашей ветки master (например, tmp-master), а затем полностью удалить главную ветку. Как только он исчезнет, ​​вы можете создать новый master из головы вашей tmp-master ветки. Конечно, затем вам нужно будет заставить новую ветку master подняться до источника и заставить всех остальных с копией master снова сбросить ее.

Я считаю, что команды должны быть:

git checkout master
git checkout <sha of last good commit>
git checkout -b tmp-master
git branch -d master
git checkout -b master
git push -f origin master

затем на каждой машине с веткой master:

git checkout master
git pull

Для аналогичного (но немного другого) подхода ознакомьтесь с: этот вопрос

person Andrew Miner    schedule 18.11.2014

Мы не хотим никакой истории об этом после возврата.

В этом случае это, скорее всего, WONTFIX для GitLab, поскольку они обычно против изменения истории из веб-интерфейса. Например. http://feedback.gitlab.com/forums/176466-general/suggestions/5590144-allow-git-reset-hard-from-web-interface:

Вы не должны сбрасывать ветки в удаленном репо.

Поэтому вам, вероятно, придется прибегнуть к методам Git, не относящимся к GitLab, которые можно найти в других ответах и ​​многих других вопросах Git.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 18.11.2014