我可以保留提交但删除所有更改吗?

时间:2019-06-18 13:55:26

标签: git

是否有一种简单的方法来还原提交的所有更改,但保留提交本身?我的提交中有很多文件,并且大多数都是生成的。进行较小的更改后,所有这些文件都需要删除或还原。

因此,执行此操作的明显方法是git rm那些文件,然后git reset那些不是新文件的文件。但是,有没有一种更快的方法呢?如果我在另一个分支上创建一个新提交并复制更改ID,它会成为同一提交的另一个补丁吗?

编辑: 为了澄清,我只想撤消对当前提交所做的更改,而不签出新的提交或创建新的提交。我自己发布了一个答案,该答案与上一次提交进行了比较,并根据是新创建还是修改了文件来删除或还原文件。也许会有更好的解决方案,但这对我的用例有用。

2 个答案:

答案 0 :(得分:0)

以防万一,您不想提交修改后的文件。您可以考虑git stash

  • git stash重置所有已修改或添加到git的文件。
  • git stash pop当我要还原的文件已保存时。

另一方面,如果提交了这些文件,则可以使用git checkoutgit resetgit 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