Как да накарам git да презапише местните файлове?

Как да принудително презапишете локалните файлове в git pull ?

Скриптът е както следва:

  • Членът на екипа променя шаблоните за сайта, върху който работим
  • Те добавят изображения към каталога с изображения (но забравят да ги добавят под контрола на изходния код)
  • Те изпращат изображения по пощата, по-късно, за мен
  • Добавям изображения под контрола на изходния код и ги поставях на GitHub заедно с други промени.
  • Те не могат да получават актуализации от GitHub, защото Git не желае да презаписва файловете си.

Това е грешката, която получавам:

Грешка: файлът с неоткрито работно дърво 'public / images / icon.gif' ще бъде заменен от сливане

Как да накараме Git да ги презапише? Този човек е дизайнер. Обикновено разрешавам всички конфликти ръчно, така че най-новата версия е инсталирана на сървъра, която просто трябва да актуализира на компютъра си.

5705
14 июля '09 в 17:58 2009-07-14 17:58 зададен от Якуб Тросок на 14 юли 2009 г. в 17:58 2009-07-14 17:58
@ 39 отговора
  • 1
  • 2

Важно: ако имате някакви местни промени, те ще бъдат загубени. С опцията --hard или без --hard всички локални --hard които не са били предадени, ще бъдат загубени. [*]

Ако имате файлове, които не се проследяват от Git (например изтеглено потребителско съдържание), тези файлове няма да бъдат засегнати.


Мисля, че това е правилният начин:

 git fetch --all 

След това имате две опции:

 git reset --hard origin/master 

ИЛИ Ако сте в друг клон:

 git reset --hard origin/<branch_name> 

обяснение:

git fetch изтегля най-новите данни от отдалечен компютър, без да се опитва да обедини или премести нищо.

Тогава git reset нулира основния клон до това, което току-що сте получили. Опцията --hard променя всички файлове във вашето работно дърво според файловете по origin/master


Поддържайте текущите локални ангажименти

[*] : Струва си да се отбележи, че можете да запазите текущите локални ангажименти, като създадете клон от master да го рестартирате:

 git checkout master git branch new-branch-to-save-current-commits git fetch --all git reset --hard origin/master 

След това всички стари коммити ще се съхраняват в new-branch-to-save-current-commits .

Предстоящи промени

Обаче, незавършените промени (дори поетапни) ще бъдат загубени. Уверете се, че се криете и предавате всичко, от което се нуждаете.

 git stash 

След това отново приложите тези неприети промени:

 git stash pop 
7980
17 янв. отговорът се дава на РНК 17 януари. 2012-01-17 03:02 '12 в 3:02 2012-01-17 03:02

Опитайте следното:

 git reset --hard HEAD git pull 
border=0

Той трябва да прави това, което искате.

798
09 мая '10 в 22:45 2010-05-09 22:45 отговори на Travis Reeder Май 09, '10 в 22:45 ч. 2010-05-09 22:45

ВНИМАНИЕ: git clean премахва всичките ви непознати файлове / директории и не може да бъде отменено.


Понякога просто clean -f не помага. Ако нямате следени директории, опцията -d също е необходима:

 # WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull 

ВНИМАНИЕ: git clean премахва всичките ви непознати файлове / директории и не може да бъде отменено.

Опитайте -n използвате -n ( --dry-run ). Това ще ви покаже какво ще бъде премахнато, без действително да изтриете нещо:

 git clean -n -f -d 

Примерни изходни данни:

 Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ... 
406
19 марта '11 в 12:10 2011-03-19 12:10 отговорът е даден от David Avsajanishvili 19 март '11 в 12:10 2011-03-19 12:10

Подобно на таралежа, мисля, че отговорите са ужасни. Но въпреки че отговорът на таралежът може да е по-добър, не мисля, че е толкова елегантно, колкото може. Начинът, по който открих това, е да се използва "извадка" и "сливане" със специфична стратегия. Това трябва да гарантира, че локалните ви промени ще бъдат запазени, докато не станат един от файловете, които се опитвате да презапишете.

Първо извършете промените.

  git add * git commit -a -m "local file server commit message" 

След това изтеглете промените и ги препишете, ако има конфликт.

  git fetch origin master git merge -s recursive -X theirs origin/master 

"- X" е името на опцията, а "theirs" е стойността за тази опция. Вие предпочитате да използвате „вашите“ промени вместо „вашите“ промени, ако има конфликт.

347
11 апр. Отговор, даден от Richard Kersey 11 април 2012-04-11 23:13 '12 в 23:13 ч. 2012-04-11 23:13

Вместо това:

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

Бих препоръчал да направите следното:

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

Не е необходимо да се вземат всички конзоли и клонове, ако отидете да се върнете към началния / главния клон вдясно?

248
26 апр. Johanneke публикува на 26 април 2013-04-26 16:48 '13 в 16:48 2013-04-26 16:48

Изглежда, че най-доброто нещо, което трябва да направите, е:

 git clean 

За да премахнете всички неизползвани файлове и след това да продължите с нормалното git pull ...

125
14 июля '09 в 18:16 2009-07-14 18:16 отговорът е даден от Jakub Troszok на 14 юли 2009 г. в 18:16 ч. 2009-07-14 18:16

Внимание, това ще изтрие завинаги вашите файлове, ако имате някакви / * записи в директорията във вашия файл gitignore.

Някои отговори изглеждат ужасни. Ужасно в смисъл на това, което се случи с @Lauri, следвайки предложението на David Avsadjanishvili.

По-скоро (git> v1.7.6):

 git stash --include-untracked git pull 

По-късно можете да изчистите кеша на историята.

Ръчно, един по един:

 $ git stash list stash@{0}: WIP on <branch>: ... stash@{1}: WIP on <branch>: ... $ git stash drop stash@{0} $ git stash drop stash@{1} 

Жестоко, всички наведнъж:

 $ git stash clear 

Разбира се, ако искате да се върнете към това, което сте скрили:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. Отговорът е даден от таралеж на 12 февруари. 2012-02-12 02:00 '12 в 2:00 2012-02-12 02:00

Тази команда може да ви бъде полезна за изтриване на местни промени:

 git checkout <your-branch> -f 

И след това направете почистването (изтрива необработените файлове от работното дърво):

 git clean -f 

Ако искате да изтриете ненужни директории в допълнение към файловете без проследяване:

 git clean -fd 
88
05 авг. отговорът е даден от Vishal 05 aug. 2010-08-05 21:06 '10 в 21:06 2010-08-05 21:06

Вместо сливане с git pull опитайте следното:

git fetch --all

последвано от:

git reset --hard origin/master .

81
22 нояб. Отговорът е даден от Лойд Мур на 22 ноември. 2012-11-22 13:56 '12 в 1:56 pm 2012-11-22 13:56

Единственото нещо, което ми помогна, беше:

 git reset --hard HEAD~5 

Това ще ви даде пет ангажимента, а след това

 git pull 

Открих, че като гледам как да се отмени сливането на git .

54
06 мая '11 в 0:53 2011-05-06 00:53 отговорът е даден от Chris BIllante на 06 май'11 в 0:53 2011-05-06 00:53

Проблемът с всички тези решения е, че те са или твърде сложни, или още по-сериозен проблем е, че изтриват всички сурови файлове от уеб сървъра, които не искаме, защото винаги са необходими конфигурационни файлове, които винаги са на сървъра. и не в хранилището на git.

Тук е най-чистото решение, което използваме:

51
06 нояб. отговор от Страхиня Кустудич 06 ноември 2012-11-06 02:32 '12 в 2:32 2012-11-06 02:32

Имам същия проблем. Никой не ми даде това решение, но ми помогна.

Реших това:

  1. Изтрийте всички файлове. Оставете само директорията .git .
  2. git reset --hard HEAD
  3. git pull
  4. git push

Сега тя работи.

38
13 янв. Отговор е даден от Джон Джон Пихлер на 13 януари 2011-01-13 02:58 '11 в 2:58 2011-01-13 02:58

Първо, опитайте стандартния начин:

 git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders! 

Предупреждение : горните команди могат да доведат до загуба на данни / файлове, само ако не са фиксирани! Ако не сте сигурни, първо архивирайте цялата си папка в хранилището.

След това го дръпнете отново.

Ако горепосоченото не ви помогне и не ви трябват неоткритите ви файлове / директории (направете първо резервно копие, за всеки случай), опитайте следните лесни стъпки:

 cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again 

Това ще премахне всички файлове git (с изключение на .git/ dir, където имате всички .git/ ) и ще го извлечете отново.


Защо git reset HEAD --hard може да работи в някои случаи?

  1. Потребителски правила във .gitattributes file

    Наличието на правилото eol eol=lf в .gitattributes може да предизвика git да промени някои от промените във файла, като конвертира окончанията на CRLF линиите в LF в някои текстови файлове.

    Ако е така, трябва да извършите тези CRLF / LF промени (като ги видите в git status ) или опитайте: git config core.autcrlf false за да ги игнорирате временно.

  2. Несъвместимост на файловата система

    Когато използвате файлова система, която не поддържа атрибути на разрешения. Например, имате два хранилища, един за Linux / Mac ( ext3 / hfs+ ), а другият за файлови системи, базирани на FAT32 / NTFS.

    Както забелязахте, съществуват два различни типа файлови системи, така че този, който не поддържа Unix разрешения, по същество не може да нулира разрешения за файлове в система, която не поддържа такива разрешения, така че без значение колко се опитвате, git винаги открива някои "промени".

33
26 окт. отговорът е даден kenorb 26 окт. 2012-10-26 12:17 '12 в 12:17 2012-10-26 12:17

бонус:

Като говорим за pull / fetch / merge в предишни отговори, бих искал да споделя интересен и продуктивен трик:

git pull --rebase

Този екип е най-полезният екип в живота ми в Git, който спести много време.

Преди да изпратите новия ангажимент към сървъра, опитайте тази команда и тя автоматично ще синхронизира последните промени в сървъра (с fetch + merge) и ще поставите коммита в горната част на дневника Git. Няма нужда да се притеснявате за ръчното извличане / сливане.

Намерете части в Какво прави "git pull --rease"? ,

31
23 дек. Отговорът е даден от Sazzad Hissain Khan на 23 декември. 2015-12-23 18:41 '15 в 18:41 2015-12-23 18:41

Обобщавах другите отговори. Можете да изпълнявате git pull без грешки:

 git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull 

Предупреждение. Този скрипт е много мощен, така че можете да загубите промените си.

27
07 авг. отговорът е даден от Робърт Мун 07 август. 2015-08-07 06:03 '15 в 6:03 2015-08-07 06:03

Имах подобен проблем. Трябваше да направя това:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. Отговорът е даден от Райън Ян 14 2011-01-14 18:18 '11 в 18:18 2011-01-14 18:18

Въз основа на собствения си опит от този вид решението, предлагано от Страхиня Кустудич по-горе, е далеч най-доброто. Както отбелязват други, простото извършване на твърдо нулиране ще премахне всички неизпитани файлове, което може да включва много неща, които не искате да изтривате, като например конфигурационни файлове. По-сигурно е, че трябва само да изтриете файловете, които трябва да се добавят, и в този случай вероятно искате да проверите за локално модифицирани файлове, които трябва да бъдат актуализирани.

Ето защо актуализирах скрипта на Кустудич, за да направя точно това. Също така поправих печатна грешка (липсваше оригинала).

26
27 февр. Отговор, даден от Ролф Кайзер на 27 февруари 2013-02-27 17:43 '13 в 17:43 2013-02-27 17:43

Считам, че има две възможни причини за конфликта, които трябва да бъдат разрешени отделно, и доколкото мога да кажа, нито един от горните отговори не е свързан и с двете:

  • Местните файлове, които не се наблюдават, трябва да бъдат премахнати ръчно (по-безопасно) или, както е предложено в други отговори, да git clean -f -d

  • Локалните команди, които не са в отдалечения клон, също трябва да бъдат изтрити. IMO е най-лесният начин да постигнете това: git reset --hard origin/master (заменете "master" с всеки клон, върху който работите, и първоначално стартирайте git fetch origin )

23
12 дек. Отговорът е даден на 12 декември. 2011-12-12 22:54 '11 в 22:54 ч. 2011-12-12 22:54

По-лесен начин:

 git checkout --theirs /path/to/file.extension git pull origin master 

Това ще замени местния файл git.

20
05 мая '15 в 11:03 2015-05-05 11:03 отговорът е даден maximus 69 05 май '15 в 11:03 2015-05-05 11:03

Изглежда, че повечето от отговорите тук са фокусирани върху master клон; понякога има случаи, когато работя по един и същ клон от функции на две различни места и искам един от тях да отразява един от тях в другия, без много хмел чрез обръчите.

Въз основа на комбинацията от реакцията на РНК и отговора на торек към подобен въпрос , дойдох с отлична работа:

 git fetch git reset --hard @{u} 

Стартирайте го от клона и той само ще възстанови локалния ви клон на версията нагоре.

Това може удобно да бъде поставено в git forcepull git ( git forcepull ):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Или в файла .gitconfig :

 [alias] forcepull = "!git fetch ; git reset --hard @{u}" 

Наслаждавайте се!

19
25 февр. отговорът е даден от JacobEvelyn на 25 февруари. 2014-02-25 20:19 '14 в 20:19 2014-02-25 20:19

Имах същия проблем и по някаква причина дори git clean -f -d нямаше да направи това. Ето защо: По някаква причина, ако файлът ви се игнорира от Git (чрез въвеждане на .gitignore, предполагам), той все още се тревожи за презаписването му и след това за прекъсването му, но мрежата няма да го изтрие, освен ако не добавите -x .

19
03 авг. Отговор Tierlieb 03 авг. 2011-08-03 12:23 '11 в 12:23 2011-08-03 12:23

Аз реших сам:

18
03 дек. отговор, даден от Саймън Б. 03 декември. 2010-12-03 18:00 '10 в 18:00 часа 2010-12-03 18:00 часа

Имам странна ситуация, че нито git clean нито git reset работа. Трябва да премахна конфликтния файл от git index като използвам следния скрипт за всеки непроверен файл:

 git rm [file] 

Тогава мога да се справя добре.

17
19 сент. Отговор, даден от Чен Джан на 19 септември 2011-09-19 17:18 '11 в 17:18 2011-09-19 17:18

Знам много по-прост и по-малко болезнен метод:

 $ git branch -m [branch_to_force_pull] tmp $ git fetch $ git checkout [branch_to_force_pull] $ git branch -D tmp 

Това е!

16
05 сент. отговорът се дава ddmytrenko 05 sep . 2015-09-05 21:23 '15 в 21:23 2015-09-05 21:23

Тези четири екипа работят за мен.

 git reset --hard HEAD git checkout origin/master git branch -D master git checkout -b master 

За да проверите / извадите след изпълнение на тези команди

 git pull origin master 

Опитах много, но накрая постигнах успех в тези отбори.

13
20 марта '14 в 7:24 2014-03-20 07:24 отговорът е даден от vishesh chandra 20 март '14 в 7:24 2014-03-20 07:24

Въпреки първоначалния въпрос, най-отговорите могат да създадат проблеми за хора, които имат подобен проблем, но не искат да загубят своите локални файлове. Например вж. Коментарите на Al-Punk и crizCraig.

Следващата версия поправя локалните ви промени във времевия клон ( tmp ), проверява изходния клон (който, предполагам, е master ) и обединява актуализациите. Можете да направите това с stash , но намерих, че обикновено е по-лесно да използвам подхода за разклонение / сливане.

 git checkout -b tmp git add *; git commit -am "my temporary files" git checkout master git fetch origin master git merge -s recursive -X theirs origin master 

където приемаме, че друго хранилище е origin master .

12
22 окт. отговор, даден на Snowcrash 22 октомври 2014-10-22 20:31 '14 в 20:31 2014-10-22 20:31

Просто го направи

 git fetch origin branchname git checkout -f origin/branchname // This will overwrite ONLY new included files git checkout branchname git merge origin/branchname 

По този начин ще избегнете всички нежелани странични ефекти, като изтриване на файлове или директории, които искате да запазите, и т.н.

12
19 окт. отговор, даден от user2696128 19 октомври 2015-10-19 12:54 '15 в 12:54 2015-10-19 12:54

Нулиране на показалеца и главата към origin/master , но не и нулиране на работното дърво

 git reset origin/master 
11
15 февр. Отговорът е даден от потребителя811773 на 15 февруари. 2013-02-15 16:41 '13 в 16:41 2013-02-15 16:41

изисквания:

  • Проследявайте местните промени, така че никой не ги губи.
  • Направете местното хранилище съвместимо с хранилището за отдалечен източник.

решение:

  • Скриване на местни промени.
  • Вземи с чисти файлове и пренебрегване .gitignore и хардуерно нулиране към началния код .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. отговори даде везенков 02 сеп 2015-09-02 02:00 '15 в 2:00 часа 2015-09-02 02:00 часа

Прочетох всички отговори, но търсех една команда за това. Така направих. Добавен е псевдоним git към .gitconfig

 [alias] fp = "!f(){ git fetch ${1} ${2}  git reset --hard ${1}/${2};};f" 

Изпълнете командата

 git fp origin master 

е еквивалентно на

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 Отговорът е даден от Venkat Kotra 08 юли в 16:11 ч. 2016-07-08 16:11
  • 1
  • 2