Почему здесь `-p1` вместо `patch`?

Почему здесь `-p1` вместо `patch`?

Для отмены изменений в файле в коммите, из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.

Связанный контент