it-roy-ru.com

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

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

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

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

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

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

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

207
CQM

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

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

git add * 
git stash
git pull

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

356
userFog

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

мерзавец 2.11 и новее

git clean  -d  -f .

старый мерзавец

git clean  -d  -f ""

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

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

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

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

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

73
silentBeep

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

git fetch --all
git reset --hard Origin/{{your branch name}}
56
Asaf Manassen

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

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

18
mnagel

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

git clean -df
16
Amr Mohammed

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

git clean  -d  -fx .
15
Abhishek Goel

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

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

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

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

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

6
MMM

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

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

Решение

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

6
matt

git merge -f не существует, но git checkout -f существует. В приведенном ниже примере FOI означает "представляющие интерес файлы": файлы, которые существуют в ветви-доноре, не существуют в ветви-получателе и блокируют слияние, поскольку они присутствуют и не отслеживаются в вашем рабочем каталоге. Это шаги, чтобы удалить эти файлы, представляющие интерес, чтобы ваше слияние прошло нормально.

# FOI is the 'files of interest', the untracked files blocking the merge.

# 1. This forcibly replaces untracked FOI with tracked versions of
# the donor branch (as well as updating the rest of the working dir).
git checkout -f donor-branch

# 2. This removes the FOI because they they are tracked in our current
# (donor) branch, and absent in the `receiving-branch` we switch to.
git checkout receiving-branch

# 3. Now that the FOI are absent, merging in the donor branch will not
# overwrite any untracked files, so we get no errors.
git merge donor-branch

В своем вопросе вы спрашиваете: "Как бы я изменил мою команду pull для перезаписи этих файлов"?

Pull - это не что иное, как git fetch (получение удаленной истории) + автоматическое слияние ветки upstream. Таким образом, вы изменили бы свою команду извлечения так, чтобы она стала (а) получать удаленную историю, (б) использовать трюк check -f для перезаписи файлов, (в) объединить удаленную историю. Шаги будут выглядеть следующим образом:

git fetch Origin
git checkout -f Origin/mybranch
git checkout mybranch
git merge Origin/mybranch
5
Esteis

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

git add -A
git stash
git pull

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

1
A H M Forhadul Islam