2015-10-14 2 views
4

Хотел бы я знать git лучше.Как удалить файл из git repo на локальном и удаленном

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

Прежде чем начать, я убедился, что моя ветка полностью обновлена ​​с помощью пульта дистанционного управления. Затем я использовал

git filter-branch -f --index-filter \ 'git rm -r --cached --ignore-unmatch *.csproj' HEAD 

Я добавил -f флаг из-за какой-то вопрос с подпорками, так как я запустить эти пару раз в настоящее время.

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

Что мне недостает, чтобы получить это изменение на моем сервере? (Bitbucket)

ответ

2

Если я правильно понимаю вашу проблему, вы не можете нажать на удаленный репозиторий, потому что ваша локальная история не соответствует удаленной истории. Это то, что обычно происходит, когда вы локально изменяете фиксацию с помощью rebase или с filter branch.

Если вы нажмете локальные изменения на пульте дистанционного управления, вы перепишете часть или всю историю ваших проектов. Это означает, что каждый разработчик в вашем проекте попадает под удар, когда они пробуют git pull, потому что сейчас их локальная история отличается от истории удаленного. В таком случае вы обычно хотите сообщить об этом своим со-разработчикам, потому что это может быть довольно запутанным, а также трудоемким, если они не знают, что сделал ваш filter-branch.

Сказав это, я считаю, что вы ищете опцию --force для git push. Вы хотите запустить git push --force origin master. Это, как следует из названия, перезаписывает все, что находится на пульте дистанционного управления, с вашей локальной историей git.

Пожалуйста, прочтите the docs, прежде чем вы это сделаете, и задайте больше вопросов, если у вас есть какие-либо проблемы, поскольку это потенциально разрушительная вещь.

Редактировать: У вашей коллеги есть два варианта, о которых я знаю. Они могут либо пойти по маршруту fetch/reset, либо по маршруту rebase.

Маршрут fetch/reset связан с реестром локального репозитория вашего коллеги, чтобы он был точно таким же, как удаленный репозиторий. Это может быть сделано с:

git fetch origin && git checkout master 
git reset --hard origin/master 

rebase маршрута предполагает применение коммитов вашего сослуживца на вершине недавно очищенные мастеров. В интерактивном режиме у них будет возможность просмотреть каждое сообщение до его включения. Если коммит содержит файл, который вам нужен, он может просто опустить его. Это может быть сделано с

мерзавца принести мерзавец перебазироваться -i происхождения/Master

Первый вариант был бы предпочтительнее, если вы оба согласны, что ваше хранилище должно быть каноническим, как это быстрее.Второй подход, в свою очередь, дает вам более тонкий контроль.

Вы можете проверить это так вопрос, который решает вопрос вытягивать после того, как сила, толкающая более тщательно: git pull after forced update

+0

так, я сказать КОЛЛЕГЕ довести свою версию до даты с пульта дистанционного управления. Затем я перезаписываю пульт с этим параметром --force. И затем он делает git pull, чтобы обновить его версию? – gdbj

+0

Я добавил несколько файлов в файл .gitignore и попытался вытащить их из этого репо. это сложно. – gdbj