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



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



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



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



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




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




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

1248   10  

10 ответов:

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

попробуй

git add * 
git stash
git pull

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

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

git 2.11 и новее

git clean  -d  -f .

старше ГИТ

git clean  -d  -f ""

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

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

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

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

здесь ссылке это тоже может быть полезно.

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

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

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

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

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

git clean -df

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

git clean  -d  -fx .

Если вы рассматриваете использование -f флаг вы можете сначала запустить его как сухой прогон. Только то, что вы заранее знаете, какую интересную ситуацию вы закончите следующим ; - P

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

в дополнение к принятому ответу вы можете, конечно, удалить файлы, если они больше не нужны, указав файл:

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

Не забудьте сначала запустить его с флагом-n, если вы хотите увидеть, какие файлы git clean удалит. Обратите внимание, что эти файлы будут удалены. В моем случае я не заботился о них в любом случае, так что это было лучшее решение для меня.

git merge -f не выход, но git checkout -f делает.

git checkout -f donor-branch
git checkout receiving-branch
git merge donor-branch

это работает, потому что Вы делаете git force-checkout другой ветви, и тем самым принудительно заменяете неотслеженные файлы их отслеживаемыми версиями. Если вы затем вернетесь в исходную ветвь, отслеживаемые файлы исчезнут, как и в каждой проверке, где файлы не существуют в целевой ветви.

вы упомянули a в вашем ответе. Тянуть-это не что иное, как git fetch (получить удаленную историю) + автоматическое слияние восходящей ветви; если вы предшествуете решению выше с git fetch, и объединить ветку вверх по течению, шаги будут выглядеть следующим образом.

git fetch origin
git checkout -f origin/mybranch
git checkout mybranch
git merge origin/mybranch

как этот ответ отличается от других ответов?

этот метод удаляет только файлы, которые будут перезаписаны путем слияния. Если у вас есть другие неотслеженные (возможно, проигнорированные) файлы в каталоге, этот метод не удалит их.

решение

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

Comments

    Ничего не найдено.