この例では、「patch -p1」はどのファイルにパッチを適用しますか?

この例では、「patch -p1」はどのファイルにパッチを適用しますか?

コミットでファイルの変更を元に戻すには、次から始めます。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

パッチファイルはどのファイルに適用されますかpatch -p1(例:出力 git diff $sha1..$sha1^ -- $file)。

作業ディレクトリ内のすべてのファイルに適用されますか?

ただし、作業ディレクトリはコミットディレクトリと異なる場合があります$sha1。もしそうなら、それと同じかもしれないかもしれない作業ディレクトリに$sha1^との違いを適用することは意味がありますか?$sha1$sha1

ありがとうございます。

答え1

git diff $sha1..$sha1^コミットを元に戻すパッチを作成します$sha1(そのコミットと親コミットの違いをリストします)。指定すると、そのコミットで変更された内容$fileにパッチが制限されます。$file

その後、そのパッチを に提供すると、使用されている偽のディレクトリ名が削除され、パッチにリストされているpatch -p1すべてのファイルにパッチを適用しようとします(gita/b/つまり$file指定されたコミットで名前が変更された場合、またはサブディレクトリ内のファイルを含む、指定されたコミットですべてのファイルが変更された場合)。現在のディレクトリとサブディレクトリにあるファイルが大きく異なる(または拡張子がない場合)、パッチはpatch適用されません。

git diffこれは、(およびdiff -u)によって生成された一様な形式のパッチにパッチされるファイル名とパッチコンテキストが含まれているという事実によって達成されます。以下は例です(の内容ではありませんが、gitアイデアを示しています)。

diff -ur cli-common-0.9+nmu1.orig/policy-remove cli-common-0.9+nmu1/policy-remove
--- cli-common-0.9+nmu1.orig/policy-remove  2015-02-25 21:34:08.000000000 +0100
+++ cli-common-0.9+nmu1/policy-remove   2017-04-08 20:47:09.029065259 +0200
@@ -11,4 +11,4 @@

 #echo "Removing GAC policy file ($POLICY) from available GACs"
 /usr/share/cli-common/gac-package-remove $POLICY > /dev/null
-rm /usr/share/cli-common/packages.d/$POLICY.installcligac
+rm -f /usr/share/cli-common/packages.d/$POLICY.installcligac

パッチは、というcli-common-0.9+nmu1.orig/policy-removeファイルを作成するためにというファイルを変更していると言いますcli-common-0.9+nmu1/policy-remove。変更自体は、11行目から始まり、ターゲット@@ -11,4のコンテキスト(たとえば)を含む4行にまたがり、変更された行は同じ場所(+11,4 @@)にあります。変更の上には3行のコンテキストがあり、次に変更自体があります。で始まる行を削除し、rmで始まる行を追加しますrm -f。この機能が適用されたら、patch適切な名前のファイルを探し(オプションでマークされている場合はパス-pコンポーネントを削除してから)、コンテキストが一致する場合(ファイル内のいくつかの行内)のパッチと比較します。 fuzzオプション)は変更を適用します。

このスクリプトの完全な目的は、特定のコミット(したがって名前)で単一のファイルに対する変更を元に戻すことです。これが可能かどうかは、ファイルがコミットされてから変更された内容によって異なりますが、実際には非常に便利です。 (完全なコミットを復元するには、この方法を使用できますgit revert。)

関連情報