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

kma*_*aci 70 git github

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

xor*_*xor 106

更新:添加更安全的方法

首选方法:

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

    git checkout HEAD^ -- /path/to/file
    
    Run Code Online (Sandbox Code Playgroud)
  2. 提交它:

    git commit -am "revert changes on this file, not finished with it yet"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 推它,不需要力量:

    git push
    
    Run Code Online (Sandbox Code Playgroud)
  4. 回到你未完成的工作,再做(3次向上):

    git checkout HEAD^ -- /path/to/file
    
    Run Code Online (Sandbox Code Playgroud)

有效'不承认':

修改存储库HEAD的最后一次提交,混淆你意外推送的工作,同时可能与你的同事已经拉过它的冲突,以及谁会长出白发并且失去大量时间试图调和他的本地分支头中央的:

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

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

    git checkout HEAD^ /path/to/file
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要使用恢复的文件更新上次提交,请执行以下操作:

    git commit --amend
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要将更新的提交推送到repo,请执行以下操作:

    git push -f
    
    Run Code Online (Sandbox Code Playgroud)

真的,考虑使用前面提到的首选方法.

  • 除非您是项目中唯一的开发人员,否则您真的不应该使用 git push -f。它造成的问题远远超过其价值。只需删除该文件,然后进行新的提交即可。 (2认同)
  • @ user553086 完全同意。现在好多了? (2认同)

小智 26

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

git rm --cache /path/to/file
git commit -am "Remove file"
git push
Run Code Online (Sandbox Code Playgroud)

(即使文件已添加到远程仓库中,也可以使用此提交).请记住向.gitignore添加您不想推送的文件扩展名.

  • 这确实会从此提交中删除文件,但这些文件在较旧的提交中仍然可见。 (5认同)

Ren*_*hle 21

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

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

git log path/to/file.txt

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

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

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


Dim*_*kis 8

您可以使用以下工作流程:

git reset --soft HEAD~1
git reset HEAD /path/to/file
Run Code Online (Sandbox Code Playgroud)

  • 那之后我们该怎么办? (2认同)

JB *_*zet 6

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

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


小智 5

  1. 获取最后一次提交的哈希码。

    • git log
  2. 恢复提交
    • git revert <hash_code_from_git_log>
  3. 推动更改
    • git push

在 GHR 中查看。你可能会得到你需要的东西,希望这对你有用


小智 5

使用 git rm --cached /path/to/file 然后添加、提交和推送。就像上面的答案一样,但你需要使用--cachednot --cache

  • 这应该是对引用答案的评论或编辑。 (3认同)