Как получить файлы с удаленного компьютера без перезаписи локальных файлов?

113

Я пытаюсь настроить новое репо git для уже существующего удаленного репо.

Я хочу, чтобы мои локальные файлы перезаписывали удаленное репо, но git говорит, что мне сначала нужно вытащить эти удаленные файлы и объединить их.

Есть ли способ вытащить, но убедиться, что локальные файлы не перезаписываются удаленным компьютером?

Джо Исааксон
источник

Ответы:

182

Ну да и нет ...

Я понимаю, что вы хотите, чтобы ваши локальные копии «переопределяли» то, что находится на удаленном компьютере, но, черт возьми, если кто-то изменил файлы в удаленном репо каким-то другим способом, и вы просто проигнорируете их изменения и попытаетесь «принудительно» свои собственные изменения, даже не глядя на возможные конфликты, ну, я оплакиваю вас (и ваших коллег) ;-)

Тем не менее, действительно легко поступать "правильно ..."

Шаг 1:

git stash

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

Шаг 2:

git pull

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

Шаг 3:

git stash pop

Это объединит ваши модифицированные версии, которые вы спрятали на шаге 1, с версиями, которые вы только что вытащили на шаге 2. Если все пройдет гладко, то все будет готово!

Если, с другой стороны, возникли реальные конфликты между тем, что вы вытащили на шаге 2, и вашими модификациями (из-за того, что кто-то в это время редактировал), вы узнаете и получите указание разрешить их. Сделай это.

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

Боб Гилмор
источник
5
почему не только git commitместные изменения git pull?
Дон Чидл,
10
Иногда я оказываюсь в ситуации, когда я не хочу фиксировать код, но я хотел бы сохранить его на своем локальном компьютере, этот набор команд действительно полезен для этого.
Варган,
3
Это бесполезно, если у вас есть несколько файлов, некоторые из которых вы хотите перезаписать, а некоторые не хотите перезаписывать. Нет ли способа указать GIT игнорировать файлы при вытягивании? Почему .gitignore работает только для проталкивания, я вообще не понимаю это дизайнерское решение ...
Бобак Хашеми
«вы просто игнорируете их изменения» - несправедливое наблюдение. Я сталкиваюсь с этой проблемой в Visual Studio, которая генерирует специальный «csproj», адаптированный для локальной рабочей станции в зависимости от ссылок на библиотеки. И я тоже не хочу отправлять эти изменения на сервер.
snesgx
25

Вы можете сначала спрятать свои локальные изменения, затем вытащить, а затем открыть тайник.

git stash
git pull origin master
git stash pop

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

Райан Бигг
источник
4
Я уже зафиксировал эти изменения локально, так что там написано, что «нет локальных изменений для сохранения»
Джо Айзексон
я думаю, это лучшая стратегия.
Джимми Обоньо Абор 08
13

Итак, вы зафиксировали свои локальные изменения в своем локальном репозитории. Затем, чтобы получить удаленные изменения в вашем локальном репозитории без внесения изменений в ваши локальные файлы, вы можете использовать git fetch. Фактически git pullэто двухэтапная операция: неразрушающая, git fetchза которой следует git merge. См. В чем разница между git pull и git fetch? для более подробного обсуждения.

Подробный пример:

Предположим, ваш репозиторий такой (вы внесли изменения test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

И originрепозиторий выглядит так (кто-то другой совершил test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

В этот момент git будет жаловаться и попросить вас сначала вытащить, если вы попытаетесь отправить свой test2в удаленный репозиторий. Если вы хотите увидеть, что такое test1, не изменяя локальный репозиторий, запустите это:

$ git fetch

Ваш локальный репозиторий результатов будет таким:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Теперь у вас есть удаленные изменения в другой ветке, и вы сохраняете свои локальные файлы нетронутыми.

Тогда что дальше? Вы можете выполнить a git merge, который будет иметь тот же эффект, что и git pull(в сочетании с предыдущим git fetch), или, как я бы предпочел, сделать a, git rebase origin/masterчтобы применить ваше изменение поверх origin/master, что даст вам более чистую историю.

Пэнхэ Гэн
источник
спасибо за объяснение git pull как двухэтапного слияния git fetch / git
cdabel