我正在使用Git,并且已经使用了一些文件
git commit -a
后来,我发现一个文件被错误地添加到提交中。
如何从上一次提交中删除文件?
git reset filepath
我正在使用Git,并且已经使用了一些文件
git commit -a
后来,我发现一个文件被错误地添加到提交中。
如何从上一次提交中删除文件?
git reset filepath
Answers:
我认为这里的其他答案是错误的,因为这是将错误提交的文件从上一次提交移回到暂存区的问题,而不取消对它们所做的更改。可以像Paritosh Singh建议的那样完成:
git reset --soft HEAD^
要么
git reset --soft HEAD~1
然后重置不需要的文件,以使它们脱离提交:
git reset HEAD path/to/unwanted_file
现在再次提交,您甚至可以重复使用相同的提交消息:
git commit -c ORIG_HEAD
git push
修复您的存储库,它将抱怨Updates were rejected because the tip of your current branch is behind its remote counterpart.
。如果您确定要推动它们(例如,这是您的叉子),则可以使用该-f
选项来强制推动,例如git push origin master -f
。(不要对其他人正在获取的上游
git reset --soft HEAD^
是我最常用的撤消操作
git reset
但是希望找到一种方法来影响“到位”的现有提交。我刚刚了解到git commit -C
。因此,对我来说,我想要的是您的精确配方,再走一步,将新的“再次提交”拼写为git commit -C [hash of original HEAD commit from first step]
。
注意!如果您只想从先前的提交中删除文件,并将其保存在磁盘上,请阅读上面的juzzlin答案。
如果这是您的最后一次提交,并且您想从本地和远程存储库中完全删除文件,则可以:
git rm <file>
git commit --amend
amend标志告诉git再次提交,但是将“ commit”(不是合并两个分支的意思)与最后一次提交“合并”。
如注释中所述,git rm
此处使用就像使用rm
命令本身!
git rm --cached
将文件保留在磁盘上
rm
在git
命令是做什么的rm
自己呢!
git commit --amend
仍然存在,并且可以使用进行查找git reflog
。因此,它没有其他评论所建议的那样糟糕。
现有的答案都在谈论从上一次提交中删除不需要的文件。
如果要从旧提交(甚至推送)中删除不需要的文件,并且不想创建新的提交,则由于该操作,这是不必要的:
1。
查找您要文件符合的提交。
git checkout <commit_id> <path_to_file>
如果要删除许多文件,可以多次执行此操作。
2。
git commit -am "remove unwanted files"
3。
找到错误添加了文件的提交的commit_id,在这里说“ 35c23c2”
git rebase 35c23c2~1 -i // notice: "~1" is necessary
该命令根据您的设置打开编辑器。默认值是vim。
将最后一个提交(应为“删除不需要的文件”)移动到错误提交的下一行(在本例中为“ 35c23c2”),并将命令设置为fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
保存文件后应该会很好。
完成 :
git push -f
如果不幸遇到冲突,则必须手动解决。
git rm --cached <file(s)>
。
--fixup=35c23c2
到git commit
命令,可以使此过程更加容易。这将自动将提交设置为所需提交的修正,因此您无需在基准库中指定它。此外,如果您添加--autosquash
到git rebase
命令中,则git会自动将提交移至正确的位置,因此您无需在交互式基础库中做任何事情-只需保存结果即可(这意味着您甚至不需要-i
标记,尽管我还是喜欢使用它来确保一切看起来都和我期望的一样)。
如已接受的答案所示,您可以通过重置整个提交来做到这一点。但这是一个相当繁重的做法。
一种更清洁的方法是保留提交,然后从中删除更改的文件。
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
在git reset
将文件,因为它是在以前的承诺,并在索引阶段,。工作目录中的文件未更改。
然后,git commit
它将提交并将索引压缩到当前提交中。
本质上,这将获取上一次提交中文件的版本,并将其添加到当前提交中。这不会导致任何净变化,因此可以有效地将文件从提交中删除。
如果尚未在服务器上推送更改,则可以使用
git reset --soft HEAD~1
它将重置所有更改并恢复为一次提交
如果您已推送更改,请按照@CharlesB回答的步骤进行操作
git checkout HEAD~ path/to/file
git commit --amend
以下内容将仅取消暂存您想要的文件,这是OP要求的。
git reset HEAD^ /path/to/file
您会看到类似以下的内容...
要提交的更改:(使用“ git reset HEAD ...”取消登台)
修改:/ path / to / file
未上演提交的更改:(使用“ git add ...”更新将提交的内容)(使用“ git checkout-...”放弃工作目录中的更改)
修改:/ path / to / file
此时,您可以对文件执行任何操作,例如重置为其他版本。
准备提交时:
git commit --amend -a
或(如果您正在进行其他更改,但还不想提交)
git commit add /path/to/file
git commit --amend
我将通过示例向您解释。
令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>
noop
为edit [A_commit_ID]
或e [A_commit_ID]
您可以尝试一下。
git reset --soft HEAD~1
并创建一个新的提交。
但是,有一个很棒的软件“ gitkraken”。这使得使用git变得容易。
git commit --amend
需要在上一次提交中更新文件删除;事后,您可以检查它确实被去掉git log -1 --stat
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>^
然后您就可以轻松完成变基,而不必记住更复杂的命令或提交消息或键入太多内容。
使用git GUI可以简化从先前提交中删除文件的过程。
假设这不是共享分支,并且您不介意重写history,请运行:
git gui citool --amend
您可以取消选中错误提交的文件,然后单击“提交”。
该文件已从提交中删除,但将保留在磁盘上。因此,如果您在错误添加文件后取消选中该文件,它将显示在未跟踪的文件列表中(如果您在错误修改文件后取消选中了该文件,它将显示在未暂存的提交更改中)。
sudo apt-get install git-gui
git rebase -i HEAD~4
,然后运行了您的命令以打开编辑器。另一个注意事项:在“提交”菜单中可以找到“取消登台”。
git reset --soft HEAD^
(记住--soft arg),然后使用git commit -c ORIG_HEAD
(而不是--amend,将所有内容搞砸了)相比,出错的可能性要小得多。
执行以下命令序列:
//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 reset --soft HEAD^
git checkout origin/master <filepath>
干杯!
实际上,我认为一种更快,更轻松的方法是使用git rebase交互模式。
git rebase -i head~1
(或头〜4,您想走多远)
然后使用“编辑”代替“选择”。我没有意识到“编辑”有多么强大。
https://www.youtube.com/watch?v=2dQosJaLN18
希望对您有所帮助。
在我只想还原一个文件的本地分支中进行更改时,发生了相同的问题。对我有用的是-
(下面的feature / target_branch是我进行所有更改的地方,包括我想撤消特定文件的更改)
(origin / feature / target_branch是要将更改推送到的远程分支)
(功能/阶段是我的临时阶段分支,我将从那里进行所有想要的更改(不包括对该文件的更改)
从我的origin / feature / target_branch创建一个本地分支-称为feature / staging
将我正在工作的本地分支Feature / target_branch合并 到feature / staging分支
检出功能部件/暂存,然后git reset --soft ORIG_HEAD (现在,功能暂存中的所有更改都将暂存,但未提交。)
取消暂存我先前签入的文件并进行不必要的更改
将功能/阶段的上游分支更改为 origin / feature / target_branch
提交了其余的分阶段更改,并向上游推送到我的远程origin / feature / target_branch
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
目前没有答案是合理的。听起来似乎有足够的需求提出一个真正的解决方案:https : //github.com/git/git/blob/master/Documentation/SubmittingPatches
git --uncommit <文件名>
会好的。我知道我们不想修改历史记录,但是如果我是本地人并且不小心添加了本地“ hack”文件,并且想要从提交中将其删除,这将非常有帮助。