如何从最新提交中删除文件?
当前回答
执行以下命令序列:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
其他回答
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
将仍然保留本地文件。如果您也不希望文件在本地,可以跳过--cached选项。
如果所有工作都在您的本地分支上,您需要在以后提交时保存该文件,就像拥有一个干净的历史记录一样,我认为一个更简单的方法是:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
然后,您就可以轻松地完成rebase,而无需记住更复杂的命令、提交消息或键入。
git reset--soft HEAD ^返回您的提交,当您键入git status时,它会告诉您要做什么:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
现有的答案都是关于从上次提交中删除不需要的文件。
如果您想从旧提交(甚至推送)中删除不需要的文件,并且不想创建新提交,这是不必要的,因为执行以下操作:
使用查找您希望文件符合的提交;
git-log--图形--装饰--单行
使用签出提交
git checkout<commit_id><path_to_file>
如果要删除许多文件,可以多次执行此操作。
3.
gitcommit-am“删除不需要的文件”
4.
查找错误添加文件的提交的commit_id,让我们在这里说“35c23c2”
git rebase 35c23c2~1-i//注意:“~1”是必需的
此命令根据您的设置打开编辑器。默认值为vim。如果要更改全局git编辑器,请使用;
git-config--全局core.editor<editor_name>
5.
将最后一次提交(应该是“删除不需要的文件”)移动到错误提交的下一行(在我们的例子中是“35c23c2”),并将命令设置为fixup:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
保存文件后你应该很好。
6.
要完成:
git push-f
如果不幸发生冲突,则必须手动解决。
如果您正在使用GitHub,但尚未提交,GitHub Desktop可以轻松解决此问题:
选择存储库->撤消最近提交取消选择错误添加的文件。您的上一条提交消息将已经出现在对话框中。按下提交按钮!
注意!如果您只想从上一次提交中删除一个文件,并将其保存在磁盘上,请阅读上面juzzlin的回答。
如果这是您最后一次提交,并且您希望从本地和远程存储库中完全删除该文件,您可以:
删除文件git-rm<file>带有修正标志的commit:gitcommit--修正
修正标志告诉git再次提交,但“合并”(不是合并两个分支的意思)这次提交与最后一次提交。
如注释中所述,在这里使用gitrm就像使用rm命令本身一样!
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别