如何撤销git rm

o2rvlv0m  于 2023-05-12  发布在  Git
关注(0)|答案(3)|浏览(390)

我不小心添加并提交了一个(巨大的)日志文件到我的本地git仓库,然后执行了git rm(没有--cached)。所以历史看起来是这样的:

> git status

modified:  Foo.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    huge_file.log

nothing added to commit but untracked files present (use "git add" to track)

然后我做了git add .

> git add .
> git status

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    modified:  Foo.java
    new file:   huge_file.log

然后(我忽略了我已经添加了huge_file.log)我做了一个git commit

> git commit -am "Foo commit"
[master 7582793] Foo commit
 1 file changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 huge_file.log

然后我意识到我已经添加并提交了huge_file.log。所以我想我可以通过执行git rm huge_file.log来撤销它:

> git rm huge_file.log
> git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    huge_file.log

这时,我才意识到自己犯了什么错:我不能提交并推送到master,因为这意味着推送huge_file.log,然后删除huge_file.log。不幸的是,我不能推,因为我们有一个文件限制为100 MB每个文件和huge_file.log是超过1 GB。
那我现在能做什么我不能简单地将HEAD重置为以前的提交,因为我在Foo.java中做了很多我不想撤销的更改。
有没有办法改变以前的提交以某种方式删除huge_file.log
请注意,Foo.java只是StackOverflow上更好的可读性的代表。我已经修改了大约10个文件,并在每个文件中修改了许多行代码,我不想丢失这些更改。
我现在该怎么办?

lndjwyie

lndjwyie1#

如果只是在最后一次提交中,则执行git rm huge_file.log,然后执行git commit --amend
Git允许你修改你最近一次犯下的错误。真的

q0qdq0h2

q0qdq0h22#

你可以做

$ git reset --soft HEAD~[n]

其中[n]是您希望重置的过去提交的数量。
例如,要撤消上次提交

$ git reset --soft HEAD~1
$ git status

然后继续提交文件,就像您通常所做的那样。

cyvaqqii

cyvaqqii3#

如果你还没有承诺。可以使用git restore --source=HEAD --staged --worktree <file>

相关问题