要在提交中恢复对文件的更改,请从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
当前目录中的自述文件。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
.