Как мне удалить этот файл из всех веток в git, не удаляя случайно все css файлы из всех веток?
Ответ Омера показывает в одну сторону; вот еще один.
Примечание: вы не удаляете файл из веток . Вы делаете новых коммитов, в которых отсутствует файл , который каждый новый коммит делает в определенной ветке. Это важное различие, потому что существующие коммиты продолжают существовать и сохранять файл. Ни один существующий коммит не может быть изменен! Вы просто останавливаете , используя эти коммиты. Но пока у вас все еще есть эти более ранние коммиты, любая попытка извлечь один из них на Windows вызовет у вас такую же изжогу. 1
Чтобы совершить новый коммит на ветка, мы (конечно) будем использовать git commit
как обычно. Чтобы получить в определенной ветке, мы будем использовать git checkout
или git switch
как обычно. Как и в ответе Омера, важно убедиться, что вы начинаете с чистой установки, хотя я не буду показывать здесь какой-либо конкретный метод, гарантирующий это.
Учитывая список ветвей, в которых есть файл, чей name буквально *.css
, теперь нам нужен al oop, написанный на любом языке сценариев, который вы предпочитаете. Поскольку Git включает sh (или bash), и это хороший мощный язык сценариев, я бы здесь использовал именно его:
for name in br1 br2 br3 master; do
git checkout $name &&
git rm -f -- ":(literal)*.css" &&
git commit -m "remove file named *.css" ||
echo "failed to update branch $name"
done
Префикс :(literal)
является частью pathspe c и предотвращает расширение git rm
*.css
для соответствия всем файлам .css
. Это задокументировано в gitglossary , хотя и довольно хорошо скрыто. (Флаг -f
здесь разрешает git rm
даже на Windows, хотя на Windows шаг git checkout
, вероятно, завершится ошибкой, поэтому вам придется изменить цепочку &&
. Если вы делаете это на в системе Linux, вам здесь не нужен флаг -f
.)
Вы можете продолжить это с помощью одной git push
из всех рассматриваемых ветвей:
git push origin br1 br2 br3 master
например.
1 Это - это возможность «перезаписать историю» в репозитории Git, чтобы не просто остановить использование фиксации, но и прекратить сохранение это вообще в репозитории. Обратной стороной этого является то, что каждый последующий номер фиксации (ha sh -ID) также изменяется, так что новый репозиторий никогда не может быть смешан с исходным репозиторием: если он смешан вместе, все старые коммиты возвращаются. Иногда это стоит усилий, но не так уж часто. Количество проблем зависит от количества и важности копий репозитория, которые существуют и имеют исходные коммиты, предварительно перезаписанные.