2015-06-03 3 views
0

Я случайно слил неправильную ветвь в мастер и нажал на исход.Git reset and revert

Проблема заключается в том, что я переустановил masterbranch до последнего, прежде чем commit-hash с git reset --hard xxx, а также источник с git push origin master --force, но теперь слияние-commit всегда есть.

Лучшее решение заключается в использовании git revert -m 1 <merge-commit>, но у меня нет:/

Теперь из этого состояния, как я могу отменить объединитьпервоначальную ясно история? Может быть, снова слиться и вернуться !?

git history

+0

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – DIMMSum

ответ

1

вы делаете

git log --oneline 

см коммитов перед слиянием

затем просто возвращаясь к тому, что совершить до слияния без какой-либо переустановки !!! После повторного нажатия на начало координат в качестве нового фиксации.

Reverting означает, что ваш следующий снимок будет таким же, как и перед слиянием, но ваше ошибочное слияние-фиксация будет сохранено в общей истории фиксаций, что лучше оставить там. Избегайте сброса жесткого диска как можно больше.

+0

Я всегда в фиксации перед слиянием, потому что я сделал сброс. Как я могу это сделать, что вы описываете. – ninchen

+0

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

+0

что может случиться, когда я оставлю фиксацию так, как она есть? – ninchen

0

Там нет необходимости возвращаться что-либо здесь. У вас почти было правильное решение, но ваш возврат к неправильному фиксации. Способ исправить это запустить:

git reset --hard <pre-merge commit hash> 

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

git push origin master --force 

, чтобы сбросить дистанционную ведущую ветвь, как вы это делали раньше. Приведенная вами команда ошибочно указала ведущую ветвь на хеш-фиксацию слияния.

Для вашего собственного знания фона, если вы посмотрите в .git/refs/heads, вы увидите список файлов с теми же именами, что и ваши ветви. Содержимое этих файлов - это только хэши каждого из коммитов, на которые они указывают. И это буквально вся ветка: ссылка на фиксацию.

Когда вы запустили git reset --hard <merge commit hash>, вы сделали главную ветвь (которая является именно этим очень простым ссылочным файлом) указывают на фиксацию слияния. Направляя его на фиксацию до слияния, вы обновите эту простую ссылку главной ветки, чтобы указать на хэш фиксации до слияния.

+0

Я сделал это, как вы его описали, прежде чем я написал свой вопрос. Но что с историей? Вы имеете в виду, что это не проблема, чтобы дать возможность слияния? – ninchen

+0

Я не уверен, что я следую. Вы пытались жестко сбросить фиксацию ранее в своей истории, чем фиксация слияния, и она не указывает на вашу ветку? Вы не должны оставлять там слияние. – DIMMSum

+0

Жесткий сброс в порядке. Мастер - это одна фиксация перед фиксацией слияния. Теперь я отменим фиксацию слияния. – ninchen