Git pull - ошибка записи notuptodate не может объединиться - PullRequest
1 голос
/ 30 ноября 2009

Я новичок в GIT и хотел знать, как просто получить последнюю версию транка и отменить все мои текущие изменения.

Все, что мне кажется, это ошибка notuptodate. Я не хочу сохранять свои старые изменения ...

Я также получаю Your branch is behind 'origin/master' by 15 commits, and can be fast-forwarded. Как мне перемотать вперед? Опять же, меня не волнуют изменения, которые я сделал.

Заранее большое спасибо, поскольку в текущих ответах на SO, похоже, предполагается, что вы хотите сохранить изменения

Пример ошибки (и вещей, которые были опробованы)

$ git checkout 

$ git pull 

Updating 69edec1..dc3fdfe error: Entry 'src/FluentNHibernate.Testing/DomainModel/Mapping/CompositeIdentityPartTester.cs' not uptodate. Cannot merge.

$ git checkout -- src/FluentNHibernate.Testing/DomainModel/Mapping/CompositeIdentityPartTester.cs 

$ git pull 

Updating 69edec1..dc3fdfe error: Entry 'src/FluentNHibernate.Testing/DomainModel/Mapping/CompositeIdentityPartTester.cs' not uptodate. Cannot merge.

$ git reset --hard

$ git pull 

Updating 69edec1..dc3fdfe error: Entry 'src/FluentNHibernate.Testing/DomainModel/Mapping/CompositeIdentityPartTester.cs' not uptodate. Cannot merge.

ИСПРАВЛЕНО: Кажется, я исправил проблему с помощью gitk --all и с помощью графического интерфейса пользователя, чтобы сделать полный сброс при последнем изменении ... Я все еще очень хотел бы понять, почему командная строка не не делаете это?

Ответы [ 4 ]

12 голосов
/ 30 ноября 2009

Чтобы отбросить все ваши изменения и вернуться к последнему коммиту, используйте

git reset --hard HEAD

Ускоренная перемотка - это своего рода слияние, когда нет никакого фактического слияния, вам просто нужно прыгать по коммитам. В этом случае, git на самом деле не говорит вам , что делать, но дает вам понять, что вы действительно должны тянуть (потому что это будет тривиально).

1 голос
/ 30 ноября 2009

Операция git checkout -- file работает строго в рабочем каталоге или в состоянии файловой системы вашего репозитория (обратите внимание, что между аргументом -- и file есть пробел, чтобы отличить команду от проверки ветви или тег с именем file).

Если в репозитории что-то было git add, в терминологии git это часть индекса, и извлечение не исправит это, вам нужно использовать команду git reset, которая обновляет состояние индекса.

В качестве ярлыка для выполнения обоих вышеперечисленных действий, git reset --hard сбросит индекс и сбросит изменения в рабочем каталоге (так что ваш рабочий каталог и индекс находятся в идентичных состояниях (состояние, заданное аргументом опции; без каких-либо аргументов по умолчанию используется HEAD.) Обычные предостережения применяются в отношении того, чтобы убедиться, что вы не уничтожили вещи, которые хотите сохранить, если они не были зафиксированы, но, судя по звукам, это то, что вы хотите.

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

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

ОБНОВЛЕНИЕ: Если сброс / извлечение фактически не сбрасывает ваш рабочий каталог, проверьте свойство core.autocrlf в вашем каталоге: git config --get core.autocrlf

Если вы используете репозиторий, который выполняет обходы между Windows / UNIX / любыми файловыми системами с различными соглашениями о конце строки и пытается предотвратить безумие, которое кроется в нем, путем чтения файлов из файловой системы с помощью CRLF, как если бы они имели LF терминаторы, а затем реверсируют это преобразование при записи в файловую систему, идея в том, что вы можете работать с файлами обычно, не внося тонны пробелов, вносящих изменения в ваши файлы diff, но это часто вызывает больше проблем, чем необходимо. Попробуйте git diff --ignore-all-space и, если он ничего не показывает, это ваша проблема, и вы можете попробовать обновить конфигурационный файл, чтобы отключить его, и повторить.

0 голосов
/ 03 декабря 2009

Первым делом - спасибо за ответы от всех. Это похоже на ошибку пользователя. Ни одно из предложенных решений не работало, кроме gitk --all, а затем с помощью графического интерфейса для «сброса главной ветви здесь»

Не идеально, но это сработало.

Спасибо

0 голосов
/ 30 ноября 2009

Когда я был новичком в git и часто совершенно не понимал, что происходит с ветками и коммитами и как они связаны, я нашел gitk очень полезным, чтобы дать мне представление о том, что на самом деле происходит.

Для проектов с не слишком большим количеством коммитов, gitk --all даст полный обзор всех коммитов и веток. Слишком много коммитов, однако, станет немного вялым.

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