Вы (и git) делаете это точно так, как должны. Вы не используете git неправильно; Он предназначен для того, чтобы можно было толкать и тянуть из разных мест, вот так.
Причина, по которой git жалуется вам , заключается в том, что это требуется моделью ревизий: предположим, на машине A вы сделали коммит с помощью хэша "abcdef". Чтобы иметь возможность обмениваться наборами изменений между репозиториями, как вы хотите, коммит "abcdef" должен быть точно везде одинаковым. На машине B, когда вы извлекаете этот коммит в ваши локальные изменения, он может поместить этот коммит в историю в каком-то конкретном месте, но он не может смешать , который фиксирует ваши локальные изменения. Это приведет к коммиту «3dea12», который совершенно другой.
Git может попытаться смешать ваши изменения на лету, как это делает Subversion. Рассмотрим, однако, если вы совершили коммит шесть раз: теперь вам нужно объединить шесть раз, по одному разу для каждого (неделимого) коммита, примененного на другой машине. Subversion обходит это, суммируя изменения в общем двоичном объекте diff, который затем пытается поместить поверх ваших локальных изменений. Иногда это работает, но некоторые слияния становятся немного странными, и не позволяет вам вести аккуратную историю изменений, которые никогда не меняются, которые предлагает git.
Чтобы решить вашу проблему , вот ваша стратегия вытягивания на машине B:
$ git stash # Set your uncommitted changes aside for a moment
$ git pull # Pull in the new changes
# <resolve conflicts, if they happen>
$ git stash pop # Bring back your uncommitted changes, fixing ambiguous
# merge pieces as necessary.
По сути, это стратегия "не волнуйся, git stash
не страшно". :)
Я думаю, важно отметить, что вам придется объединить . Хорошие практики разработки, сохранение небольших изменений и т. Д. Могут сделать слияния реже, но вам все равно придется иногда слияния.
Между прочим, вы хотите, чтобы жаловались. Если ваша рабочая копия чистая (нет необходимости в тайниках), вы смешиваете одну историю с другой. Git найдет места, где вам нужно слиться, и спросит вас, что делать. Это довольно четкий процесс. Если бы это место было связано с локальными изменениями , а также , история стала бы очень запутанной. По сути, это будет слияние вещей из прошлого с вещами из «будущего», которое в данном случае является вашей незафиксированной работой (которая, вероятно, изменится!).
В свете этого, вот ваш другой вариант:
$ git commit -m "..." # Commit your local changes, making them part of history.
$ git pull # Clean working copy! (maybe merging required)