![Почему здесь `-p1` вместо `patch`?](https://rvso.com/image/109231/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D0%B7%D0%B4%D0%B5%D1%81%D1%8C%20%60-p1%60%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE%20%60patch%60%3F.png)
Для отмены изменений в файле в коммите, изhttps://stackoverflow.com/a/2620822/156458
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
Почему -p1
вpatch
git diff $sha1..$sha1^ -- $file | patch -p1
Спасибо.
решение1
Потому что git diff
добавляет фиктивные каталоги a
и b
к своим исправлениям, которые необходимо пропустить patch
(отсюда и -p1
). git
делает это для представления информации, которой нет в файловой системе (сравниваемые файлы не существуют одновременно); например
diff --git a/README b/README
index ce01362..a1e6cf9 100644
--- a/README
+++ b/README
@@ -1 +1,2 @@
hello
+Tim
для файла README в текущем каталоге. diff
выдаст
--- README.orig 2017-04-07 20:39:50.843962430 +0200
+++ README 2017-04-07 20:39:56.284108455 +0200
@@ -1 +1,2 @@
hello
+Tim
(предполагается, что мы сохранили копию оригинала в другом месте); обратите внимание на отсутствие здесь каталогов (поскольку файлы находятся в текущем каталоге).
Последний патч применяется «как есть» с patch
; первый требует удаления первого элемента каждого пути, отсюда и -p1
.