Як змусити "git pull" перезаписати локальні файли?


7179

Як змусити перезаписати локальні файли на a git pull?

Сценарій такий:

  • Член команди змінює шаблони веб-сайту, над яким ми працюємо
  • Вони додають деякі зображення до каталогу зображень (але забувають додати їх під контролем джерела)
  • Пізніше вони надсилають зображення поштою
  • Я додаю зображення під керування джерелом і підштовхую їх до GitHub разом з іншими змінами
  • Вони не можуть витягувати оновлення з GitHub, оскільки Git не хоче перезаписувати свої файли.

Це помилка, яку я отримую:

Помилка: Файл "public / images / icon.gif" не відстежуваного робочого дерева буде замінено об'єднанням

Як змусити Git перезаписати їх? Людина є дизайнером - зазвичай я вирішую всі конфлікти вручну, тому сервер має найновішу версію, яку їм просто потрібно оновити на своєму комп’ютері.


17
той, хто читає це, хто думає, що може втратити файли, я опинився в такому положенні і виявив, що буфер Sublime Text врятував мене - якщо я працюю над чимось, то випадково видаляю все, намагаючись вирішити подібну проблему до цього або використовуючи відповідь на це запитання та чи відкрили вони файли в Sublime (на що є велика шанс), то файли все ще будуть там Sublime, або просто там, або в історії скасування
Toni Leigh

61
git reset --hard origin/branch_to_overwrite
Ендрю Аткінсон

1
в основному, тільки тягнути з розробки тільки після початкової каси -b. зробіть свою роботу, потім натисніть назад.
ldgorman

1
Коротка відповідь: видалити та відтворити гілку. 1. Видалити гілку: git branch <branch> -D2. Скинути комісію до конфлікту: git reset <commit> --hard3. Заново створити гілку: git branch <branch>4. Встановити відстеження до сервера: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`
Nino Filiu

1
Щоб змінити всі CRLF на закінчення LF, (почніть чисто)git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Хлоя,

Відповіді:


10029

Важливо: Якщо у вас є якісь локальні зміни, вони будуть втрачені. З --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

14
Стережись! Якщо у вас є місцеві незахищені комісії, це видалить їх із вашої філії! Це рішення зберігає непошкоджені файли не в сховищі недоторканими, але перезаписує все інше.
Matthijs P

479
Це популярне питання, тому я хотів би уточнити тут головний коментар. Я щойно виконував команди, як описано в цій відповіді, і він не видалив ВСІ локальні файли. Були перезаписані лише віддалено відслідковані файли, і кожен локальний файл, який був тут, залишився недоторканим.
Червоний

14
у випадку, якщо ви тягнете з репо, у якого назва його віддаленої гілки відрізняється від "майстра", використовуйтеgit reset --hard origin/branch-name
Nerrve

97
Враховуючи кількість нагород на це питання та відповідь, я думаю, що git має містити таку команду, якgit pull -f
Sophivorus

7
Коміти, які не були натиснуті перед жорстким скиданням, можна відновити за допомогою git reflogсписку всіх комітетів, також тих, що не мають основи. Поки ви не очистите локальну копію за допомогою git gc, тоді все втрачено
Koen.

933

Спробуйте це:

git reset --hard HEAD
git pull

Він повинен робити те, що ти хочеш.


16
Я зробив це, і деякі локальні файли, які вже не були в репо, залишилися на диску.
Пьотр Овсяк

26
Я не вважаю, що це правильно. вище буде виконано злиття, а не перезапис, про що вимагали у запитанні: "Як змусити git перезаписати їх?" У мене немає відповіді, я зараз її шукаю .. в даний момент я переходжу до гілки з кодом, який я хочу зберегти "git checkout BranchWithCodeToKeep", потім зробіть "git branch -D BranchToOverwrite", а потім нарешті "git checkout -b BranchToOverwrite". тепер у вас буде точний код від BranchWithCodeToKeep на гілці BranchToOverwrite без необхідності виконувати злиття.
фельбус

252
замість злиття за допомогою 'git pull', спробуйте git fetch --all, а потім 'git reset --hard origin / master'
Ллойд Мур,

5
так, рішення @lloydmoore працювало на мене. Це може бути як відповідь, а не просто коментар.
Макс Вільямс

2
Це скине поточні зміни назад до останньої витягнутої філії. Потім git pull об'єднує зміни з останньої гілки. Це робилося саме те, що я хотів це зробити .. Дякую!
Зашифрований

459

ПОПЕРЕДЖЕННЯ: git cleanвидаляє всі ваші непотрібні файли / каталоги і їх не можна скасувати.


Іноді просто clean -fне допомагає. У випадку, якщо у вас немає відібраних ДИРЕКТОРІЙ, також потрібен варіант -d:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

ПОПЕРЕДЖЕННЯ: git cleanвидаляє всі ваші непотрібні файли / каталоги і їх не можна скасувати.

Спершу подумайте про використання прапора -n( --dry-run). Це покаже, що буде видалено, фактично нічого не видаляючи:

git clean -n -f -d

Приклад виводу:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

33
Дивовижно ... Постав це проти моїх точкових файлів репо ... У моєму домашньому довіднику. Добре, що я там не мав нічого важливого ...
Lauri

7
Я думаю, що опис сценарію дає зрозуміти, що він не дуже хоче викидати контент. Швидше, що він хоче - це припинити git bauling при перезаписі файлів. @Lauri, цього з тобою не мало статися. На жаль, люди, здається, неправильно прочитали суть опису сценарію - дивіться мою пропозицію.
Їжак

19
ОКОНЧНО . git clean -f -d зручно, коли робити чисті не вдається очистити все.
земляLon

7
@crizCraig, якщо вони не додані в.gitignore
Кровотечі пальці

5
@earthmeLon, чого ви можете захотіти git clean -dfx. У -xігнорованих .gitignore. Зазвичай ваші вироби для збирання будуть в .gitignore.
Пол Дрейпер

384

Як і Їжак, я думаю, що відповіді жахливі. Але хоч відповідь Їжака може бути кращою, я не думаю, що це настільки елегантно, як могло б бути. Я знайшов це зробити, використовуючи "отримання" та "злиття" із визначеною стратегією. Що повинно зробити так, щоб ваші локальні зміни зберігалися до тих пір, поки вони не є одним із файлів, з якими ви намагаєтесь змусити перезаписати.

Спочатку виконайте свої зміни

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

Потім виберіть зміни та перезапишіть, якщо є конфлікт

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

"-X" - це назва опції, а "njihovo" - значення для цього параметра. Ви вирішили використовувати "їх" зміни, а не "ваші" зміни, якщо є конфлікт.


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

5
Ditto - це спрацювало для мене, коли я робив дуже велике злиття (GitHub pull request), де я просто хотів прийняти все це понад усе, що у мене було. Хороша відповідь! У моєму випадку останніми двома командами були: 1) get fetch other-repo; 2)git merge -s recursive -X theirs other-repo/master
quux00

2
Це замінить будь-які конфлікти з файлами сховищ, а не з вашими локальними, правда?
Натан Ф.

2
Найкраща відповідь. Найвища прийнята відповідь залишила мене в моєму випадку на відірваній голові. Я повернувся до місцевого головного відділення і побігgit merge -X theirs origin/master
петергус

2
Проблема з цією (відмінною) відповіддю полягає в тому, що вона додає всі локальні файли, які іноді можуть бути не такими, якими ви хочете. Ви можете просто додати конкретні файли, які були пропущені. Але найкраще в цьому - це змушує його робити те, що повинен був зробити - додавати їх на місцевому рівні. Можливо, вам не знадобиться стратегія -X їх, оскільки вони однакові. Насправді, я б запропонував спочатку його відключити, лише щоб з'ясувати, чи є аномалії, і додав це, якщо вони є, після того, як переглянув, що "їх" завжди є правильним вибором. Але потім я параноїк.
Боб Кернс

279

Замість того, щоб робити:

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

Я б радив зробити наступне:

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

Немає необхідності отримувати всі віддалені та гілки, якщо ви збираєтеся скинутись на початкову / головну гілку?


3
Ваша відповідь - це саме те, що вам потрібно для вашого представника. Потрібно запитати, чи це також видаляє всі незафіксовані файли?
Ніколя Де Джей

5
Так, більша частина мого представника надходить звідси :) Це також видалить усі незафіксовані файли. Щось я забув і про що болісно нагадували лише 2 дні тому ...
Йоганнеке

1
Дивіться коментарі до цього іншому відповіді: stackoverflow.com/a/8888015/2151700
Johanneke

Це не видалило мої неагрековані файли; що насправді я очікував. Чи є причина, що це може бути для деяких людей, а не для інших?
arichards

Невизначені файли не впливають на скидання git. Якщо ви хочете, щоб їх також видалили, зробіть git add .спочатку до цьогоgit reset --hard
Йоганнеке

131

Схоже, найкраще спочатку зробити:

git clean

Щоб видалити всі незаймані файли, а потім продовжити звичайне git pull...


4
Я намагався використовувати "git clean" для вирішення тієї ж проблеми, але це не вирішило. git status повідомляє: "Ваша філія та" origin / master "розійшлися, # та мають 2 та 9 різних фіксацій відповідно)." і git pull говорить щось подібне до того, що у вас є вище.
шило

43
git clean є досить тупим інструментом, і він може викинути багато речей, які ви, можливо, захочете зберегти. Краще видалити або перейменувати файли, на які скаржиться git, поки витяг не вдається.
Ніл Мейхью

2
Я не думаю, що це взагалі працює. Хіба немає способу зробити віддалений клон git за допомогою примусового витягування git?
mathtick

10
@mathick:git fetch origin && git reset --hard origin/master
Arrowmaster

3
Тут git cleanнайкраща відповідь? Здається, видалення файлів не обов’язково те, що хоче ОП. Вони попросили "перезапис локальних файлів" не видалити.
ДжонАллен

111

Попередження, якщо це буде назавжди видалено ваші файли, якщо у вашому файлі gitignore у вас є якісь записи каталогу / *.

Деякі відповіді здаються жахливими. Жахливий у сенсі того, що сталося з @Lauri, виконуючи пропозицію Девіда Авсаянішвілі.

Швидше (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}

2
Ні, я не думаю, що так. Stashing просто відсуває невідомі файли з шляху. Вищезгадане також переміщує (приховує) файли, які git не відстежує. Це запобігає видаленню файлів, доданих до віддаленого пристрою, які ще не витягнуті на вашу машину, але які ви створили (!). Все, не руйнуючи незайнятого твору. Сподіваюся, що це має сенс?
Їжак

3
Якщо у вас немає 1.7.6, ви можете імітувати --include-untrackedїх, тимчасово git addзробивши весь репо, а потім негайно приховавши його.
nategood

3
Я згоден з Їжаком. Якщо ви робите тут популярні відповіді, ви, швидше за все, виявите, що ви ненавмисно вбили багато речей, які ви насправді не хотіли втратити.
Guardius

1
У мене були й інші відслідковувані файли - окрім того, що злиття / потяг хотів перезаписати, тому це рішення працювало найкраще. git stash applyповернув усі мої неагрековані файли за винятком (справедливо) тих, які вже було створено об'єднанням: "вже існує, замовлення немає". Працювали чудово.
BigBlueHat

2
Це найчистіша відповідь, і вона повинна бути прийнятою. Для того, щоб зберегти деякі набравши ви можете використовувати скорочену форму: git stash -u.
ccpizza

93

Ця команда може бути корисною для викидання локальних змін:

git checkout <your-branch> -f

А потім зробіть очищення (видаляє незатребувані файли з робочого дерева):

git clean -f

Якщо ви хочете видалити незатрековані каталоги на додаток до файлів, що не відслідковуються:

git clean -fd

Я думаю, що опис сценарію дає зрозуміти, що він не дуже хоче викидати контент. Швидше, що він хоче - це припинити git bauling при перезаписі файлів. Дивіться мою пропозицію.
Їжак

3
Хоча ця відповідь може не відповідати точно опису, вона все ж врятувала мене від розчарування git twiddling з поверненням каретки (подія з autocrlf false). Коли скидання git - Hard HEAD не залишає вас з модифікованими файлами "без", ці "-f" прапори є дуже корисними. Дякую купу.
Келлінділ

88

Замість того, щоб зливатися git pull, спробуйте:

git fetch --all

далі:

git reset --hard origin/master.


61

Єдине, що для мене працювало:

git reset --hard HEAD~5

Це поверне вам п’ять комітетів і потім з

git pull

Я виявив, що, шукаючи, як скасувати об'єднання Git .


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

Привіт, насправді це трюк для, work aroundале дійсно ефективного. Оскільки деякі конфлікти можуть статися лише в декількох комітах, тоді повернення 5 коміттів не забезпечить конфліктів із віддаленим кодом.
Hoang Le

54

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

Ось найчистіше рішення, яке ми використовуємо:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Перша команда отримує новітні дані.

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

  • Третя команда перевіряє всі файли, які були локально модифіковані.

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


Використання "git merge origin / master" як останнього рядка (як ви говорите у своїй примітці) замість "git pull" буде швидше, оскільки ви вже зняли будь-які зміни з git repo.
Джош

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

Якщо у вас локально створені файли, наприклад файли опцій, введіть їх .gitignore.
Себі

52

Перш за все, спробуйте стандартним способом:

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 (excempt .git/dir, де у вас є всі коміти) та знову витягніть їх.


Чому git reset HEAD --hardв деяких випадках може статися збій?

  1. Спеціальні правила в .gitattributes file

    Маючи eol=lf владу в .gitattributes може привести до мерзотник , щоб змінити деякі зміни файлів шляхом перетворення CRLF завершень рядків в LF в деяких текстових файлах.

    Якщо це так, ви повинні здійснити ці зміни CRLF / LF (переглянувши їх у git status) або спробувати: git config core.autcrlf falseтимчасово їх ігнорувати.

  2. Незмінність файлової системи

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

    Як ви зауважуєте, існує два різних файлових системи, тому одна, яка не підтримує дозволи Unix, в основному не може скинути дозволи файлів у системі, яка не підтримує такі дозволи, тому незалежно від того, як --hardви намагаєтеся, git завжди виявляйте якісь "зміни".


47

У мене була така ж проблема. Ніхто мені не давав цього рішення, але воно працювало на мене.

Я вирішив це:

  1. Видаліть усі файли. Залиште лише .gitкаталог.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Зараз це працює.


1
Те ж саме. Іноді працює лише дуже важке рішення, часто трапляється, що тільки скидання та очищення недостатньо якось ...
jdehaan

41

Бонус:

Говорячи про тягнення / отримання / злиття в попередніх відповідях, я хотів би поділитися цікавим і продуктивним трюком,

git pull --rebase

Ця вище команда - найкорисніша команда в моєму житті Git, яка зекономила багато часу.

Перед тим, як натиснути ваш щойно приєднаний сервер, спробуйте цю команду, і вона автоматично синхронізує останні зміни на сервері (з вилученням і злиттям) і помістить ваш комітет вгорі в журналі Git. Не потрібно турбуватися про ручне потягування / злиття.

Дізнайтеся деталі в тому, що робить "git pull --rebase"? .


3
Коротше кажучи git pull -r.
kenorb

29

У мене була схожа проблема. Мені довелося це зробити:

git reset --hard HEAD
git clean -f
git pull

6
використовуйте git cleanз обережністю
nategood

29

Я узагальнив інші відповіді. Ви можете виконати git pullбез помилок:

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

Попередження : Цей сценарій дуже потужний, тому ви можете втратити свої зміни.


2
Це перезаписать модифіковані файли (файли, які раніше були зареєстровані), і видалить незавершені файли (файли, які ніколи не були зареєстровані). Саме те, що я шукав, дякую!
стиле

3
Я підозрюю, що третій рядок git reset --hard HEADможе бути зайвим; на моїй сторінці місцевої людини (2.6.3) сказано, що resetу другому рядку git reset --hard origin/master "за замовчуванням до HEAD у всіх формах".
arichards

2
@arichards Я думаю, що ваш підозрюваний має рацію, але якщо другий рядок не буде працювати (з будь-якої причини) третій рядок буде добре працювати, щоб скинути. Це рішення не потребує оптимізації. Я просто узагальнив інші відповіді. Це все. Дякую за Ваш коментар :)
Роберт Мун

28

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

Маючи на увазі, я оновив сценарій Кустудіка, щоб зробити саме це. Я також виправив друкарську помилку (відсутній 'в оригіналі).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

Використання "git merge origin / master" як останнього рядка (як ви говорите у своїй примітці) замість "git pull" буде швидше, оскільки ви вже зняли будь-які зміни з git repo.
Джош

Оформлення модифікованих файлів потрібне, тому це працює 100% разів. Я давно оновив свій сценарій, але забув оновити і тут. Я також використовую його трохи інакше, ніж ви. Я перевіряю файли, які мають будь-який тип модифікації, а не лише M, тому він працює весь час.
Страхіня Кустудич

24

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

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

  • Місцеві комісії, які не знаходяться на віддаленій гілці, також потрібно видалити. IMO найпростіший спосіб досягти цього: git reset --hard origin/master(замініть "master" на будь-яку галузь, над якою ви працюєте, та запустіть git fetch originпершу)


22

Простішим способом було б:

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

Це замінить ваш локальний файл із файлом на git


21

Схоже, більшість відповідей тут зосереджені на masterгалузі; однак, бувають випадки, коли я працюю над однією і тією ж гілкою функцій у двох різних місцях, і мені хочеться, щоб ребаз в одному відобразився в іншому без великого перестрибування обручів.

На основі поєднання відповіді РНКА і відповідь Торека до подібного питання , я придумав це , який працює відмінно:

git fetch
git reset --hard @{u}

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

Це також можна вписати в git псевдонім ( git forcepull):

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

Або у вашому .gitconfigфайлі:

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

Насолоджуйтесь!


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

19

У мене була така ж проблема, і чомусь навіть це git clean -f -dне зробило б. Ось чому: З якоїсь причини, якщо ваш файл ігнорується Git (через запис .gitignore, я вважаю), він все ще турбується про те, щоб перезаписати це з наступним витягненням , але чистий не видалить його, якщо ви не додасте -x.


19

Я знаю набагато простіший і менш болісний метод:

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

Це воно!


18

Я просто вирішив це самостійно:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

де остання команда дає список того, якими були ваші локальні зміни. Продовжуйте змінювати гілку "tmp" до тих пір, поки вона не стане прийнятною, а потім з’єднайтеся назад на головний з:

git checkout master && git merge tmp

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


17

У мене дивна ситуація , що ні git cleanабо git resetроботи. Мені потрібно видалити конфліктуючий файл git index, використовуючи наступний скрипт у кожному нерозробленому файлі:

git rm [file]

Тоді я вмію тягнути просто чудово.



14

Незважаючи на оригінальне запитання, головні відповіді можуть викликати проблеми у людей, які мають подібну проблему, але не хочуть втрачати свої локальні файли. Наприклад, дивіться коментарі 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.


13

Ці чотири команди працюють на мене.

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

Щоб перевірити / потягнути після виконання цих команд

git pull origin master

Я багато пробував, але нарешті мав успіх у цих командах.


2
"git branch -D master" видалити гілку. тому будьте обережні з цим. Я вважаю за краще використовувати "git checkout origin / master -b <нова назва філії>", яка створює нову гілку з новою назвою, і вам потрібно 3,4 рядка. Також рекомендується використовувати "git clean -f".
Чанд Приянкара

13

Просто роби

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

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


12

Скиньте індекс та голову на origin/master, але не скидайте робоче дерево:

git reset origin/master

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

12

Вимоги:

  1. Відслідковуйте локальні зміни, щоб ніхто їх ніколи не втрачав.
  2. Зробіть так, щоб локальне сховище відповідало віддаленому сховищу.

Рішення:

  1. Приховуйте локальні зміни.
  2. Принесіть з чистим з файлів і каталогів , які ігнорують .gitignore і жорсткий скидання до походженням .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.