Як витягнути файли з віддаленого пристрою без перезапису локальних файлів?


113

Я намагаюся налаштувати нове git repo до раніше існуючого віддаленого репо.

Я хочу, щоб мої локальні файли перезаписали віддалене репо, але git говорить, що спочатку я повинен витягнути ці віддалені файли і об'єднати їх.

Чи є якийсь спосіб витягнути, але переконайтесь, що локальні файли не перезаписані дистанційним?

Відповіді:


182

Ну, так, і ні ...

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

Тим НЕ менше, це дуже легко зробити «правильну річ ...»

Крок 1:

git stash

у вашому місцевому репо. Це дозволить зберегти локальні оновлення у сховищі, а потім повернути змінені файли до їх попереднього редагування.

Крок 2:

git pull

щоб отримати будь-які модифіковані версії. Тепер, сподіваємось, це не отримає нових версій файлів, про які ви хвилюєте. Якщо цього не відбувається, наступний крок буде працювати безперебійно. Якщо це так , то вам належить виконати якусь роботу, і ви будете раді, що зробили.

Крок 3:

git stash pop

Це об'єднає ваші модифіковані версії, які ви закрили на етапі 1, з версіями, які ви щойно витягнули на кроці 2. Якщо все пройде гладко, значить, все буде налаштовано!

Якщо, з іншого боку, виникли справжні конфлікти між тим, що ви вирішили на кроці 2, і вашими модифікаціями (через те, що хтось інший редагував тимчасово), ви дізнаєтесь, і вам буде запропоновано їх вирішити. Зроби це.

Речі вийдуть набагато краще таким чином - це, ймовірно, збереже ваші зміни без будь-якої реальної роботи з вашого боку, при цьому попереджаючи про серйозні, серйозні проблеми.


5
чому б не просто git commitмісцеві зміни, що сталися git pull?
Дон Чідл

10
Іноді я знаходжуся в положенні, коли я не хочу вводити код, але хотів би зберегти його на своїй локальній машині, ці набори команд дуже корисні для цього.
Варган

3
Це не корисно, якщо у вас є кілька файлів, деякі, які ви хочете перезаписати, а інші, які ви не хочете перезаписувати. Чи немає способу сказати GIT ігнорувати файли під час потягу? Чому .gitignore працює лише для підштовхування, я взагалі не розумію цього дизайнерського рішення ...
Бобак Хашемі

25

Ви можете спершу сховати свої локальні зміни, потім витягнути, а потім виправити скриньку.

git stash
git pull origin master
git stash pop

Все, що замінить зміни від віддалених, матиме конфлікти, які вам доведеться вручну вирішувати.


4
Я вже здійснив ці зміни на місцях, так що там сказано, що "немає місцевих змін, щоб зберегти"
Джо Ісааксон

я думаю, це найкраща стратегія.
Jimmy Obonyo Abor

13

Таким чином, ви здійснили свої локальні зміни у вашому локальному сховищі. Потім, щоб отримати віддалені зміни у вашому локальному сховищі, не вносячи змін у ваші локальні файли, ви можете використовувати git fetch. Насправді git pullце двоетапна операція: неруйнівна, git fetchза якою слідує a 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 

Тепер у вас є віддалені зміни в іншій гілці, і ви зберігаєте свої локальні файли недоторканими.

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


дякую за пояснення git pull як двоетапний git fetch / git merge
cdabel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.