Git тягнуть, ігноруючи місцеві зміни?


489

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


17
Під "ігнорує" ви маєте на увазі "перезапис"?
Каскабель

@Cascabel Це означає повернути всі локальні зміни, скасувати всі локальні комісії, видалити всі нові локальні файли та каталоги, видалити всі локально видалені файли та каталоги тощо. Коротше кажучи, просто запустіть команду так, ніби rm -rf local_repo && git clone remote_url.
Віктор

Відповіді:


820

Якщо ви хочете сказати, що ви хочете, щоб витяг перезаписав локальні зміни, зробивши злиття так, ніби робоче дерево було чистим, добре, очистіть робоче дерево:

git reset --hard
git pull

Якщо є нерозглянуті локальні файли, ви можете git cleanїх видалити. Використовуйте git clean -fдля видалення файлів, що не відслідковуються, -dfдля видалення відслідковуваних файлів і каталогів, а також -xdfдля видалення не відстежуваних або ігнорованих файлів або каталогів.

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

git stash
git pull
git stash pop

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


4
Якщо git resetваші файли все ще відрізняються від віддалених, читайте stackoverflow.com/questions/1257592/…
полковник Паніка

3
Git - найдивніше, що коли-небудь. Скидання Git - важко зроблено. Потім статус git: Ваша філія попереду на 2 коміти.
Шейлен

21
@shailenTJ "Місцеві зміни" тут означають неспроможні зміни, а не місцеві комісії. git reset --hardвпливає на перше, а не на останнє. Якщо ви хочете повністю повернутись до стану віддаленого пристрою, git reset --hard origin/<branch>- але часто і в цьому випадку ці два зобов’язання, за якими ви випереджаєте походження, - це робота, яку ви зробили, а не те, що ви хочете викинути.
Каскабель

2
Тож це те саме, що знищити локальний сховище та повторно завантажити, так? Я просто хочу мати можливість примусити витягнути і перезаписати зміни для зручності. У 99% випадків я отримую це повідомлення про помилку, коли випадково щось зламав локально і просто хочу почати з репо.
судо

Що робити, якщо ви, можливо, не можете змінити місцевість проти голови? Наприклад, РЕПО зроблено у файловій системі, що враховує регістри, і клонується у файловій системі, нечутливій до регістру, і є два файли з однаковою назвами різного корпусу?
xster

305

Для мене працювали наступні:

(1) Спершу отримати всі зміни:

$ git fetch --all

(2) Потім скиньте ведучий:

$ git reset --hard origin/master

(3) Потягніть / оновіть:

$ git pull

22
Працював чудово для мене, коли було багато проблем з верхньою відповіддю. Дякую!
0x0

6
це навіть працює, коли ви зробили ур місцеві зміни, але все ще хочете повернутись
agsachin

16
Це має бути головна відповідь :)
Пурус

5
@Marco Servetto: Ви спочатку отримуєте всі свої зміни в git, але поки не застосовуєте їх. Потім ви скидаєте майстер до останнього стану (оновлений). Якщо пропустити перший крок, ви повернете зміни до старого головного (місцевого). З мого досвіду, те, як я це описав, ніколи не викликає проблем. Усі інші спроби роблять наприкінці.
Артур Барсегян

1
Це працювало для мене, я хотів ігнорувати всі мої локальні зміни, включаючи відновлення видалених файлів
Нері

28

Ви просто хочете команду, яка дає точно такий же результат, як і rm -rf local_repo && git clone remote_url, правда? Я також хочу цю функцію. Цікаво , чому мерзотник не надає таку команду (наприклад, git recloneчи git sync), ні робить СВН забезпечують таку команду (наприклад, svn recheckoutчи svn sync).

Спробуйте виконати таку команду:

git reset --hard origin/master
git clean -fxd
git pull

Це дійсно працює, навіть коли у вас уже є місцеві комісії, які ви хочете видалити.
Юрій Генцев

5
Увага, хлопці !! git clean -fxdтакож видаляє файли .gitignore.
Рамеш Наві

@RameshNavi Звичайно. Це саме те, що потрібно. Хочеться - це мати швидший спосіб його повторного клонування, тобто видалити всю локальну репо і потім її клонувати.
Віктор

27

Команда внизу не завжди працює . Якщо ви просто:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

і так далі...

Щоб по- справжньому почати, завантажуючи гілку та переписуючи всі ваші локальні зміни, просто виконайте:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Це буде добре працювати.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
ТАК. Це те, що мені було потрібно для остаточного підходу "не давай F на те, що є місцевим". Дякую. :)
Адамбій


8

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


8

Якщо ви працюєте в Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

Цикл for видалить усі відсліджені файли, які були змінені в локальному репо, тому git pullпрацюватиме без проблем.
Найприємніше з цього приводу те, що файли репо будуть замінені лише відслідковуваними файлами, а всі інші файли залишаться недоторканими.


Я думаю, ви мали на увазі "відслідковувані файли", саме це мені і потрібно, дякую.
Алі

будь-який еквівалент для Powershell?
Ерлі

8

найкоротший спосіб це зробити:

git pull --rebase --autostash

не знав про це --autostashраніше, дякую!
широ

7

це працювало для мене

git fetch --all
git reset --hard origin/master
git pull origin master

з прийнятою відповіддю я отримую конфліктні помилки


Це дуже схоже на відповідь Артура Барсегяна у 2015 році ... але я все одно хотів би знати, яка мета третьої команди: робочі файли змінилися після 2-ї команди, а 3-та команда говорить: "Вже оновлено "
мійський гризун

це єдине поєднання, яке працювало на моєму оточенні, можливо, ви бачите іншу річ, для мене мені були потрібні три команди
Пабло Пацос,

Цікаво. Це може бути річ версії. Я на git 2.7.4. Але я також щойно бачив новий коментар Артура Барсегяна: "Інакше ви можете опинитися на роботі над випадково застарілим майстром".
мійський гризун

Можливо, але єдине, що я можу сказати, це "це спрацювало для мене, коли не було іншого рішення", тому це може допомогти іншим
Пабло Пацос,


2

Це отримає поточну гілку і спробує зробити швидкий вперед для освоєння:

git fetch && git merge --ff-only origin/master

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