Skip to content
2026-09-29 04:201082 字Git版本控制问题排查

使用问题 ​

1 远程分支与本地状态不同步 ​

远程仓库的 master 分支上包含了你的本地仓库所没有的提交

要解决这个问题,你有几个选项:

  1. 拉取并合并远程更改:

    powershell
    git fetch origin  
    git merge origin/master

    如果合并过程中出现了冲突,你需要手动解决这些冲突

    之后,再次尝试推送:

    Shell
    git push origin master
  2. 拉取并变基远程更改:

    Shell
    git pull --rebase origin master

    解决可能出现的任何冲突,然后推送:

    Shell
    git push origin master
  3. 强制推送(不推荐) :

    Shell
    git push -f origin master

    使用 -f 或 --force 选项会覆盖远程分支上的提交,所以需要谨慎使用。

2 发现提交了错误的文件想撤回 ​

  • 安装git filter-repo

    Shell
    pip install git-filter-repo

四种场景解决办法

  1. 只是git add 提交

    Common
    git rm --cached error_file
  2. commit 到本地仓库

    powershell
    git reset HEAD^   # 回到上一个版本
    git gc            # 执行垃圾回收
  3. push 到了远程仓库

    powershell
    git gc
    git filter-repo --path-glob error_file --invert-paths --force
    # 从 Git 历史中移除有关该文件的所有提交
    # filter-repo 不在$PATH,前面要加python3
    git gc --aggressive 
    
    # 需要重新添加remote
    git remote add origin git@gitee.com:star-nebula/school_work.git
    git push --all --force   # 推送所有本地分支到远程仓库
    git push --tags --force  # 推送所有本地标签到远程仓库
  4. 提交文件的是别人

    方法一:获取TOP 10 的blob对象的文件名 ,然后进行筛选

    Shell git gc git rev-list --objects -all | grep -f <(git verify-pack -v .git/objects/pack/*.idx | grep blob | sort -k 3 -n | cut -f 1 -d " " | tail -10) # 从pack中获取所有对象记录 git largefiles -t 10

    • rev-list --objects -all 列举当前仓库中的所有object对象

    • git verify-pack -v .git/objects/pack/*.idx verify-pack 根据索引文件输出所有对象的ObjectID、对象类型、大小等

    • grep blob过滤所有非 blob 对象

    • sort -k 3 -n 把结果以第三个字段进行数字排序

    • cut -f 1 -d " " 按空格分离字段,取第一个字段

    • tail -10 取尾部的十行数据

    方法二:

    Shell
    git filter-repo --path-glob error_file --invert-paths --force
    ## 从 Git 历史中移除有关该文件的所有提交
    ## filter-repo 不在$PATH,前面要加python3
    git gc --aggressive
    
    ## 需要重新添加remote
    git remote add origin git@gitee.com:star-nebula/school_work.git
    git push --all --force
    git push --tags --force

3 提交文件超过限制 ​

  • 前提,文件在自己的工作目录中

    powershell
    1. 找到大文件所在的提交
    git rev-list --objects --all | grep 60a9cbcafdfa737b9940a515eafad1230de00c17
    2. 用 git filter-repo 从 Git 历史中移除这个文件
    git filter-repo --path-glob error_file --invert-paths --force   # filter-repo 不在$PATH,前面要加python3
    3. 垃圾清理
    git gc --aggressive 
    4. 重新添加remote和提交
    git remote add origin git@gitee.com:star-nebula/school_work.git
    git push --all --force
    git push --tags --force
    powershell
    # 清理全部jpg
    git filter-repo --path-glob '*.jpg' --invert-paths

4 代码并非通过克隆所得 ​

此时本地的代码未被跟踪

Common Lisp git add . git commit -m "Initial commit with project files" git branch # 未提交之前看不到任何分支

多人协作开发时使用 git pull 的问题 ​

多人协作时,优先使用 get pull --rebase​

若遇到冲突 git rebase --abort​ 撤销拉取

再通过 git pull​ 拉取代码并解决冲突,或用交互式变基来解决合并冲突

  • 多人协作开发时,直接使用 git pull​ 可能会导致历史混乱

    原因:与他人的提交有相同的祖先节点,默认情况下,git pull​ 会通过创建一个全新的提交来合并这两个新的提交

    ​

    提交历史中将会存在大量无意义的提交,不利于查看提交历史

  • 更适合的做法:将自己的提交放到他人的后面 (使用 get pull --rebase​ )

    • ​get pull --rebase​

      将本地提交暂存,然后执行拉取操作 git pull​,最后再将本地提交应用到更新后的代码中

    • 若发生合并冲突,系统会出现提示,此时需要执行 git rebase --abort​ 撤销整个拉取操作

      再使用 git pull​ 拉取代码,然后按照常规方式解决冲突

‍

每一篇文章,都是时间的标本