Ответ 1
Это будет сделано:
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
- Запустите разницу рабочей копии с индексом и дайте машиночитаемое резюме для каждого файла, игнорируя изменения в пробеле.
- Найдите файлы без изменений в соответствии с
diff -b
. - Возьмите их имена.
- Передайте их
git checkout
против кончика ответвления.
Эта труба сделает что-то разумное для каждого оставшегося шага, поэтому вы можете начать с первой строки и добавить больше, чтобы увидеть, что происходит на каждом шаге.
Возможно, полезная альтернатива последней строки:
| git checkout-index --stdin
Это приведет к reset файлам к их поэтапному содержимому, а не к их последнему зафиксированному состоянию.
Вместо этого вы можете использовать git diff HEAD
в первой строке, чтобы получить разницу между рабочей копией и последней фиксацией вместо индекса.
Примечание: если в них есть имена файлов с пробелами, сначала нужно добавить tr
:
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| tr '\n' '\0' \
Затем вы должны добавить переключатель -0
/-z
в любую конечную команду, которую вы хотели использовать:
| xargs -0 git checkout HEAD --
# or
| git checkout-index --stdin -z