从混帐删除文件提交(Remove files from Git commit)

2019-06-18 04:51发布

我使用Git和我一直在使用犯一些文件

git commit -a

后来,我发现了一个文件被错误地添加到提交。

我怎样才能把最后一个文件提交?

Answer 1:

我想其他的答案这里是错误的,因为这是移动误提交的文件回临时区域从以前的承诺,而不取消做他们的变化的问题。 这是可以做到像Paritosh辛格建议:

git reset --soft HEAD^ 

要么

git reset --soft HEAD~1

然后重置不需要的文件,以让他们从提交出来:

git reset HEAD path/to/unwanted_file

现在,再次提交,你甚至可以重复使用相同的提交信息:

git commit -c ORIG_HEAD  


Answer 2:

注意 ! 如果你只想从以前的删除文件提交,并保持它在磁盘上读取juzzlin的答案就在上面。

如果这是你最后一次提交,并要完全删除您的本地文件和远程存储库 ,您可以:

  1. 删除该文件git rm <file>
  2. 与修改标志承诺: git commit --amend

该修改标志告诉混帐再次提交,但“合并”(不合并两个分支的意义上)这个犯了最后一次提交。

正如在评论中指出,使用git rm这里就像使用rm命令本身!



Answer 3:

现有的答案都在谈论从最后一次提交移除不需要的文件。

如果你想从删除不需要的文件旧的承诺(甚至推动),并且不希望创建一个新的承诺,这是不必要的,因为动作:

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

如果你不幸得到冲突,你必须手动解决这些问题。



Answer 4:

作为公认的答案表明,你可以通过重置整个承诺做到这一点。 但是,这是一个相当沉重的霸道做法。
一个清洁的方式来做到这一点是保持提交,并简单地从中取出修改过的文件。

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

git reset将采取文件,因为它是在以前的承诺,并在索引阶段,。 在工作目录中的文件是不变。
git commit ,然后将承诺和壁球索引到当前提交。

这基本上采取的是在以前提交,并将其添加到当前提交文件的版本。 这导致在没有净变化,因此该文件有效地从提交删除。



Answer 5:

如果你还没有推服务器上的改变,你可以使用

git reset --soft HEAD~1

这将重置所有更改并恢复到一个承诺背

如果您有推更改然后按照步骤由@CharlesB作为回答



Answer 6:

使用RM将其删除删除文件!

你总是添加到Git中提交,而不是消除,所以在这种情况下返回该文件将其添加到第一次提交(这可能是删除“RM”行动,如果该文件是新的),然后是前状态重新提交该文件将去。

要将文件恢复到以前的一些状态:

    git checkout <commit_id> <path_to_file>

或在远程HEAD其返回到状态:

    git checkout origin/master <path_to_file>

然后修改提交,你应该找到该文件从列表中消失了(而不是从磁盘删除!)



Answer 7:

git checkout HEAD~ path/to/file
git commit --amend


Answer 8:

下面将unstage只是你想要的文件,这是什么OP问。

git reset HEAD^ /path/to/file

你会看到类似下面的...

要提交的变化:(使用“git的重置头......”到unstage)

改性:/路径/到/文件

没有上演更改承诺:(使用“混帐添加...”更新的内容将被提交)(使用“git的结帐 - ...”丢弃在工作目录的变化)

改性:/路径/到/文件

  • “要提交变更”是文件的提交前一版本。 这看起来像一个删除,如果该文件不存在。 如果你犯这种变化,有将是恢复在您的分支改变该文件的修订版。
  • “没有上演提交更改”是你所犯下的变化,以及该文件的当前状态

在这一点上,你可以做任何你喜欢的文件,如重置为不同的版本。

当你准备好了提交:

git commit --amend -a

或者(如果你有一些其他的变化回事,你不想犯,还)

git commit add /path/to/file
git commit --amend


Answer 9:

我会向你解释用的例子。
令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>    


Answer 10:

用git GUI可以简化从现有提交删除文件。

假设这不是一个共享的分支,你不介意改写历史 ,然后运行:

git gui citool --amend

你可以取消检查被误犯,然后点击“提交”的文件。

该文件从提交删除,但会保留在磁盘上 。 因此,后误加,如果你未检查的文件,它会在你未跟踪文件列表中显示(后误修改它,如果你未核对该文件将在您的更改不会上演提交列表中显示)。



Answer 11:

如果你想保持你的提交(也许你已经花了一些时间写一份详细的提交信息,也不想失去它),你只需要删除从提交的文件,而不是从库完全:

git checkout origin/<remote-branch> <filename>
git commit --amend


Answer 12:

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>^

然后你可以顺利地完成重订,而不必记住更复杂的命令或提交信息或类型之多。



Answer 13:

执行以下命令序列:

//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'


Answer 14:

只是想补上的答案,我必须运行一个额外的命令:

git reset --soft HEAD^
git checkout origin/master <filepath>

干杯!



Answer 15:

东西为我工作,但还是觉得应该有一个更好的解决方案:

$ git revert <commit_id>
$ git reset HEAD~1 --hard

刚刚离开你想在其他丢弃提交更改,请别人出

$ git commit --amend // or stash and rebase to <commit_id> to amend changes


Answer 16:

git reset --soft HEAD^风回你的承诺,当你键入git status ,它会告诉你该怎么做:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)


Answer 17:

其实我觉得一个更快,更容易的方式是使用git变基交互模式。

git rebase -i head~1  

(或头〜4,到目前为止你想怎么过的去)

然后,而不是“挑”,用“编辑”。 我不知道“编辑”是多么强大。

https://www.youtube.com/watch?v=2dQosJaLN18

希望你会发现它的帮助。



Answer 18:

要是在那里我有在当地的分公司,我想回复只有一个文件修改了同样的问题。 什么工作对我来说是 -

功能/下面target_branch是我有我所有的变化,包括那些我想撤消一个特定的文件)

产地/特征/ target_branch的远程分支,我想我的变化推)

功能/舞台是我的临时分段分支,我会从排除更改为一个文件,我所有的需要进行修改推)

  1. 创建从我的出身/特征/ target_branch本地分支-把它叫做功能/分期

  2. 合并后的我工作的本地分支功能/ target_branch功能/分期

  3. 签出功能/分期然后git的复位--soft ORIG_HEAD( 现在从功能/分期”的所有变化都将上演但未提交。)

  4. 未分级这是我以前使用不必要检查的改变在文件

  5. 改变上游分支为特征/分期原点/特征/ target_branch

  6. 致力于的分级变化的其余部分和上游推到我的远程来源/特征/ target_branch



Answer 19:

如果你不需要这个文件了,你可以这样做

git rm file
git commit --amend
git push origin branch


Answer 20:

如果您使用的GitHub和尚未推提交,GitHub的桌面轻松地解决了这个问题:

  1. 选择存储库 - >撤消最近提交
  2. 取消选择你误添加的文件。 您以前提交信息将在对话框了。
  3. 按提交按钮!


Answer 21:

这是为我工作,以移除位桶式回购的文件,我最初的文件推到分支。

git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push


Answer 22:

如果你不小心添加了一个文件到你的承诺,你可以这样做

git rm --cached path_to_file

小心使用--cached否则你的文件也将被从您的项目中删除。



Answer 23:

如果要删除以前提交使用过滤器文件

git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'

如果您看到此错误:

无法创建新备份。 以前的备份已经存在于裁判/原厂/强制覆盖与-f备份

只是删除您的本地回购裁判备份

$ rm -rf .git/refs/original/refs


Answer 24:

如果你不把你的更改还没有的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  


文章来源: Remove files from Git commit