Por que `-p1` deve ser `patch` aqui?

Por que `-p1` deve ser `patch` aqui?

Para reverter as alterações em um arquivo em um commit, dehttps://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

Por que está -p1empatch

git diff $sha1..$sha1^ -- $file | patch -p1

Obrigado.

Responder1

Porque git diffadiciona diretórios falsos ae bseus patches, que precisam ser ignorados patch(daí o -p1). gitfaz isso para representar informações que não estão no sistema de arquivos (os arquivos comparados não existem simultaneamente); por exemplo

diff --git a/README b/README
index ce01362..a1e6cf9 100644
--- a/README
+++ b/README
@@ -1 +1,2 @@
 hello
+Tim

para um arquivo README no diretório atual. diffproduziria

--- README.orig 2017-04-07 20:39:50.843962430 +0200
+++ README      2017-04-07 20:39:56.284108455 +0200
@@ -1 +1,2 @@
 hello
+Tim

(assumindo que mantivemos uma cópia do original em outro lugar); observe a ausência de diretórios aqui (já que os arquivos estão no diretório atual).

O último patch se aplica como está patch; o primeiro precisa ter o primeiro elemento de cada caminho removido, daí o -p1.

informação relacionada