Команда Git Revert отказывается вернуть слияние - PullRequest
0 голосов
/ 12 июня 2018

У меня есть простой случай, но он меня озадачивает, и я не нашел в других ответах здесь ничего, что действительно работает.

У меня есть пара слияний до master что я хочу откатиться.Конечный результат, который я хочу, - это master, который будет возвращен таким, каким он был до этих коммитов, так что я могу затем перейти из известной хорошей ветки, чтобы убедиться, что master показывает только код, выпущенный prod.Вот журнал:

my.username@mysystem MINGW64 /c/Git/REPOSITORY (master)
$ git log --oneline
e6a1eed (HEAD -> master, origin/master, origin/HEAD) Merge pull request #26         
from PROGRAM/revert-24-int_project_2.1.0
b9b82f0 (tag: PROGRAM_project-2.0.0, origin/int_project_2.0.0,     
int_project_2.0.0) Revert "Merge pull request #24 from     
PROGRAM/int_project_2.1.0"
c4a6573 Revert "PROGRAM_project_2.0.0"
c3aa6d1 (tag: PROGRAM_project_2.0.0) Merge pull request #24 from     
PROGRAM/int_project_2.1.0
**b7e583a** (tag: project_tag_2.1.0_01) Merge pull request #23 from     
PROGRAM/dev_project_2.1.0
**54ecb7a** June 2.1.0 release.
**b67f981** Merge pull request #22 from PROGRAM/int_project_2.0.0
f9b81bc (tag: project_tag_2.0.0_04, origin/int_project_2.0.0fix,     
int_project_2.0.0fix) Merge pull request #21 from PROGRAM/dev_project_2.0.0

Вот результаты моих попыток отменить слияния (я получил одно слияние (# 24) уже отменено, но позже выяснилось, что нужно было еще два (# 22 и # 23) Вот что произошло, когда я попытался вернуться:

my.username@mysystem MINGW64 /c/Git/REPOSITORY (master)
$ git revert -m 1 b7e583a
On branch master
Your branch is up to date with 'origin/master'

nothing to commit, working tree clean`

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

Я относительно новичок в git и github, поэтому у меня много пробелов в понимании, чтобы заполнитьи в этом случае я, вероятно, упускаю некоторые фундаментальные знания или знания, которые, как обычно предполагают, известны более опытным пользователям git.

1 Ответ

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

В git вы можете отменить нежелательные коммиты двумя способами: вы можете отменить их или удалить, удалив их из истории вашей ветки.

Удалить из истории

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

Если все в порядке, сбросить историю и сбросить до известного хорошего значения:

git reset --hard <good commit>
git push -f origin HEAD

Возврат

Возврат создает новый коммит, который противостоит плохому коммиту.Это безопасно делать на ветке, которая используется совместно с другими, но оставляет «грязную историю».

То, что вы сделали, выглядит правильно.Тот факт, что возврат, кажется, ничего не делает, наводит меня на мысль, что, возможно, некоторые из коммитов слияния, которые вы пытаетесь вернуть, были, возможно, включены в предыдущий возврат?

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

git checkout -b temp-branch <good-commit>
<copy files somewhere>
git checkout -
<copy files over workspace>
git add .
git commit

Убедитесь, что вы не копируете .git dir.Существуют способы, позволяющие избежать копирования, используя более загадочные команды git, такие как git read-tree, но вышесказанное легко понять.

Удачи!

...