Git теряет историю / содержимое отдельных файлов - PullRequest
8 голосов
/ 05 августа 2011

Я работаю в небольшой компании, и наше репозиторий Git немного испорчено. Я только что сделал git pull, и мои изменения, сделанные ранее сегодня, пропали!

Когда я работаю над HEAD в основной ветке, git log показывает мой последний коммит b94940c63ef965ce45b0d64ccfba4359134d2552 в его истории.

Теперь, если я сделаю git log filename для проблемного файла, потерявшего мои изменения, этот коммит не будет показан (отображается только более ранний коммит).

Выполнение git log --follow filename, мой коммит b94940c63ef965ce45b0d64ccfba4359134d2552 отображается как самый последний.

И конечно же, если я сделаю:

git checkout b94940c63ef965ce45b0d64ccfba4359134d2552
git log filename

тогда коммит показывается и мои изменения в файле!

Другими словами, сделанный мной коммит отображается в истории веток (блокирует слияние веток), но отдельные измененные файлы не имеют этого коммита в своей истории! (если я явно не извлечу этот коммит).

Вопросы:

  1. Как, черт возьми, это произошло?

  2. Как это исправить? (У нас проблемы с несколькими файлами в нашем репо)

Ответы [ 4 ]

4 голосов
/ 05 августа 2011

Хорошо, разобрался с проблемой.Когда коллега потянул, у него возникли конфликты.Вместо того, чтобы разрешить, он сбрасывает все промежуточные файлы.Это было похоже на git checkout old_version для отдельных старых файлов.Так что HEAD на мастере в итоге ссылался на некоторые файлы, которые имели old_version.

Теперь я вручную восстанавливаю то, что он выдул.

Мораль истории: изменение операций git (извлечение, сброс,и т. д.) на отдельных файлах довольно опасно.

1 голос
/ 05 августа 2011

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

git checkout master

что выводит

git status

и

git whatchanged -m -p <path>

и

git log --graph --oneline b94940c63ef965ce45b0d64ccfba4359134d2552..master

?

0 голосов
/ 31 марта 2016

На самом деле вы можете использовать этот bash-скрипт в папке, которую вы хотите увидеть, какие файлы могут потерять свои коммиты:

#!/bin/zsh
for f in $(find . -name '*.php')
do
	follow=$(git log --oneline -1 --pretty=format:"%h" -- $f)
	log=$(git log --follow --oneline -1 --pretty=format:"%h" -- $f)
	
	if [ $log != $follow ]; then
  		echo "follow $follow , log $log => $f"
  	fi

done
0 голосов
/ 05 августа 2011

Прежде всего, вы должны получить представление о том, что делают команды Git и какие данные хранятся в хранилище.

  • Получить инструмент визуализации истории, такой как Giggle или Gitk, чтобы просмотреть историю ваших коммитов и посмотреть, какой коммит основан на каком коммите.

  • git pull делает две вещи: получает новые коммитыиз удаленного репозитория и он объединяет заголовок удаленного репозитория с вашим текущим заголовком (в вашей текущей ветке).

Итак, в свете этого вывозможно, захотите быть более осторожным в будущем.Вместо использования git pull вы можете сделать git fetch и вручную объединить то, что необходимо объединить.Таким образом, вы можете контролировать, какие изменения вы делаете.

Что касается вашей текущей ситуации, я не думаю, что Git теряет данные.Вы сказали, что ваш файл все еще в истории.Так что теперь вам, вероятно, потребуется выполнить некоторые творческие перезагрузки (возврат к старым версиям) или исправления (возможно, вручную), чтобы привести файлы проекта в состояние, в котором они должны быть.

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