Git:只想丢掉一小段改动,`git restore -p` 挺好用

13 次浏览2 条回复

改代码改到一半,文件里有些改动想留,有些又想先撤掉。这个时候别急着整文件 restore,可以用 -p 一段一段选。

环境:Git 2.30+。随便起个测试目录:

mkdir git-restore-p-demo && cd git-restore-p-demo
git init
printf 'one\ntwo\nthree\n' > note.txt
git add note.txt
git commit -m 'init'

python - <<'PY'
from pathlib import Path
p = Path('note.txt')
s = p.read_text()
s = s.replace('one', 'ONE')
s = s.replace('three', 'THREE')
p.write_text(s)
PY

git diff
git restore -p note.txt

执行到最后会进入交互选择,y 是丢掉当前这块,n 是保留当前这块。选完再跑:

git diff

适合那种“这个文件改杂了,但我只想回滚其中几处”的场景。要注意它改的是工作区内容,手抖的话还得靠编辑器撤销或者提交历史救回来,所以我一般会先看一眼 git diff

这个场景我还会顺手记一下 s,当前 hunk 太大时可以尝试拆小块,不然 y/n 选起来有点粗。拆不开再用 e 手动改 patch,不过这个就要小心格式了。

还有个对应的是 git add -p,一个偏“只暂存一部分”,一个偏“只撤掉一部分”,搭配起来挺适合清理改乱的工作区。

补一个小习惯:如果不确定会撤掉哪块,我会先跑 git diff --check 或者至少留着当前 diff 看一眼。restore -p 选完之后再 git diff 对比一下,能马上发现是不是把想留的东西也撤了。

交互里 q 也挺有用,选到一半觉得不对劲就退出,前面已经确认的块会生效,后面的先别动。