如何从最新提交中删除文件?
当前回答
同样的问题是,我在本地分支中进行了更改,我只想恢复一个文件。对我有用的是-
(下面的feature/target_branch是我所有更改的地方,包括我想撤消的特定文件的更改)
(origin/feature/target_branch是我要将更改推送到的远程分支)
(feature/stating是我的临时暂存分支,我将从所有需要的更改中推送,不包括对该文件的更改)
从我的原点/feature/target_branch创建本地分支-称为feature/stating将我的工作本地分支feature/target_branch合并到feature/stating分支签出功能/暂存,然后git reset--soft ORIG_HEAD(现在将暂存功能/暂存的所有更改,但未提交。)取消对我以前签入的文件进行不必要的更改将feature/stating的上游分支更改为origin/feature/target_branch提交其余的阶段性更改,并向上游推送到我的远程原点/feature/target_branch
其他回答
现有的答案都是关于从上次提交中删除不需要的文件。
如果您想从旧提交(甚至推送)中删除不需要的文件,并且不想创建新提交,这是不必要的,因为执行以下操作:
使用查找您希望文件符合的提交;
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
如果不幸发生冲突,则必须手动解决。
如果尚未在服务器上推送更改,则可以使用
git reset --soft HEAD~1
它将重置所有更改并恢复为一次提交
如果您已经推动了更改,请按照@CharlesB回答的步骤操作
如果要从以前的提交中删除文件,请使用筛选器
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
如果看到此错误:
无法创建新备份。refs/original中已存在以前的备份/强制使用-f覆盖备份
只需删除本地存储库上的refs备份
$ rm -rf .git/refs/original/refs
正如接受的答案所示,您可以通过重置整个提交来实现这一点。但这是一种相当严厉的做法。要做到这一点,一个更干净的方法是保留提交,只需从中删除更改的文件。
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset会将文件恢复为上次提交时的状态,并将其存储在索引中。工作目录中的文件未被触动。然后,gitcommit将提交并将索引压缩到当前提交中。
这基本上会获取上一次提交中的文件版本,并将其添加到当前提交中。这不会导致任何净更改,因此文件有效地从提交中删除。
如果您正在使用GitHub,但尚未提交,GitHub Desktop可以轻松解决此问题:
选择存储库->撤消最近提交取消选择错误添加的文件。您的上一条提交消息将已经出现在对话框中。按下提交按钮!
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的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之间的区别