Один из похожих файлов в репозитории Git исчез после копирования - PullRequest
1 голос
/ 15 марта 2012

Хорошо, вот история. У нас есть git-репозиторий с 20-30 тыс. Строк кода. Мой напарник скопировал (скопировал, не перемещал) несколько файлов в хранилище, чтобы создать другой модуль. Содержимое этих файлов было слегка изменено. Затем он сделал коммит. Тем временем я работал с некоторыми файлами, которые он скопировал (оригиналы), и передал мою работу. Когда я тянул, я понял, что у меня есть конфликты в файлах, которых у меня не было, так как он просто создал их (скопировал их). После разрешения конфликтов я проверил локальный репозиторий, и у меня нет половины файлов, которые я предполагаю иметь. Я знаю, что git отслеживает содержимое файлов, а не имена файлов, но сейчас это не очень полезно.

git log remote_repo --stat --diff-filter=D

показывает, что несколько файлов было удалено, а

git log remote_repo --stat -C --diff-filter=D

показывает, что было удалено меньше файлов (но все же некоторые)

Нам нужны обе копии файлов, что нам делать?

1 Ответ

1 голос
/ 15 марта 2012

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

git rebase -i HEAD~1

Вам будет представлен экран с вопросом, что вы хотите сделать с каждым коммитом. Это будет что-то вроде:

pick bb009b7 merge commit

# Rebase 9775146..bb009b7 onto 9775146
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Изменить выбор, чтобы редактировать, сохранить и выйти из редактора. Теперь вы вернулись в коммит слияния. Run:

git checkout <id of the previous commit> <filename>
git commit --amend
git rebase --continue

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

Я бы предположил, что это будет примерно так:

# rebase the last three commits, assuming:
#  the oldest is your most recent changes
#  the next is your co-worker's
#  the last is the merge
# You can probably go back only two but I generally
# go back one extra just to see that things are as I 
# expect.

git rebase -i HEAD~3

Вам будет представлен экран с вопросом, что вы хотите сделать с каждым коммитом. Это будет что-то вроде:

pick 8d25cf0 Your changes
pick e9ddd29 His changes
pick bb009b7 merge

# Rebase 9775146..bb009b7 onto 9775146
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Оставьте первую строку как есть. Изменить выбор во втором редактировать. Последнее, что я думаю, вы тоже хотите отредактировать.

Запишите и сохраните это, и начнется перебазировка. Он пройдет через первый коммит и остановится на втором. Ваши файлы должны отсутствовать. Теперь вы хотите запустить:

git checkout <id of the previous commit> <filename>

И это восстановит файлы, удаленные вашим коллегой.

Затем запустите:

git commit --amend
git rebase --continue

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

Если вы чувствуете, что что-то идет не так в любой момент

git rebase --abort

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

...