Lol*_*lly 1484 git git-commit
我正在使用Git,我已经提交了几个文件
git commit -a
Run Code Online (Sandbox Code Playgroud)
后来,我发现错误地将一个文件添加到了提交中.
如何从上次提交中删除文件?
juz*_*lin 2841
我认为这里的其他答案是错误的,因为这是一个将错误提交的文件从前一次提交移回到暂存区域的问题,而不取消对它们所做的更改.这可以像Paritosh Singh建议的那样完成:
git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)
要么
git reset --soft HEAD~1
Run Code Online (Sandbox Code Playgroud)
然后重置不需要的文件,以便将它们从提交中删除:
git reset HEAD path/to/unwanted_file
Run Code Online (Sandbox Code Playgroud)
现在再次提交,您甚至可以重用相同的提交消息:
git commit -c ORIG_HEAD
Run Code Online (Sandbox Code Playgroud)
Cha*_*esB 296
注意!如果您只想从之前的提交中删除文件,并将其保存在磁盘上,请阅读上面的juzzlin的答案.
如果这是您的上次提交,并且您希望从本地和远程存储库中完全删除该文件,则可以:
git rm <file>
git commit --amend
修正标志告诉git再次提交,但是"合并"(不是在合并两个分支的意义上)这个提交与最后一次提交.
正如评论中所述,git rm
在这里使用就像使用rm
命令本身一样!
Bri*_*ian 148
现有的答案都在讨论从上次提交中删除不需要的文件.
如果要从旧提交中删除不需要的文件(甚至推送),并且不希望创建新的提交,这是不必要的,因为操作:
1.
找到您希望文件符合的提交.
git checkout <commit_id> <path_to_file>
Run Code Online (Sandbox Code Playgroud)
如果要删除多个文件,可以多次执行此操作.
2.
git commit -am "remove unwanted files"
Run Code Online (Sandbox Code Playgroud)
3.
找到错误添加文件的提交的commit_id ,让我们在这里说"35c23c2"
git rebase 35c23c2~1 -i // notice: "~1" is necessary
Run Code Online (Sandbox Code Playgroud)
此命令根据您的设置打开编辑器.默认的是vim.
将最后一次提交(应该是"删除不需要的文件")移动到错误提交的下一行(在我们的例子中为"35c23c2"),并将命令设置为fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Run Code Online (Sandbox Code Playgroud)
保存文件后你应该很好.
完成 :
git push -f
Run Code Online (Sandbox Code Playgroud)
如果您不幸遇到冲突,则必须手动解决.
Pat*_*ick 118
如接受的答案所示,您可以通过重置整个提交来完成此操作.但这是一个相当沉重的方法.
更简洁的方法是保持提交,只需从中删除更改的文件即可.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
Run Code Online (Sandbox Code Playgroud)
在git reset
将文件,因为它是在以前的承诺,并在索引阶段,.工作目录中的文件不受影响.
然后,git commit
它将提交并将索引压缩到当前提交中.
这基本上采用了先前提交中的文件版本,并将其添加到当前提交中.这不会导致净更改,因此文件将从提交中有效删除.
Par*_*ngh 41
如果您尚未在服务器上推送更改,则可以使用
git reset --soft HEAD~1
Run Code Online (Sandbox Code Playgroud)
它将重置所有更改并恢复为一次提交
如果您已推送更改,请按照@CharlesB所述的步骤进行操作
Bob*_*gon 38
使用rm删除文件将删除它!
你总是在git中添加提交而不是删除,所以在这个实例中将文件返回到第一次提交之前的状态(如果文件是新的,这可能是删除'rm'动作)然后重新提交,文件将继续.
要将文件返回到以前的某个状态:
git checkout <commit_id> <path_to_file>
Run Code Online (Sandbox Code Playgroud)
或者将其返回到远程HEAD的状态:
git checkout origin/master <path_to_file>
Run Code Online (Sandbox Code Playgroud)
然后修改提交,你应该发现文件已从列表中消失(并且没有从磁盘中删除!)
小智 35
git checkout HEAD~ path/to/file
git commit --amend
Run Code Online (Sandbox Code Playgroud)
Tha*_*ais 29
以下将仅展示您想要的文件,这是OP所要求的.
git reset HEAD^ /path/to/file
Run Code Online (Sandbox Code Playgroud)
你会看到类似下面的东西......
要提交的更改:(使用"git reset HEAD ..."取消暂停)
修改:/ path/to/file
没有为commit提交的更改:(使用"git add ..."来更新将要提交的内容)(使用"git checkout - ..."来放弃工作目录中的更改)
修改:/ path/to/file
此时,您可以对文件执行任何操作,例如重置为其他版本.
当你准备提交时:
git commit --amend -a
Run Code Online (Sandbox Code Playgroud)
或者(如果你还有其他一些你不想提交的修改)
git commit add /path/to/file
git commit --amend
Run Code Online (Sandbox Code Playgroud)
Moa*_*had 23
我将以实例向您解释.
设A,B,C为3次连续提交.提交B包含一个不应提交的文件.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
Run Code Online (Sandbox Code Playgroud)
Dev*_*vWL 15
如果你想保留该文件,你可以--cached
像这样使用:
git rm --cached filename
Run Code Online (Sandbox Code Playgroud)
否则,如果你想删除该文件,只需使用:
git rm filename
Run Code Online (Sandbox Code Playgroud)
小智 13
如果您不小心将文件添加到提交中,则可以执行以下操作
git rm --cached path_to_file
Run Code Online (Sandbox Code Playgroud)
确保使用--cached
否则文件也将从项目中删除。
Bry*_*ley 12
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
Run Code Online (Sandbox Code Playgroud)
将保留本地文件.如果您不想在本地使用该文件,则可以跳过--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>^
Run Code Online (Sandbox Code Playgroud)
然后,您可以轻松完成rebase,而无需记住更复杂的命令或提交消息或输入更多内容.
JDi*_*teo 10
使用git GUI可以简化从先前提交中删除文件的过程.
假设这不是共享分支,并且您不介意重写历史记录,那么运行:
git gui citool --amend
Run Code Online (Sandbox Code Playgroud)
您可以取消选中错误提交的文件,然后单击"提交".
该文件将从提交中删除,但将保留在磁盘上.因此,如果您在错误地添加文件后取消选中该文件,它将显示在您未跟踪的文件列表中(如果您在错误地修改文件后取消选中该文件,则会在您的更改中显示未提交的提交列表).
如果你想保留你的提交(也许你已经花了一些时间编写一个详细的提交消息而不想丢失它),你只想从提交中删除文件,而不是完全从存储库中删除:
git checkout origin/<remote-branch> <filename>
git commit --amend
Run Code Online (Sandbox Code Playgroud)
git reset --soft HEAD~1.
Run Code Online (Sandbox Code Playgroud)
这将撤消本地存储库中的最后一次提交,并将所有内容移回舞台区域,就像执行提交之前一样。然后,只需正常使用任何 Git UI 工具(如 TortoiseGit、Git UI、Git Extensions...)来取消暂存我们不想提交的文件,然后再次提交。
git reset --soft HEAD~1
git reset HEAD /file/to/delete
git rm --cached /file/to/delete
git commit --amend -m "your message"
然后可以:
git push -u origin master
执行以下命令序列:
//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'
Run Code Online (Sandbox Code Playgroud)
只是想补充最重要的答案,因为我必须运行一个额外的命令:
git reset --soft HEAD^
git checkout origin/master <filepath>
Run Code Online (Sandbox Code Playgroud)
干杯!
如果要从以前的提交中删除文件,请使用过滤器
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
Run Code Online (Sandbox Code Playgroud)
如果您看到此错误:
无法创建新备份。以前的备份已存在于 refs/original/ 中,用 -f 强制覆盖备份
只需删除本地存储库上的 refs 备份
$ rm -rf .git/refs/original/refs
Run Code Online (Sandbox Code Playgroud)