2015-09-21 2 views
4

Я не очень часто работаю с git или командной строкой linux, и кажется, что я его много испортил. Я человек окон, и я использую cygwin для эмуляции этой среды.как сбросить git-хранилище раз и навсегда в чистое состояние

Ситуация:

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

иногда, когда я долгое время не вытягиваю из них (один из них превышал 2 тыс.), То иногда git status говорит мне, что ветви расходятся. Я не знаю, как это происходит, но я тогда 2k фиксирует отставание и 1 вперед. Затем вытягивание происходит из-за некоторых файлов, вызывающих конфликты, которые невозможно разрешить.

Это оставляет мне проблему, что у меня теперь есть репозиторий, из которого я больше не могу тянуть, потому что у него конфликты.

Итак, мой вопрос: как я могу эффективно вытащить из этого репозитория снова, не столкнувшись с конфликтами? Мне все равно, никаких изменений.

Это решение, которое я должен делать каждый раз, когда он путает:

git log --max-parents=0 head # copy ID on bottom 
git reset --hard <ID-you-have-copied> 
git clean -f -d 
git pull 

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

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

Есть ли что-то очевидно, что мне не хватает?

+0

Что такое 'git -max-parents = 0 head # copy ID внизу?? Что это должно делать? – Zloj

+0

@Zloj Извините за путаницу. Теперь я исправил команду в вопросе, но мне больше не нужен этот способ, поскольку ответ был дан, что, похоже, работает. – AyrA

+0

спасибо за разъяснение. Рад, что ваш плоблем решен. – Zloj

ответ

1

Я не уверен, что такое команда git --max-parents=0 head.

Но я думаю, вы могли бы просто сделать это вместо того, чтобы (происхождение & мастера может быть заменен на желаемый пульт дистанционного управления и имена филиалов):

git fetch origin master 
git reset --hard FETCH_HEAD 
git clean -f -d 

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

ПРИМЕЧАНИЕ: Это устраняет все локальные изменения в репозитории, как зафиксированные, так и не зафиксированные изменения. (зафиксированные изменения все равно могут быть восстановлены, ссылаясь на git reflog)

+0

Кажется, сейчас это работает. Я задал сомнительную команду в вопросе. Это должно быть 'git log --max-parents = 0 head', но я больше не нуждаюсь в этом для этого решения. – AyrA

0

Удалить свою проверенную ветку и проверить ее свежесть, что обойдет все слияния.

0

Я бы сделал то, что @Alderath указывает, но не обязательно немедленно сбрасывает HEAD. Просто сделайте git fetch origin master (или независимо от того, что ваша ветка получит новые коммиты). Git fetch только извлекает коммиты из источника, а git pull извлекает и объединяет, что может быть больше, чем вы хотите откусить (как вы узнаете). Затем выясните, каковы различия с «git log master ... origin/master» или git diff того же. Теперь выясните, что вы хотите сделать с этими различиями. Вы можете попытаться переустановить или объединить свою работу поверх оригинала/мастера или просто начать с ваших изменений поверх оригинала/мастера, если он просто слишком сильно расходится, чтобы упростить процесс слияния/переустановки.

Смежные вопросы