是否有一种简单的方法来还原提交的所有更改,但保留提交本身?我的提交中有很多文件,并且大多数都是生成的。进行较小的更改后,所有这些文件都需要删除或还原。
因此,执行此操作的明显方法是git rm那些文件,然后git reset那些不是新文件的文件。但是,有没有一种更快的方法呢?如果我在另一个分支上创建一个新提交并复制更改ID,它会成为同一提交的另一个补丁吗?
编辑: 为了澄清,我只想撤消对当前提交所做的更改,而不签出新的提交或创建新的提交。我自己发布了一个答案,该答案与上一次提交进行了比较,并根据是新创建还是修改了文件来删除或还原文件。也许会有更好的解决方案,但这对我的用例有用。
答案 0 :(得分:0)
以防万一,您不想提交修改后的文件。您可以考虑git stash
。
git stash
重置所有已修改或添加到git的文件。git stash pop
当我要还原的文件已保存时。另一方面,如果提交了这些文件,则可以使用git checkout
,git reset
或git revert
答案 1 :(得分:0)
我找到了一个不错的解决方案。运行这两个命令将恢复提交中的所有更改,而不会删除提交。
git diff-tree -no-commit-id --name-status -r HEAD | grep -oP '(?<=A).*' | xargs git rm
git diff-tree -no-commit-id --name-status -r HEAD | grep -oP '(?<=M).*' | xargs git checkout HEAD~1
第一行删除所有添加的文件,第二行恢复对现有文件所做的更改。
第一个命令git diff-tree
返回提交中的更改,选项--no-commit-id
删除ID,--name-status
仅返回文件名和指示其是否为新字符。文件,已修改或已删除的文件。结果被传递到grep命令中,该命令搜索A或M(添加或修改的文件)并返回不包含该字符的行。最后,xargs将输出转换为参数,然后对文件执行必要的git命令,对于添加的文件,执行git rm
,对于修改的文件,执行git checkout HEAD~1
。