Как удалить необработанные файлы в Git?

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

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

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

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

Кто-нибудь прольет мне свет?

Ответ 1

Чтобы удалить ненужные файлы/каталоги, выполните следующие действия:

git clean -fdx

-f - force

-d - каталоги тоже

-x - удалить игнорированные файлы (не используйте это, если вы не хотите удалять игнорируемые файлы)

Ответ 2

Это незатребованные файлы. Это означает, что git не отслеживает их. Он перечисляет их только потому, что они не находятся в файле git ignore. Поскольку они не отслеживаются git, git reset не будут касаться их.

Если вы хотите сбить все необработанные файлы, самый простой способ - git clean -f (вместо этого использовать git clean -n, если вы хотите увидеть, что он уничтожит, даже не удалив ничего). В противном случае вы можете просто удалить файлы, которые вам не нужны вручную.

Ответ 3

Пользовательский интерактивный подход:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i для интерактивных
-f для силы
-d для каталога
-x для игнорируемых файлов (добавьте, если требуется)

Примечание: Добавить -n или - сухим, чтобы просто проверить, что он будет делать.

Ответ 4

Команда для вашего спасения - git clean.

Ответ 5

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

git clean -f

Для удаления неотслеживаемых каталогов также используйте:

git clean -f -d

Для предотвращения остановки сердца используйте

git clean -n -f -d

Ответ 6

Ну, у меня была похожая проблема. Я взял последний, но в локальном хранилище произошли некоторые изменения, из-за которых не произошло слияние с конкретным файлом. Файл не был отслежен, и я не хотел их так, что я сделал -

$ git checkout filepath/filename

filepath - место, откуда я делал git bash. тогда, когда я взял последний изменения были доступны

Ответ 7

Вы также можете вернуться к предыдущему состоянию локального репо другим способом:

  1. Добавьте неотслеживаемые файлы в область подготовки с помощью git add.
  2. вернуться в предыдущее состояние локального репо с git reset --hard.

Ответ 8

Хотя git clean работает хорошо, я все же считаю полезным использовать мой собственный скрипт для очистки git-репо, но у него есть некоторые преимущества.

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

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


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi