Следующие неотслеживаемые файлы рабочего дерева будут перезаписаны слиянием, но мне все равно

344

На моей ветке у меня было несколько файлов в .gitignore

В другой ветке этих файлов нет.

Я хочу объединить другую ветку с моей, и мне все равно, если эти файлы больше не игнорируются или нет.

К сожалению, я получаю это:

Следующие неотслеживаемые файлы рабочего дерева будут перезаписаны слиянием

Как бы я изменил свою команду pull, чтобы перезаписать эти файлы, без необходимости самостоятельно искать, перемещать или удалять эти файлы?

НКИ
источник

Ответы:

539

Проблема заключается в том, что вы не отслеживаете файлы локально, а идентичные файлы отслеживаются удаленно, поэтому для «вытягивания» вашей системы придется перезаписывать локальные файлы, которые не контролируются версией.

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

git add * 
git stash
git pull

Это позволит отследить все файлы, удалить все локальные изменения этих файлов, а затем получить файлы с сервера.

userFog
источник
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
Джеймс М. Лэй
2
// На самом деле, это не слишком далеко от цели этой ошибки.
Натан Басанезе
137

Вы можете попробовать команду, чтобы очистить неотслеживаемые файлы от локальных

Git 2.11 и более новые версии:

git clean  -d  -f .

Старые версии Git:

git clean  -d  -f ""

Где -dможно заменить следующим:

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

  • -d удалить неотслеживаемые каталоги в дополнение к неотслеживаемым файлам.

  • -f требуется, чтобы заставить его бежать.

Вот ссылка, которая также может быть полезна.

sKhan
источник
23
Я бы добавил -iдля интерактивного режима. Помимо удаления ненужного каталога, я также просто удалил свои пользовательские настройки для проекта :-(
dumbledad
6
Стоит отсканировать комментарии к похожему ответу, так как это -xможет повредить.
Дамблдад
10
Но это очень опасная и не отменная задача !! Вы можете потерять много файлов! БЫТЬ ОСТОРОЖЕН!!
Мохамед Кавсара
16
Это удалило всех моих поставщиков каталоги на Slim Framework . ОЧЕНЬ CARREFUL С ЭТОЙ КОМАНДЫ
RousseauAlexandre
2
Вы должны удалить «х» из вашего ответа. Это очень опасно!
Earl3s
107

Единственные команды, которые работали для меня, были:

git fetch --all
git reset --hard origin/{{your branch name}}
Асаф Манассен
источник
5
Следует отметить, что этот ответ необходим, если вы удалили подмодули и считали их как библиотеки в исходном репо. Мне нужен был ответ, и это все, что сработало.
Routhinator
У меня не было подмодулей, и я попробовал git clean и git stash, как это предлагалось в других ответах, но только это помогло.
kslstn
После очистки множества подмодулей это было единственное, что работало и для меня. Особо следует отметить, что у меня была проблема с чувствительностью к регистру в файле. Ex. 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. Этот шаг удаляет информацию о свободе информации, потому что они отслеживаются в нашей текущей (донорской) ветке и отсутствуют в той, на которую receiving-branchмы переключаемся.

git checkout receiving-branch

Шаг 3. Теперь, когда FOI отсутствует, слияние в ветке-доноре не перезапишет никакие неотслеживаемые файлы, поэтому мы не получим ошибок.

git merge donor-branch
Esteis
источник
3
Это слишком чисто, чтобы быть 7-м или 8-м ответом!
Маджед DH
1
Спасибо, @MajedDH, вы сделали мой день! <3
Эстейс
1
Это именно то, что я искал! Спасибо
AFM-Horizon
Рад, что помог вам, @ AFM-Horizon!
Esteis
20

Удалить все неотслеживаемые файлы:

git clean  -d  -fx .
Абхишек Гоэль
источник
8
удаление возможно используемых файлов в проекте не должно быть реальным решением
Erdinç Çorbacı
4
yikes, также очистил файлы IDE :(
Кисна
18

Если это одноразовая операция, вы можете просто удалить все неотслеживаемые файлы из рабочего каталога перед выполнением извлечения. Прочтите Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git? для получения информации о том, как удалить все неотслеживаемые файлы.

Обязательно случайно не удалите неотслеживаемый файл, который вам все еще нужен;)

mnagel
источник
15

Вы можете попробовать эту команду

git clean -df
Амр Мухаммед
источник
5
какая польза от удаления неотслеживаемых каталогов? .. они могут быть полезны, вы знаете.
Жекаус
Не могли бы вы объяснить, что он делает?
Сафак Озкан
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 porcelain, поэтому всегда проверяйте, что она будет делать:

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

Объяснение - потому что один лайнер страшен:

Вот разбивка того, что он делает:

  1. git pull 2>&1- захватить git pullвывод и перенаправить все это на стандартный вывод, чтобы мы могли легко захватить его 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. Обратите внимание, что эти файлы будут удалены. В моем случае я все равно не заботился о них, так что это было лучшее решение для меня.

MMM
источник
5

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

git add -A
git stash
git pull

Вы можете проверить свои локальные спрятанные файлы с помощью этой команды - git stash list

AHM Forhadul Ислам
источник
4

Для тех, кто не знает, git игнорирует различия в именах файлов и папок в верхнем и нижнем регистре. Это оказывается кошмаром, когда вы переименовываете их в одно и то же имя с другим регистром.

Я столкнулся с этой проблемой, когда переименовал папку из «Petstore» в «petstore» (от прописной до строчной). Я отредактировал свой файл .git / config, чтобы перестать игнорировать регистр, внес изменения, уничтожил мои коммиты и спрятал свои изменения, чтобы перейти в другую ветку. Я не мог применить свои спрятанные изменения к этой другой ветке.

Исправление, которое я нашел, работало, чтобы временно отредактировать мой файл .git / config, чтобы снова временно игнорировать регистр. Это привело git stash applyк успеху. Затем я изменил ignoreCase обратно на false. Затем я добавил все, кроме новых файлов в папке petstore, которые, как ни странно утверждали, были удалены по какой-либо причине. Я совершил свои изменения, затем побежалgit reset --hard HEAD чтобы избавиться от этих неотслеживаемых новых файлов. Мой коммит выглядел точно так, как ожидалось: файлы в папке были переименованы.

Я надеюсь, что это поможет вам избежать моего самого кошмара.

А. Дэвидсон
источник
Не работал для меня Я удалил все файлы в папке. Тогда git pull -fтогда git checkout .. Какой кошмар.
m.rufca
В самом деле? Это работало хорошо для меня всего несколько недель назад. Вы пытались отредактировать файл gitconfig для запуска / остановки игнорирования регистра в зависимости от ситуации?
А. Дэвидсон
Спасибо. Мне нужно было слить с мастера после исправления оболочки в пути к папке. Я смог объединить его с включенным git ignore case, после чего я снова включил чувствительность к регистру.
Rubenisme
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
Зохан
источник