![この例では、` patch -p1` はどのファイルにパッチを適用しますか?](https://rvso.com/image/109227/%E3%81%93%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%AF%E3%80%81%60%20patch%20-p1%60%20%E3%81%AF%E3%81%A9%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%91%E3%83%83%E3%83%81%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%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
patch -p1
パッチ ファイル (つまり、 の出力 )はどのファイルに適用されますかgit diff $sha1..$sha1^ -- $file
?
作業ディレクトリ内のすべてのファイルに適用されますか?
しかし、作業ディレクトリはコミットと同じではない可能性があります。と$sha1
の差を、 と同じかどうかわからない作業ディレクトリに適用するのは意味があるのでしょうか?$sha1^
$sha1
$sha1
ありがとう。
答え1
git diff $sha1..$sha1^
コミットを元に戻すパッチを生成します$sha1
(そのコミットとその親の差異をリストします)。 が指定されている場合、そのパッチは指定されたコミットで$file
行われた変更に制限されます。$file
そのパッチは に送られ、 (および)patch -p1
で使用される偽のディレクトリ名が削除され、パッチにリストされているファイルにパッチを適用しようとします(git
a/
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
、ファイル内のコンテキストがパッチと比較されます。コンテキストが一致する場合 (ファズ オプションによっては、数行以内) のみ、変更が適用されます。
このスクリプトの目的は、指定されたコミット内の 1 つのファイルに加えられた変更を元に戻すことです (そのため、このスクリプトの名前が付けられています)。それが可能かどうかは、そのコミット以降にファイルに加えられた変更によって異なりますが、実際には非常に便利な場合がよくあります。(コミット全体を元に戻すには、git revert
代わりに を使用します。)