git commit命令如何提交一个指定文件_记一次使用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'

根据提示,如下查看大文件是哪个1959bf0168f459c25348324708ee8b21.png

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 推送成功。

整体操作如下:daf29285b4fd6c956db83f032e0191b4.png

git filter-branch命令:

0993d87831983107ce9260d98a901616.png

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

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 删除某次指定的提交[2]

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 = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop = remove commit
# l, label = label current HEAD with a name
# t, reset = reset HEAD to a label
# m, merge [-C | -c ] [# ]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c 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 中提交的所有内容删除

9755524a91fea6344a11d97eb1b7a469.png

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

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

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

主要参考自git commit 回滚[3]

git rebase

git rebase执行失败后的退出

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

7d6b5543b7956d3a3559051041381779.png

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

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

git rebase成功后的回退

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

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

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

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

  • git reflog查看 git 提交记录
8aaad69a1a3eeb6a0fde0592d49cc2c5.png

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

恢复指定的某次 commit 成功。

git rebase 成功之后如何撤销[5]

git-rebase 之食用后悔药[6]

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

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

参考资料

[1]

git 误 commit 大文件导致不能 push 问题解决: https://www.cnblogs.com/samwu/p/9760023.html

[2]

git 删除某次指定的提交: https://www.cnblogs.com/yiven/p/8533644.html

[3]

git commit 回滚: https://www.jianshu.com/p/3c8bc17c69c6

[4]

不小心 git rebase 后出现(master|REBASE 1/10)的解决办法: https://blog.csdn.net/qq_42469247/article/details/88901756

[5]

git rebase 成功之后如何撤销: http://www.pianshen.com/article/693743864/

[6]

git-rebase 之食用后悔药: https://www.jianshu.com/p/48c9644e4bb6

50b74c406845a6967ff09fbd8739ae9f.gif

62efe89578a0336803f3ac567f16c0bc.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值