您好,登錄后才能下訂單哦!
這篇文章主要講解了使用commit提交大文件無法推送到遠程庫怎么辦和如何使用git rebase,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
解決這個問題并沒有特別的(刪除提交歷史中某個文件,然后重新push),但是由于開始的使用失誤,中間有使用git rebase
和git 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
(列出最新的兩次提交,然后決定對應提交的操作)
rebase -i
是 rebase --interactive
的縮寫;
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 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
保存修改和刪除,但是不包括新建文件。
看完上述內容,是不是對使用commit提交大文件無法推送到遠程庫怎么辦和如何使用git rebase有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。