记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用

解决这个问题并没有特别的(删除提交历史中某个文件,然后重新push),但是由于开始的使用失误,中间有使用git rebasegit reset命令处理,所以特此记录下

大文件无法push到远程仓库

问题

首先,故事(事故)的起因是这样的。

某次git push(类似测试使用,没有分支)到远程仓库时发生如下无法提交大文件的报错(大文件是一个pdf文件)

$ git push
Enumerating objects: 204, done.
Counting objects: 100% (204/204), done.
Delta compression using up to 4 threads
Compressing objects: 100% (183/183), done.
Writing objects: 100% (187/187), 419.00 MiB | 2.21 MiB/s, done.
Total 187 (delta 21), reused 0 (delta 0)
remote: Resolving deltas: 100% (21/21), completed with 12 local objects.
remote: Powered by GITEE.COM [GNK-3.8]
remote: error: File: db501995ac30070d50bdc115a7708f9ba84332d3 403.57 MB, exceeds 100.00 MB.
remote: Use command below to see the filename:
remote: git rev-list --objects --all | grep db501995ac30070d50bdc115a7708f9ba84332d3
remote: Please remove the file from history and try again. (https://gitee.com/help/articles/4232)
To gitee.com:findmoon/xxxx.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@gitee.com:findmoon/xxxx.git'

根据提示,如下查看大文件是哪个

commit的大文件无法push到远程库解决办法

首先说一下解决办法,需要修改提交历史,删除已提交到本地仓库的大文件的提交记录,

从commit的提交历史中删除指定文件的命令为git filter-branch --tree-filter 'rm -f 文件名' HEAD

如下,删除大文件

$ git filter-branch --tree-filter 'rm -f "Electron/pdf/677969 xxxx xxx.pdf"' HEAD
Rewrite d1244f8fbc1f08b473bd498c023b09bd8ac3246b (12/12) (156 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

执行删除成功会返回Ref 'refs/heads/master' was rewritten提示,如果返回unchanged则表示没有任何更改。

如果文件路径包含空格需要用引号将删除文件路径包含起来

然后重新push推送成功。

整体操作如下:

git filter-branch命令:

参考自git误commit大文件导致不能push问题解决

git commit后的回滚

撤销已经提交的commit有两种方法:

  • 使用 git reset --hard HEAD^

  • 使用 git rebase -i HEAD~n

git reset --hard 丢弃最新的提交

代码提交后,需求发生变化导致之前提交的已经不合适,或者 代码提交后发现有严重bug,需要回滚可是使用这个命令:

git reset --hard HEAD^

1,HEAD^ 表示 最新提交HEAD位置往回数一个提交, 几个 ^ 就往回数几个提交;

2,HEAD~n 表示 最新提交HEAD位置往回数n个提交

reset 命令只能回滚最新的提交。如果只想删除指定的某个提交,而保留最新的一次或两次commit,reset就无法做到了。

reset命令git 删除某次指定的提交

git rebase -i 丢弃指定提交

如果想撤销中间某次commit的情况,可以使用如下的命令:

git rebase -i HEAD~2(列出最新的两次提交,然后决定对应提交的操作)

  1. rebase -irebase --interactive 的缩写;

  2. git rebase -i 不仅可以删除commit, 还可以修改commit。 具体的可以查看rebase中提示的参数

如下执行git rebase查看命令参数:

$ git rebase -i HEAD~2
pick 71add05 20200225同步
pick 45d4805 测试删除中间某次commit # Rebase 36b460a..45d4805 onto 36b460a (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

常用的如下:

  • edit: 使用本次提交,在rebase到这次提交时候,会暂停下来等待修正

  • pick:使用本次提交,不操作修改

  • drop:删除这次提交

如下,修改查看最近3次的提交,然后删除(drop)倒数第三次commit,保存退出即可将倒数第三次commit中提交的所有内容删除

回滚最新的提交 :git resetgit rebase 命令都可以

回滚中间某次提交: git rebase 可以, git reset 不可以

如果提交已经同步到远程仓库,需要使用git push origin -f branch(分支名) 来将回滚也同步到远程仓库(master 分支谨慎使用 -f)

主要参考自git commit回滚

git rebase

git rebase执行失败后的退出

像上面,执行git rebase有可能导致失败,具体表现为bash中的仓库标识变为了(master|REBASE 1/10)(m/n视reabse编辑内容而定)

解决办法是:执行git rebase --abort即可退出这个错误,回退到当前分支中,且数据和文件也都能恢复。

不小心git rebase后出现(master|REBASE 1/10)的解决办法

git rebase成功后的回退

上面讲的是git rebase失败后的退出(,或回退),如果成功删除了某次commit,导致最终一些文件或数据丢失,如何恢复呢?

不要轻易使用 git rebase -i HEAD 删除某次提交

git rebase -i HEAD~2中删除某次提交的话,这次提交的所有更改和新增文件会全部取消,覆盖本地工作目录中的文件,也就是删除的这次提交和本次提交的上一次提交中间的所有更改都会取消,即使pick了删除提交的下一次提交,也无法保留(保留到最新提交时所有文件和文件夹的状态)

可以使用git reset --hard ID命令,直接恢复commit到指定的提交时刻。

  • git reflog查看git提交记录

如上,可以直接看到需要恢复到的commit ID是多少。比如恢复到Id为71add05的时刻,执行git reset --hard 71add05等待恢复。本地仓库和文件就能恢复到指定提交时刻。

恢复指定的某次commit成功。

git rebase 成功之后如何撤销

git-rebase之食用后悔药

删除文件后需要执行git add -Agit rm <file>,将删除添加到暂存区, 如果执行 git add. 是不行的,区别如下:

  • git add -A 保存所有的修改(包括删除的文件、新增文件、已有文件的修改变更)
  • git add . 保存新的添加和修改,但是不包括删除
  • git add -u 保存修改和删除,但是不包括新建文件。

记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用的更多相关文章

  1. Git 提交大文件提示 fatal: The remote end hung up unexpectedly

    使用gitlab搭建的git server,如果直接使用http的方式去提交的话,提交小文件不会有问题,但是提交大文件时,会出错: fatal: The remote end hung up unex ...

  2. 如何使用 Git LFS 提交大文件?

    参考资料: An open source Git extension for versioning large files Git LFS的使用 如何使用 Git LFS 提交大文件? Git LFS ...

  3. git 将本地文件推送到远程分支的分支

    1.  新建文件夹复制远程分支 2. 切换到远程分支 3. 推送到远程 添加到暂存区,先运行 " git add . " 查看文件状态                     在运 ...

  4. TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。

    整体思路: 创建本地新分支 (create branch)  -- 切换到本地新分支工作 (switch/checkout) --提交修改 (commit)  -- 推送到远程新分支 (push)  ...

  5. Git中使用.gitignore忽略文件的推送

    转载自:https://blog.csdn.net/lk142500/article/details/82869018 windows下可以用另存为生成gitignore 文件 1 简介 在使用Git ...

  6. eclipse 本地项目提交到远程库以及从远程库中添加项目 ---git

    本地项目提交到远程库 1.右击项目->team->share project 2.选择本地库 从远处库中的项目拉到本地 1.右击项目->import项目

  7. gitlab 无法查看提交的文件Errno::ENOMEM (Cannot allocate memory - /opt/gitlab/embedded/bin/git):

    gitlab可以成功clone和push,但是提交后的文件却无法查看.从页面上看的话只显示出500错误. 查了下gitlab的日志 tail -f /var/log/gitlab/gitlab-rai ...

  8. Git学习——把文件推送到远程仓库

    本地仓库与GitHub仓库关联 git remote add origin git@github.com:<github账户名>/<github的仓库名>.git 把本地库的所 ...

  9. git rebase 合并提交 解决超过100M文件的提交不能推送问题

    git log 现在可以看到有3个提交: change 1.mp4 size to small //发现不能推送,又改回小于100M add 1.mp4 big 改变为超过100M add 1.mp4 ...

随机推荐

  1. 缓存数据库之redis

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题 N ...

  2. java语言进阶(一)_Object类_常用API

    第一章 Object类 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如 ...

  3. JVM类加载机制小结

    这篇文章我们关注一个问题:Java程序是怎么进入JVM并执行的?经常写Java程序的小伙伴应该都听说过类加载机制,在<深入理解Java虚拟机>里周老师已经讲的很清楚了,这篇随笔把之前的笔记 ...

  4. 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式

    1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...

  5. 51Nod 1683 最短路

    题意 给定一个未知的\(0/1\)矩阵,对每个\(i\)求\((1,1)\sim(n,m)\)最短路为\(i\)的概率,在矩阵中不能向左走,路径长度为路径上权值为\(1\)的格子个数. \(n\leq ...

  6. USACO07 MAR Face The Right Way G

    疫情当下,美帝又开始倒牛奶了,这一幕似曾相识啊~~~ 这个题目非常的应景,又是美国佬的奶牛 [题目地址] [一句话题意] N头牛排成一列1<=N<=5000.每头牛或者向前或者向后. 为了 ...

  7. 【线型DP】【LCS】UVA_10635 Prince and Princess

    嘤嘤嘤,我又来了,刚A完就写,这个沙雕题有丶恶心.                  ???时间4.11发现所有表情包都莫得了 题目: In an n×n chessboard, Prince and ...

  8. Kail系统更新指令

    0x00源更新 国内更新源 leafpad /etc/apt/sources.list 然后复制粘贴下面的源 #kali官方源 deb http://http.kali.org/kali kali-r ...

  9. 08-Python面对对象进阶

    一.面向对象编程三大特征 Python是面向对象的语言,同样支持面向对象的编程的三大特征:继承,封装,多态. 封装是指隐藏对象的属性和实现细节,只对外提供必要的一些方法,私有属性,私有方法是实现封装地 ...

  10. SpingBoot整合jxls2.0-excel导出—— 列表循环,自定义方法,超链接等

    Java中实现excel导出数据的方法有很多,一般简单的可以通过操作POI进行,但是复杂的excel格式导出如果用POI就显得非常麻烦,本文介绍的jxls2.0完全依据模板进行导出,只需要进行简单的配 ...