Git merge удаляет пустые пакеты - PullRequest
0 голосов
/ 31 мая 2019

Я поместил Java-приложение в репозиторий bitbucket, включая пару пустых пакетов. Две ветки разработки были созданы из основной ветки, и некоторые классы были добавлены в разные пакеты. Когда я попытался объединить другую ветку в моей локальной ветке разработки, не возникло никакого конфликта, но мои пакеты были удалены. Я вижу свои коммиты в журнале ошибок, я даже могу открыть свои классы в IntelliJ через окно Verion Control, но они был удален с фиксацией слияния.

Как я могу отменить мои изменения? Я не могу выбрать коммит, потому что он уже включен в ветку. Git reset не работает так же хорошо. Я могу воссоздать одни и те же классы и копировать изменения один за другим, если больше нечего делать, но должно быть какое-то лучшее решение.

1 Ответ

0 голосов
/ 01 июня 2019

Это произошло потому, что кто-то, предположительно, не вы, удалили код.

Помните, что слияние не означает, что делает их одинаковыми .Вы говорите Git:

git checkout somebranch
git merge anotherbranch

Это не значит, делает новый коммит в somebranch, который точно соответствует последнему коммиту в anotherbranch.Вместо этого это говорит Git:

  • Найти некоторый коммит в или до somebranch кончика, это также в или до наконечникаanotherbranch.Этот коммит, который приходит до того, как любой наконечник должен быть на обеих ветвях, и должен быть лучшим общим предком .Git вызывает this commit base merge .

  • Теперь, когда мы знаем, что тот, кто сделал somebranch - возможно, нас - начал с commit B (для базы), и кто бы ни сделал anotherbranch (возможно, это вместо нас) также начал с коммита B , сравните коммит B с кончиком somebranch чтобы посмотреть что мы / они изменили.Затем сравните B с вершиной anotherbranch, чтобы увидеть, что они / мы изменили.

Слияние теперь объединяет эти два набораизменений.Чтобы объединение решило, что файл somedir/somepackage.java должен быть удален , изменение с B на один совет должно быть: вообще ничего не делать .Изменение с B на другой совет должно быть: удалить файл somedir/somepackage.java.Комбинация этих двух изменений очевидна: удалите файл!

Следовательно, правильный результат слияния - комбинация изменений, сделанных человеком S на somebranch, который сказал удалить файл и неизменное лицо A на anotherbranch, которое вообще ничего не говорило, - это удалить файл, и Git сделал это.(Или, если у меня поменялись две ветви, это не имеет значения: это все равно автоматически правильный результат. Он подходит для Git, даже если, по вашей оценке человека умнее, чем Git, это неправильно.)

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

Возвращение файла

Чтобы получить файл с путем P из коммита H (где H - некоторый хэш коммита, например a123456), выполните команду:

git checkout <em>H</em> -- <em>P</em>

например, git checkout a123456 -- somedir/somepackage.java.Это извлечет копию, находящуюся в коммите, поместив эту копию в ваш индекс (готовый для вашего следующего коммита) и ваше рабочее дерево (готовое для его просмотра).

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