使用commit提交大文件無法推送到遠程庫解決問題

2021-01-08 cuixiaoyande

記一次使用commit提交大文件無法推送到遠程庫解決問題過程及git rebase使用

大文件無法push到遠程倉庫問題commit的大文件無法push到遠程庫解決辦法git filter-branch命令:git commit後的回滾git reset --hard 丟棄最新的提交git rebase -i 丟棄指定提交git rebasegit rebase執行失敗後的退出git rebase成功後的回退

解決這個問題並沒有特別的(刪除提交歷史中某個文件,然後重新push),但是由於開始的使用失誤,中間有使用git rebase和git reset命令處理,所以特此記錄下

大文件無法push到遠程倉庫

問題

首先,故事(事故)的起因是這樣的。

某次git push(類似測試使用,沒有分支)到遠程倉庫時發生如下無法提交大文件的報錯(大文件是一個pdf文件)

$ git pushEnumerating objects: 204, done.Counting objects: 100% (204/204), done.Delta compression using up to 4 threadsCompressing 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 db501995ac30070d50bdc115a7708f9ba84332d3remote: 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"' HEADRewrite 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~ngit 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(列出最新的兩次提交,然後決定對應提交的操作)

rebase -i是 rebase --interactive 的縮寫;git rebase -i 不僅可以刪除commit, 還可以修改commit。 具體的可以查看rebase中提示的參數

如下執行git rebase查看命令參數:

$ git rebase -i HEAD~2pick 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 reset 和 git 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 -A或git rm <file>,將刪除添加到暫存區, 如果執行 git add. 是不行的,區別如下:git add -A 保存所有的修改(包括刪除的文件、新增文件、已有文件的修改變更)git add . 保存新的添加和修改,但是不包括刪除git add -u 保存修改和刪除,但是不包括新建文件。

相關焦點

  • Git使用教程:最詳細、最傻瓜、最淺顯、真正手把手教!
    現在我們已經提交了一個readme.txt文件了,我們下面可以通過命令git status來查看是否還有文件未提交,如下:我們前面說過使用Git提交文件到版本庫有兩步:第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區。第二步:使用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支上。
  • 優雅的提交你的 Git Commit Message
    起因知乎上有個問題: 如何寫好 Git commit log? 很有意思, 能看到各種提交風格: 有用 emoji 的, 有用唐詩的, 有用隨機生成的. 風格沒有對錯, 只要能夠體現出 commit 所做的修改即可.但是最讓我印象深刻的是 @李華橋 的答案:這種東西,當然要藉助工具了,才能夠寫得即規範,又格式化,還能夠支持後續分析。
  • 大牛總結的 Git 使用技巧,寫得太好了!
    以我使用最頻繁的git命令為例,即提交到github為例。git init 原本本地倉庫只包含著工作區,這是最常見的工作狀態。此時,git init一下,表示在本地區域創建了一個.git文件,版本區建立。git add . 表示把工作區的所有文件全部提交到版本區裡面的暫存區當然你也可以通過 git add ./xxx/ 一條一條分批添加到暫存區。
  • 熟悉Git使用的一些實操練習命令
    1.交互式添加文件的選定部分git add -padd -p(或-patch)允許交互選擇要提交的每個跟蹤文件的各個變化內容。只提交選定的更改。3.交互式撤銷選定文件部分git checkout -p--patch還可用於選擇性地丟棄以已經暫存文件的變化的。4.修改最近的commit信息git commit --amend--amend允許將緩存區的變化添加到之前的commit。
  • Git 常用命令及使用
    Git 常用命令使用1)、本地庫初始化 git init2)、設置籤名作用:區分不同開發人員的身份。說明:這裡設置的籤名和登錄遠程庫(代碼託管中心)的帳戶沒有關係。)c)、提交操作: git commit -m 「commit message」 文件名(將暫存區的內容提交到本地庫)4)、查看歷史記錄a)、git logb)、git log --pretty=onelinec)、git log --onelined)、git reflog (HEAD@{移動到當前版本需要多少步}
  • git環境配置和.gitconfig配置文件詳解
    為此今天蟲蟲專門撰寫本文來介紹下git的基本配置,以幫助大家解疑你遇到一些莫名其妙的問題,答惑為什麼會出現這樣的問題。而實際中這些的出現僅僅是因為你使用了不一樣的配置,而你卻不知道。,你就可以執行commit然後你push推送到github你設置的用戶名,比如此例中的"蟲蟲"會出現在commit歷史中,看github提交歷史:注意該過程需要你github的用戶名和密碼認證一下,該用戶名也可以緩存在本地的配置文件中([credential]部分),如果你用戶名輸入有誤,則需要清除這個
  • git commit emoji 使用指南
    README.md執行 git commit 時使用 emoji 為本次提交打上一個 "標籤", 使得此次 commit 的主要工作得以凸現,也能夠使得其在整個提交歷史中易於區分與查找。commit 格式git commit 時,提交信息遵循以下格式::emoji1: :emoji2: 不超過 50 個字的摘要,首字母大寫,使用祈使語氣
  • 大牛總結的 Git 使用技巧,寫得太好了!快收藏吧
    把工作區的文件全部提交到暫存區git add .// 把工作區的文件提交到暫存區git commit -m "xxx" 把暫存區的所有文件提交到倉庫區,暫存區空空蕩蕩git remote add origin 把本地倉庫與遠程倉庫連接起來git push -u origin master 把倉庫區的主分支
  • 如何規範你的Git commit?
    一般來說,commit message應該清晰明了,說明本次提交的目的,具體做了什麼操作……但是在日常開發中,大家的commit message千奇百怪,中英文混合使用、fix bug等各種籠統的message司空見怪,這就導致後續代碼維護成本特別大,有時自己都不知道自己的fix bug修改的是什麼問題。
  • git 使用跟問題總結
    —— 《淘汰》使用1. 創建並初始化本地版本庫(首先要創建文件夾)    git init2. 添加文件到版本庫     git add 文件名或文件夾名3.提交    git commit -m "標記號"5. 查看修改文件內容    git diff 文件名6. 版本回退    git reset --hard gitid號7.
  • Git 提交的正確姿勢:Commit message 編寫指南
    Git 每次提交代碼,都要寫 Commit message(提交說明),否則就不允許提交。
  • 七個你無法忽視的Git使用技巧 - OSCHINA - 中文開源技術交流社區
    你們有沒有想過,如果自己往倉庫中添加了錯誤的文件,或是將代碼提交到了錯誤的分支,而且提交信息還寫錯了的話,自己怎樣才能取消之前的操作?如果你也是按照上面漫畫中所描繪的一樣操作的(即刪除本地項目文件夾,再重新下載倉庫),那麼你就有必要了解下面這些Git使用技巧了。1.
  • 從工作到現在Git操作總結
    寫在前面你使用過 Git 嗎?或許你還未接觸過Git,或許你已經使用了一段時間,但它或許仍然令你困惑。本文主要講解自己學習Git的方法以及解決自己遇見的各種Git問題。首先強烈給大家推薦掘金小冊 Git 原理詳解及實用指南。(不是託)如果你是新人,讀了這本小冊並且跟著實際操作,你會對Git有一個大致的了解。