我使用Git和我一直在使用犯一些文件
git commit -a
后来,我发现了一个文件被错误地添加到提交。
我怎样才能把最后一个文件提交?
我使用Git和我一直在使用犯一些文件
git commit -a
后来,我发现了一个文件被错误地添加到提交。
我怎样才能把最后一个文件提交?
我想其他的答案这里是错误的,因为这是移动误提交的文件回临时区域从以前的承诺,而不取消做他们的变化的问题。 这是可以做到像Paritosh辛格建议:
git reset --soft HEAD^
要么
git reset --soft HEAD~1
然后重置不需要的文件,以让他们从提交出来:
git reset HEAD path/to/unwanted_file
现在,再次提交,你甚至可以重复使用相同的提交信息:
git commit -c ORIG_HEAD
注意 ! 如果你只想从以前的删除文件提交,并保持它在磁盘上读取juzzlin的答案就在上面。
如果这是你最后一次提交,并要完全删除您的本地文件和远程存储库 ,您可以:
git rm <file>
git commit --amend
该修改标志告诉混帐再次提交,但“合并”(不合并两个分支的意义上)这个犯了最后一次提交。
正如在评论中指出,使用git rm
这里就像使用rm
命令本身!
现有的答案都在谈论从最后一次提交移除不需要的文件。
如果你想从删除不需要的文件旧的承诺(甚至推动),并且不希望创建一个新的承诺,这是不必要的,因为动作:
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 reset HEAD^ -- path/to/file
git commit --amend --no-edit
该git reset
将采取文件,因为它是在以前的承诺,并在索引阶段,。 在工作目录中的文件是不变。
在git commit
,然后将承诺和壁球索引到当前提交。
这基本上采取的是在以前提交,并将其添加到当前提交文件的版本。 这导致在没有净变化,因此该文件有效地从提交删除。
如果你还没有推服务器上的改变,你可以使用
git reset --soft HEAD~1
这将重置所有更改并恢复到一个承诺背
如果您有推更改然后按照步骤由@CharlesB作为回答
使用RM将其删除删除文件!
你总是添加到Git中提交,而不是消除,所以在这种情况下返回该文件将其添加到第一次提交(这可能是删除“RM”行动,如果该文件是新的),然后是前状态重新提交该文件将去。
要将文件恢复到以前的一些状态:
git checkout <commit_id> <path_to_file>
或在远程HEAD其返回到状态:
git checkout origin/master <path_to_file>
然后修改提交,你应该找到该文件从列表中消失了(而不是从磁盘删除!)
git checkout HEAD~ path/to/file
git commit --amend
下面将unstage只是你想要的文件,这是什么OP问。
git reset HEAD^ /path/to/file
你会看到类似下面的...
要提交的变化:(使用“git的重置头......”到unstage)
改性:/路径/到/文件
没有上演更改承诺:(使用“混帐添加...”更新的内容将被提交)(使用“git的结帐 - ...”丢弃在工作目录的变化)
改性:/路径/到/文件
在这一点上,你可以做任何你喜欢的文件,如重置为不同的版本。
当你准备好了提交:
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>
用git GUI可以简化从现有提交删除文件。
假设这不是一个共享的分支,你不介意改写历史 ,然后运行:
git gui citool --amend
你可以取消检查被误犯,然后点击“提交”的文件。
该文件从提交删除,但会保留在磁盘上 。 因此,后误加,如果你未检查的文件,它会在你未跟踪文件列表中显示(后误修改它,如果你未核对该文件将在您的更改不会上演提交列表中显示)。
如果你想保持你的提交(也许你已经花了一些时间写一份详细的提交信息,也不想失去它),你只需要删除从提交的文件,而不是从库完全:
git checkout origin/<remote-branch> <filename>
git commit --amend
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>^
然后你可以顺利地完成重订,而不必记住更复杂的命令或提交信息或类型之多。
执行以下命令序列:
//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 revert <commit_id>
$ git reset HEAD~1 --hard
刚刚离开你想在其他丢弃提交更改,请别人出
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
git reset --soft HEAD^
风回你的承诺,当你键入git status
,它会告诉你该怎么做:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
其实我觉得一个更快,更容易的方式是使用git变基交互模式。
git rebase -i head~1
(或头〜4,到目前为止你想怎么过的去)
然后,而不是“挑”,用“编辑”。 我不知道“编辑”是多么强大。
https://www.youtube.com/watch?v=2dQosJaLN18
希望你会发现它的帮助。
要是在那里我有在当地的分公司,我想回复只有一个文件修改了同样的问题。 什么工作对我来说是 -
( 功能/下面target_branch是我有我所有的变化,包括那些我想撤消一个特定的文件)
( 产地/特征/ target_branch的远程分支,我想我的变化推)
( 功能/舞台是我的临时分段分支,我会从排除更改为一个文件,我所有的需要进行修改推)
创建从我的出身/特征/ target_branch本地分支-把它叫做功能/分期
合并后的我工作的本地分支功能/ target_branch的功能/分期支
签出功能/分期然后git的复位--soft ORIG_HEAD( 现在从功能/分期”的所有变化都将上演但未提交。)
未分级这是我以前使用不必要检查的改变在文件
改变上游分支为特征/分期到原点/特征/ target_branch
致力于的分级变化的其余部分和上游推到我的远程来源/特征/ target_branch
如果你不需要这个文件了,你可以这样做
git rm file
git commit --amend
git push origin branch
如果您使用的GitHub和尚未推提交,GitHub的桌面轻松地解决了这个问题:
这是为我工作,以移除位桶式回购的文件,我最初的文件推到分支。
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
如果你不小心添加了一个文件到你的承诺,你可以这样做
git rm --cached path_to_file
小心使用--cached
否则你的文件也将被从您的项目中删除。
如果要删除以前提交使用过滤器文件
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
如果您看到此错误:
无法创建新备份。 以前的备份已经存在于裁判/原厂/强制覆盖与-f备份
只是删除您的本地回购裁判备份
$ rm -rf .git/refs/original/refs
如果你不把你的更改还没有的git
git reset --soft HEAD~1
这将重置所有更改并恢复到一个承诺背
如果这是最后一次提交你做,你要删除从本地和远程存储库中的文件,试试这个:
git rm <file>
git commit --amend
甚至更好:
第一复位
git reset --soft HEAD~1
重置不需要的文件
git reset HEAD path/to/unwanted_file
再次提交
git commit -c ORIG_HEAD