Это произошло потому, что кто-то, предположительно, не вы, удалили код.
Помните, что слияние не означает, что делает их одинаковыми .Вы говорите 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
.Это извлечет копию, находящуюся в коммите, поместив эту копию в ваш индекс (готовый для вашего следующего коммита) и ваше рабочее дерево (готовое для его просмотра).