コミットでファイルの変更を元に戻すには、次から始めます。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
コンポーネントを削除してから)、コンテキストが一致する場合(ファイル内のいくつかの行内)のパッチと比較します。 fuzzオプション)は変更を適用します。
このスクリプトの完全な目的は、特定のコミット(したがって名前)で単一のファイルに対する変更を元に戻すことです。これが可能かどうかは、ファイルがコミットされてから変更された内容によって異なりますが、実際には非常に便利です。 (完全なコミットを復元するには、この方法を使用できますgit revert
。)