Как восстановить потерянные изменения в git-репо? - PullRequest
1 голос
/ 07 февраля 2012

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

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

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

В принципе, проблема может быть видна на этом изображении:

The problems

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Самый простой способ - git revert выполнить коммит слияния и заставить разработчика повторить слияние, на этот раз правильно.

git revert <sha> запишет новый коммит, который отменяет коммитэффекты <sha>, что должно быть вашим плохим коммитом слияния.

Поскольку это изменение уже перенесено в центральный репозиторий, вам не следует использовать какую-либо магию переписывания истории в git.

2 голосов
/ 06 августа 2013

Пару дней назад я столкнулся с такой же ситуацией.

Возможная причина

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

git merge -s ours <somebranch>

, даже не подозревая об этом.

Некоторые разработчики не используют консоль и pull / commit / push, используя свои IDE. Когда что-то идет не так, некоторые IDE предоставляют такие опции, как «force», «resolve to mine» и т. Д., На которые не всегда нужно нажимать, если только кто-то точно не знает, что он делает.

Плохо то, что после такого коммитного слияния нажатый git скажет вам, что все коммиты слитой ветки находятся там, но вы не найдете ни одного из этих изменений ... Грустная история.

Решение идти

Мы решили вернуться к мастеру сброса к последней точке, когда все было в порядке.

git checkout master
git reset --hard
git reset --hard <OKAY_POINT>

В вашем случае <OKAY_POINT> - это 3221961.

А потом нам пришлось насильно подтолкнуть это вверх по течению.

git push --force

В результате origin/master был сброшен в состояние до того, как произошло плохое слияние.

Обычно это НЕ хорошая идея. Но мы пошли на это, поскольку вся команда является локальной, большинство парней знали о том, что происходит, и никто не совершал никаких действий над этим сломанным мастером в тот момент, когда происходил принудительный сброс.

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

Единственный другой вариант без сброса удаленного устройства, который я вижу, - это ручное объединение всего, что могло быть «стерто». Что не кажется мне чем-то простым.

0 голосов
/ 07 февраля 2012

Я не уверен, что вы спрашиваете, но вы почти всегда можете использовать git reflog, чтобы вернуть что-то, что было случайно удалено

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