Git:推送后删除已提交的文件


104

是否有可能在Git中还原已提交的文件?我已经提交了对GitHub的提交,然后我意识到有一个文件我不想被推送(我还没有完成更改)。


您是否要在推送后从GitHub完全删除文件?否则,您只需要:git rm <file>,git push。
rdrmntn


Answers:


144

更新:添加了更安全的方法

首选方法:

  1. 检查文件的先前(未更改)状态;注意双破折号

    git checkout HEAD^ -- /path/to/file
    
  2. 提交:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. 推动它,无需用力:

    git push
    
  4. 回到未完成的工作,再做一次(向上箭头3次):

    git checkout HEAD^ -- /path/to/file
    

有效地“取消提交”:

要修改存储库HEAD的最后一次提交,混淆您的不小心推动的工作,同时可能与您的同事发生冲突,而后者可能已经将其拔出,并且他的头发会长白,会浪费很多时间来调和其本地分支头与中央一:

要从上一次提交中删除文件更改:

  1. 要将文件还原到上一次提交之前的状态,请执行以下操作:

    git checkout HEAD^ /path/to/file
    
  2. 要使用还原的文件更新最后一次提交,请执行以下操作:

    git commit --amend
    
  3. 要将更新的提交推送到存储库,请执行以下操作:

    git push -f
    

确实,请考虑使用前面提到的首选方法。


1
除非您是项目中的唯一开发人员,否则您实际上不应该使用git push -f。它造成的问题多于其价值。只需删除文件,然后执行新的提交即可。
richardm

1
@ user553086完全不同意。现在好点了?
xor

这可以追溯到更久远的提交吗?例如,我可以这样做git checkout HEAD~2 /path/to/file吗?编辑:看起来我想要的只是简单的git rm /path/to/file
starscream_disco_party

1
你刚刚救了我四个小时!
Tosin Onikute

52

如果要从远程存储库中删除文件,请首先使用--cache选项将其从项目中删除,然后将其推送:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(即使该文件是在某些提交之前添加到远程仓库中的,也可以使用。)请记住,将不想添加的文件扩展名添加到.gitignore。


2
这确实从此提交中删除了文件,但是在较旧的提交中仍可见文件。

29

您只能将一个文件还原到指定的修订版。

首先,您可以检查文件已更改的提交。

git log path/to/file.txt

然后,您可以使用修订号检出文件。

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

之后,您可以提交并再次推送它。


7

将文件重置为正确的状态,然后提交并再次推送。

如果您确定没有其他人提取过您的更改,则可以--amend在提交时使用它来修改以前的提交(即重写历史记录),然后进行推送。我认为您-f在推送时必须使用该选项,以强制推送。


3
  1. 获取上一次提交的哈希码。

    • git log
  2. 还原提交
    • git revert <hash_code_from_git_log>
  3. 推动变化
    • git push

在GHR中查看。您可能会得到所需的一切,希望这对您有用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.