Наступні незафіксовані файли робочого дерева будуть перезаписані злиттям, але мені все одно


344

На моєму відділенні у мене було кілька файлів у .gitignore

В іншому відділенні цих файлів немає.

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

На жаль, я отримую це:

Наступні незафіксовані файли робочого дерева будуть перезаписані об'єднанням

Як я можу змінити команду pull, щоб перезаписати ці файли, без того, щоб я сам знаходив, переміщував або видаляв ці файли?





1
Це найкраща відповідь , як це буде тільки видалити файли, які блокують вас від злиття: stackoverflow.com/a/52255219/551045
RedX

Відповіді:


538

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

Спробуйте запустити

git add * 
git stash
git pull

Це дозволить відстежити всі файли, видалити всі ваші локальні зміни до цих файлів, а потім отримати файли з сервера.


59
git add -A .; git stashпрацював на мене. git add *Варіант скаржився ігнорованих шляхів.
imsky

11
Я спробував git add., Git stash, git pull. Це спрацювало, але я все одно не отримую чому?
ARK

1
Для мене був віддалений файл, який відслідковувався, і в моєму місцевому репо-файлі був однойменний файл, який не було відстежено. Отже, якщо ви додасте в локальний файл сховання змін, а потім витягніть, віддалений файл повинен перезаписати локальний файл.
userFog

2
Ось хороше посилання, щоб зрозуміти, як це працює, якщо когось цікавить. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//, насправді це не надто далеко в цілі цієї помилки.
Натан Басанес

137

Ви можете спробувати команду, щоб очистити незавершені файли з локального

Git 2.11 та новіші версії:

git clean  -d  -f .

Старіші версії Git:

git clean  -d  -f ""

Де -dможна замінити наступне:

  • -x ігноровані файли також видаляються, а також невідомі Git файли.

  • -d видалити не відстежувані каталоги на додаток до нетренованих файлів.

  • -f потрібно змусити його працювати.

Ось посилання, яке також може бути корисним.


23
Я б додав -iдля інтерактивного режиму. Окрім видалення непотрібного каталогу, я також просто видалив мої налаштування користувача для проекту :-(
dumbledad

6
Варто переглядати коментарі до подібної відповіді, оскільки це -xможе нашкодити.
dumbledad

10
Але це дуже небезпечне, і не незмінне завдання !! ви можете втратити багато файлів! БУДЬ ОБЕРЕЖНИЙ!!
Мохамед Кавсара

16
Це видалило весь мій каталог постачальників на Slim Framework . Будьте ДУЖЕ ДЕРЖАВНИМИ З ЦЬОЮ КОМАНДАЮ
RousseauAlexandre

2
Ви повинні видалити "x" зі своєї відповіді. Це дуже небезпечно!
Earl3s

107

Єдиними командами, які працювали на мене, були:

git fetch --all
git reset --hard origin/{{your branch name}}

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

У мене не було підмодулів, і я спробував git clean та git stash, як було запропоновано в інших відповідях, але тільки це допомогло.
kslstn

Після очищення різноманітних підмодулів це було єдине, що працювало і для мене. Окремо зауважив, що у мене виникло питання щодо чутливості до справ. Вих. XML.php до Xml.php в папці мого постачальника від композитора.
KazaJhodo

1
Це працювало і для мене. Чи можете ви поясніть, що відбувається? Я не розумію.
Димитріс Караманіс

1
Це видалено два моїх місцевих зобов’язання, будьте уважні, перш ніж використовувати це!
Девід Сіан

27

Заміна на git mergeце замінить незатребувані файли

У коментарях нижче використовується "FOI" для "файлів, що цікавлять", файли, які

  • існують у донорській галузі,
  • не існують у приймальній гілці,
  • і блокують злиття, оскільки вони присутні і не відслідковуються у вашому робочому каталозі.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Заміна на git pullце замінить незатребувані файли

pull = fetch + merge, Так що ми з git fetchнаступним git checkout -f, git checkout, git mergeтрюком вище.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Детальне пояснення

git merge -fне існує, але є git checkout -f.

Ми будемо використовувати git checkout -f+ git checkoutдля видалення файлів, що цікавлять (див. Вище), і тоді ваше злиття може продовжуватися нормально.

Крок 1. Цей крок примусово замінює відслідковуваний FOI відслідковуваними версіями донорської гілки (він також перевіряє гілку донора та оновлює решту робочого режиму).

git checkout -f donor-branch

Крок 2. Цей крок видаляє FOI, оскільки вони відслідковуються в нашій поточній (донорській) гілці та відсутні в receiving-branchпереході до якого ми переходимо.

git checkout receiving-branch

Крок 3. Тепер, коли FOI відсутній, злиття у донорській гілці не перезапише жодних нераспечатанных файлів, тому ми не отримаємо помилок.

git merge donor-branch

3
Це занадто чисто, щоб бути 7-м чи 8-м відповіддю!
Majed DH

1
Дякую, @MajedDH, ти зробив мій день! <3
Естея

1
Саме тут була інстафікс, який я шукав! Спасибі
AFM-Horizon

Радий, що допомогли вам, @ AFM-Horizon!
Естея

20

Видаліть усі незафіксовані файли:

git clean  -d  -fx .

8
видалення можливо використаних файлів у проекті не повинно бути справжнім рішенням
Erdinç Çorbacı

4
дає, також очистив файли IDE :(
kisna

18

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

Не забудьте випадково видалити незавершений файл, який вам все-таки потрібен;)


15

Ви можете спробувати цю команду

git clean -df

5
в чому користь видалення каталогів, що не відслідковуються? .. вони можуть бути цінними, ви знаєте.
zhekaus

Чи можете ви пояснити, що це робить ??
Сафак Озкан

12

Оновлення - краща версія

Цей інструмент ( https://github.com/mklepaczewski/git-clean-before-merge ):

  • видалити незатрековані файли, що відповідають їхнім git pullеквівалентам,
  • повернути зміни до модифікованих файлів, модифікована версія яких ідентична їхнім git pullеквівалентам,
  • повідомляти про модифіковані / відслідковувані файли, що відрізняються від своїх git pull версії,
  • інструмент має --pretendможливість не змінювати жодні файли.

Стара версія

Чим ця відповідь відрізняється від інших відповідей?

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

Рішення

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

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

а потім просто зробіть:

git pull

Це не порцелянова команда git, тому завжди двічі перевіряйте, що вона буде робити з:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Пояснення - адже один лайнер страшно:

Ось розбивка того, що це робить:

  1. git pull 2>&1- захопити git pullвихід і перенаправити все на stdout, щоб ми могли легко його захопити grep.
  2. grep -E '^\s- намір полягає в захопленні списку файлів, що не відслідковуються, які будуть перезаписані git pull. У назви файлів є перед собою купа символів пробілів, тому ми використовуємо це, щоб отримати їх.
  3. cut -f2- - видаліть пробіл з початку кожного рядка, захопленого у 2.
  4. xargs -I {} rm -rf "{}"- нам xargsперебрати всі файли, зберегти їх ім’я у "{}" та зателефонувати rmдо кожного з них. Ми використовуємо -rfдля примусового видалення та видалення незатребуваних каталогів.

Було б чудово замінити кроки 1-3 командою з порцеляни, але я не знаю жодного еквівалента.


Дякую, у мене в робочій директорії часто є незапущені файли, які я не хочу видаляти чи вводити. У моєму випадку мені потрібно замінити git pullзgit checkout <branch_name>
mihow

6

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

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

На додаток до прийнятої відповіді, звичайно, ви можете видалити файли, якщо вони більше не потрібні, вказавши файл:

git clean -f '/path/to/file/'

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


5

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

git add -A
git stash
git pull

Ви можете перевірити свої локальні сховані файли за допомогою цієї команди - git stash list


4

Для тих, хто не знає, git ігнорує великі / маленькі відмінності у файлах та папках. Це виявляється кошмаром, коли ви перейменовуєте їх на точно те саме ім’я з іншим випадком.

З цією проблемою я зіткнувся, коли перейменував папку з "Petstore" на "petstore" (великі регістри до малих регістрів). Я відредагував свій .git / config файл, щоб перестати ігнорувати регістр, вніс зміни, скасував свої комітети та приховав зміни, щоб перейти до іншої гілки. Я не зміг застосувати свої сховані зміни до цієї іншої галузі.

Виправлення, яке я виявив, що працювало, було тимчасово редагувати мій .git / config файл, щоб тимчасово знову ігнорувати випадок. Це спричинило git stash applyуспіх. Потім я змінив ignoreCase назад на false. Потім я додав усе, окрім нових файлів у папці petstore, на які git як не дивно стверджувалося, було видалено з будь-якої причини. Я здійснив свої зміни, потім побігgit reset --hard HEAD позбутися тих, що не були вилучені, нові файли. Моя комісія виявилася точно так, як очікувалося: файли в папці були перейменовані.

Я сподіваюся, що це допоможе вам уникнути мого ж кошмару.


Не працювало для мене. Я видалив усі файли в папці. Тоді git pull -fтоді git checkout .. Який кошмар.
m.rufca

Дійсно? Мені це спрацювало чудово лише кілька тижнів тому. Ви спробували редагувати файл gitconfig, щоб запустити / зупинити ігнорування випадку, як це доречно?
А. Девідсон

Дякую. Мені потрібно було об'єднатись з головним після закріплення корпусу в шляху папки. Мені вдалося з’єднати його із випадком git ignore case, після чого я знову ввімкнув чутливість справи.
Рубенісме

3

Ані чистий / скинутий / жорсткий замовлення / реставрація у мене не працював.

Тому я просто видалив файли, на які git скаржився *

rm /path/to/files/that/git/complained/about

* Я перевірив, чи можна видалити ці файли, перевіривши абсолютно нове репо в окремій папці (файлів там не було)


1

У моєму випадку, коли у мене була ця проблема. У мене був локальний файл, який я перейменував на пульт.

При спробі git pullGit сказав мені, що нове ім'я файлу не відстежувалося - яке воно було на пульті, хоча воно ще не існувало на локальному рівні.

Оскільки на місцевому рівні не було жодного примірника, я не міг зробити це, git pullдоки я не git rmпознайомився зі старим іменем файлу (що спочатку було не очевидно через мою дурну ідею перейменувати його).


0

Якщо у вас є файли, написані під .gitignore, видаліть файли та запустіть git pull ще раз. Це мені допомогло.


0

Проблема полягає в тому, що у нас є вхідні зміни, які об'єднатимуть незатребуваний файл, Git скаржиться. Ці команди допомогли мені:

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