Git(1) 常见题目及解决办法_详细版

打印 上一主题 下一主题

主题 559|帖子 559|积分 1677




  • 推荐:《Android体系开发中高级定制专栏导读》

   Git是一个非常强大和灵活的版本控制体系,但也会遇到一些题目和错误。本文将先容一些Git常见题目及解决办法,帮助你更好地使用Git。
  前言

Git有时候会出现一些题目和错误,常见比如:


  • 网络题目,导致无法毗连远程仓库或者传输数据失败。
  • 辩论题目,导致无法归并分支或者提交更改。
  • 文件题目,导致无法读取或者写入文件或者目录。
  • 设置题目,导致无法精确设置或者使用Git的功能或者选项。
这些题目可能会让我们头皮发麻,不要担心,本文将为你提供一些常见题目及解决办法,如果我后面还有GIT干系题目 我会补充到这篇文章中。
题目1:fatal: unable to read tree

如果在实行git status命令时遇到了fatal: unable to read tree的错误,可能是由于的.git目录中的某些文件被损坏了。这可能是由于磁盘故障等原因造成的。
解决办法:


  • 如果有备份或者克隆了远程仓库,可以实验从备份或者远程仓库恢复损坏的文件。
  • 如果你有备份或者克隆了远程仓库,可以实验使用git fsck命令来检查并修复损坏的文件。如果修复乐成,可以继承使用git status命令查看状态。如果修复失败,可能必要重新初始化一个新的仓库,并且重新添加和提交的文件。
  • 如果你既修复不乐成, 也没备份远程分支 凉凉。
示例:
  1. # 假设mstar项目遇到了这个问题
  2. git status
  3. fatal: unable to read tree 390b54109ff2aba9c01a93c352251a9b562ec1c6
  4. # 尝试从远程仓库恢复
  5. git fetch origin
  6. git reset --hard origin/master
  7. # 或者尝试使用git fsck修复
  8. git fsck --full
  9. Checking object directories: 100% (256/256), done.
  10. Checking objects: 100% (1024/1024), done.
  11. error: refs/heads/master does not point to a valid object!
  12. error: refs/remotes/origin/master does not point to a valid object!
  13. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  14. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  15. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  16. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  17. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  18. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  19. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  20. error: 390b54109ff2aba9c01a93c352251a9b562ec1c6: invalid sha1 pointer in cache-tree
  21. dangling blob 4f3d8f8f7e5f8f7e5f8f7e5f8f7e5f8f7e5f8f7e
  22. dangling blob 3d2f7f6f6e4f6e4f6e4f6e4f6e4f6e4f6e4f6e4f
  23. dangling blob 2d1f6e5e5d4e5d4e5d4e5d4e5d4e5d4e5d4e5d4e
  24. # 如果修复成功,继续使用git status
  25. git status
  26. On branch master
  27. Your branch is up to date with 'origin/master'.
  28. nothing to commit, working tree clean
  29. # 如果修复失败,重新初始化一个新的仓库,并且重新添加和提交你的文件
  30. rm -rf .git
  31. git init
  32. git add .
  33. git commit -m "Initial commit"
  34. git remote add origin https://gitee.com/mstar/mstar.git
  35. git push -u origin master
复制代码
题目2:error: remote origin already exists.

如果在实行git remote add origin命令时遇到了error: remote origin already exists.的错误,可能是由于已经关联了一个名为origin的远程仓库,而又想关联一个不同的远程仓库。这可能是由于克隆了别人的仓库,在此底子上完成的代码,推送到本身的仓库时造成的。
解决办法:


  • 如果想保留原来的远程仓库,可以使用不同的名字来关联新的远程仓库,比如git remote add new-origin https://gitee.com/xxxxxx.git。
  • 如果想更换原来的远程仓库,可以先使用git remote rm origin命令来删除关联的origin的远程库,然后再使用git remote add origin https://gitee.com/xxxxxx.git命令来关联新的远程仓库。
示例:
  1. # 假设克隆了别人的仓库,并且完成了你的代码,想推送到自己的仓库
  2. # 尝试关联自己的仓库
  3. git remote add origin https://gitee.com/xxxxxx.git
  4. error: remote origin already exists.
  5. # 保留原来的远程仓库,使用不同的名字来关联新的远程仓库
  6. git remote add new-origin https://gitee.com/xxxxxx.git
  7. # 或者替换原来的远程仓库,先删除关联的origin的远程库,再关联新的远程仓库
  8. git remote rm origin
  9. git remote add origin https://gitee.com/xxxxxx.git
  10. # 最后推送到自己的仓库
  11. git push -u origin master
复制代码
题目3:Updates were rejected because the tip of your current branch is behind

如果在实行git push命令时遇到了Updates were rejected because the tip of your current branch is behind的错误,可能是由于本地分支落后于远程分支,导致无法推送你的更改。这可能是由于在推送之前没有拉取远程分支的最新更改造成的。
解决办法:


  • 如果你想保留远程分支的更改,可以先使用git pull命令来拉取并归并远程分支的最新更改,然后再使用git push命令来推送你的更改。如果归并过程中出现辩论,必要先解决辩论,然后再提交和推送。
  • 如果想覆盖远程分支的更改,你可以使用git push -f命令来强制推送你的更改,这样会把远程分支的历史重写为你的本地分支的历史。注意,这是一个伤害的操纵(本身负责),可能会导致其他人的工作丢失,所以请谨慎使用。
示例:
  1. # 假设你在本地分支master上完成了你的代码,想推送到远程分支master
  2. # 尝试推送
  3. git push
  4. To github.com:xxx/xxx_blog.git
  5. ! [rejected]        master -> master (non-fast-forward)
  6. error: failed to push some refs to 'github.com:xxx/xxx_blog.git'
  7. hint: Updates were rejected because the tip of your current branch is behind
  8. hint: its remote counterpart. Integrate the remote changes (e.g.
  9. hint: 'git pull ...') before pushing again.
  10. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  11. # 拉取并合并远程分支的最新更改
  12. git pull
  13. From github.com:xxx/xxx_blog
  14. * [new branch]      master     -> origin/master
  15. Merge made by the 'recursive' strategy.
  16. README.md | 2 ++
  17. 1 file changed, 2 insertions(+)
  18. create mode 100644 README.md
  19. # 或者强制推送覆盖远程分支的更改
  20. git push -f
  21. Counting objects: 3, done.
  22. Delta compression using up to 4 threads.
  23. Compressing objects: 100% (3/3), done.
  24. Writing objects: 100% (3/3), 328 bytes | 328.00 KiB/s, done.
  25. Total 3 (delta 0), reused 0 (delta 0)
  26. To github.com:xxx/xxx_blog.git
  27. + 11bbalf...900252a master -> master (forced update)
复制代码
题目4:如果误删了.git/index

如果误删了.git/index文件,会导致git status命令显示所有的文件都是未跟踪的,即使没有修改过它们。这是由于.git/index文件是一个缓存文件,它记载了你的工作区和暂存区的状态,以及最近一次提交的快照。如果删除了这个文件,Git就无法精确地比较你的工作区和暂存区和提交之间的差异。卧槽™当时吓死我了,别慌 看我的处置惩罚履历!
解决办法:


  • 如果有备份或者克隆了远程仓库,可以实验从备份或者远程仓库恢复.git/index文件。
  • 如果没有备份或者克隆了远程仓库,可以实验使用git reset命令来重修.git/index文件。这个命令会把你的暂存区重置为你指定的提交的快照,并且重新天生.git/index文件。请注意,这个命令不会影响你的工作区,所以必要先把你修改过的文件备份起来,然后再实行这个命令。
示例:
  1. # 假设你误删了.git/index文件
  2. # 尝试从远程仓库恢复
  3. git fetch origin
  4. cp .git/refs/remotes/origin/master .git/index
  5. # 或者尝试使用git reset重建
  6. # 先把修改过的文件备份起来
  7. cp -r src src_backup
  8. cp -r test test_backup
  9. # 然后执行git reset命令
  10. git reset
  11. Unstaged changes after reset:
  12. M       src/main.c
  13. M       test/test.c
  14. # 最后把备份的文件还原回来
  15. cp -r src_backup/* src
  16. cp -r test_backup/* test
复制代码
题目5:如果不想通过git status看到文件模式的更改

每次改个文件权限后通过git status查看就是一篇红,看着头皮发麻, 如果不想通过git status命令看到文件模式(也就是文件权限)的更改,比如:
  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4.   (use "git add <file>..." to update what will be committed)
  5.   (use "git restore <file>..." to discard changes in working directory)
  6.         modified:   README.md (mode change 100644 => 100755)
  7. no changes added to commit (use "git add" and/or "git commit -a")
复制代码
可以使用git config命令来设置Git忽略文件模式变革。在Git 2.9及以上版本中,可以通过以下方式设置:
  1. git config core.filemode false
复制代码
其中--global选项是可选的,如果使用,则会将该设置应用于所有存储库。
此设置告诉Git在比较文件时忽略文件模式更改,从而不会将其报告为未提交更改。请注意,这不影响Git应用文件模式更改; 它只是影响Git如何显示文件模式更改。
请注意,如果你使用旧版本的Git,则可能无法使用该选项。在这种情况下,最好的方法是使用.gitignore文件忽略文件模式变革。具体方法请参考这里。
题目6:网络防火墙阻止了HTTPS协议的访问

如果在实行git clone命令时遇到了网络防火墙阻止了HTTPS协议的访问的题目,可能是由于所在的网络环境不答应使用HTTPS协议来访问远程仓库,而只答应使用HTTP协议。这可能是由于你所在的网络环境有一些安全策略或者限定造成的。
解决办法:


  • 如果可以更改你所在的网络环境,可以实验使用一个不受限定的网络环境来访问远程仓库,比如使用V-P-N或者呆理等方式。
  • 如果不能更改你所在的网络环境,可以实验使用HTTP协议来访问远程仓库,只必要把远程仓库的URL中的https更换为http即可。请注意,这样做可能会降低你的数据安全性,由于HTTP协议不是加密的。
示例:
  1. # 假设你想克隆LiteOS仓库
  2. # 尝试使用HTTPS协议
  3. git clone https://gitee.com/LiteOS/LiteOS.git
  4. Cloning into 'LiteOS'...
  5. fatal: unable to access 'https://gitee.com/LiteOS/LiteOS.git/': Failed to connect to gitee.com port 443: Connection refused
  6. # 使用HTTP协议
  7. git clone http://gitee.com/LiteOS/LiteOS.git
  8. Cloning into 'LiteOS'...
  9. remote: Enumerating objects: 109, done.
  10. remote: Counting objects: 100% (109/109), done.
  11. remote: Compressing objects: 100% (76/76), done.
  12. remote: Total 109 (delta 25), reused 0 (delta 0), pack-reused 0
  13. Receiving objects: 100% (109/109), 1.12 MiB | 1.01 MiB/s, done.
  14. Resolving deltas: 100% (25/25), done.
复制代码
题目7:fetch --nohooks chromium

想拉取最新的chromium代码,可以使用fetch --nohooks chromium命令来实行这个操纵。这个命令会从远程仓库拉取所有的分支和标签,并且更新你的本地分支和远程跟踪分支。--nohooks选项表现不实行任何钩子脚本,这样可以加速拉取的速率。
如果你不必要特定版本的chromium,推荐使用fetch --nohooks chromium --no-history命令,加入--no-history选项能少下载靠近一半的数据量,由于它会只拉取最新的提交,而不是整个历史。这样可以节流你的网络流量和磁盘空间。
如果必要特定版本的chromium,必须全量拉取,否则切换版本时错误较多,一个个修复相称贫苦。可以使用fetch --nohooks chromium --force命令来强制全量拉取,这样会覆盖你本地的任何更改,并且包管你和远程仓库完全同步。注意,这是一个伤害的操纵,可能会导致你的工作丢失,所以用了本身负责哈。
示例:
  1. # 拉取最新的chromium代码
  2. fetch --nohooks chromium
  3. Running: git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src.git /home/user/chromium/src
  4. Cloning into '/home/user/chromium/src'...
  5. remote: Sending approximately 1.01 GiB ...
  6. remote: Counting objects: 1, done
  7. remote: Finding sources: 100% (1/1)
  8. remote: Total 1 (delta 0), reused 1 (delta 0)
  9. Receiving objects: 100% (1/1), 1.01 GiB | 2.00 MiB/s, done.
  10. Running: git -c core.deltaBaseCacheLimit=2g rev-parse --verify HEAD
  11. Running: git config branch.master.remote origin
  12. Running: git config branch.master.merge refs/heads/master
  13. Running: git config remote.origin.url https://chromium.googlesource.com/chromium/src.git
  14. Running: git config remote.origin.fetch +refs/branch-heads/*:refs/remotes/branch-heads/* +refs/tags/*:refs/tags/*
  15. Running: git config remote.origin.mirror true
  16. # 拉取最新的chromium代码,不拉取历史
  17. fetch --nohooks chromium --no-history
  18. Running: git -c core.deltaBaseCacheLimit=2g clone --depth=1 --no-checkout --progress https://chromium.googlesource.com/chromium/src.git /home/user/chromium/src
  19. Cloning into '/home/user/chromium/src'...
  20. remote: Sending approximately 551.63 MiB ...
  21. remote: Counting objects: 1, done
  22. remote: Finding sources: 100% (1/1)
  23. remote: Total 1 (delta 0), reused 1 (delta 0)
  24. Receiving objects: 100% (1/1), 551.63 MiB | 2.00 MiB/s, done.
  25. Running: git -c core.deltaBaseCacheLimit=2g rev-parse --verify HEAD
  26. Running: git config branch.master.remote origin
  27. Running: git config branch.master.merge refs/heads/master
  28. Running: git config remote.origin.url https://chromium.googlesource.com/chromium/src.git
  29. Running: git config remote.origin.fetch +refs/branch-heads/*:refs/remotes/branch-heads/* +refs/tags/*:refs/tags/*
  30. Running: git config remote.origin.mirror true
  31. # 强制全量拉取特定版本的chromium代码
  32. fetch --nohooks chromium --force
  33. Running: git -c core.deltaBaseCacheLimit=2g fetch origin +refs/heads/* +refs/tags/* +refs/branch-heads/* +refs/change/* +refs/gerrit/* +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* +refs/branch-heads/*:refs/remotes/branch-heads/* +refs/change/*:refs/remotes/change/* +refs/gerrit/*:refs/remotes/gerrit/*
  34. remote: Sending approximately 1.01 GiB ...
  35. remote: Counting objects: 1, done
  36. remote: Finding sources: 100% (1/1)
  37. remote: Total 1 (delta 0), reused 1 (delta 0)
  38. Receiving objects: 100% (1/1), 1.01 GiB | 2.00 MiB/s, done.
  39. Running: git -c core.deltaBaseCacheLimit=2g reset --hard origin/master
  40. HEAD is now at 900252a Initial commit
复制代码
题目8:2021年2/3 日 .git/index.lock

在实行git命令时遇到了.git/index.lock文件的题目,可能是由于你的.git目录中存在一个名为index.lock的文件,它是一个锁文件,用来防止多个进程同时修改.git/index文件。这个文件通常会在git命令实行完毕后主动删除,但有时候可能会由于某些原因(比如程序崩溃等)而残留在.git目录中,导致你无法实行其他的git命令。注意删的时候别敲错了 不然你可能会遇到题目4。
解决办法:


  • 如果确定没有其他的进程在使用git命令,可以实验手动删除.git/index.lock文件,然后再实行你想要的git命令。
  • 如果不确定是否有其他的进程在使用git命令,可以实验使用ps -ef | grep git命令来查看是否有其他的进程在运行git命令,如果有,可以等候它们竣事或者杀死它们,然后再删除.git/index.lock文件。
示例:
  1. # 假设你想执行git status命令
  2. # 尝试执行
  3. git status
  4. fatal: Unable to create '/home/user/chromium/src/.git/index.lock': File exists.
  5. Another git process seems to be running in this repository, e.g.
  6. an editor opened by 'git commit'. Please make sure all processes
  7. are terminated then try again. If it still fails, a git process
  8. may have crashed in this repository earlier:
  9. remove the file manually to continue.
  10. # 确定没有其他进程在使用git命令,手动删除.git/index.lock文件
  11. rm -rf .git/index.lock
  12. # 或者查看是否有其他进程在运行git命令
  13. ps -ef | grep git
  14. user     1234  1233  0 10:00 pts/0    00:00:00 git commit
  15. user     1235  1234  0 10:00 pts/0    00:00:00 vim .git/COMMIT_EDITMSG
  16. user     1236  1235  0 10:00 pts/0    00:00:00 git status
  17. # 等待或者杀死其他进程
  18. kill -9 1234
  19. kill -9 1235
  20. kill -9 1236
  21. # 然后再删除.git/index.lock文件
  22. rm -rf .git/index.lock
  23. # 最后再执行想要的git命令
  24. git status
  25. On branch master
  26. Your branch is up to date with 'origin/master'.
  27. nothing to commit, working tree clean
复制代码
题目9:index-pack failed

如果你在实行git clone命令时遇到了index-pack failed的错误,可能是由于在传输数据的过程中发生了一些题目,导致数据不完整或者损坏。这可能是由于网络不稳固、远程仓库不可用、磁盘空间不足等原因造成的。
解决办法:


  • 如果你怀疑是网络不稳固的原因,你可以实验使用git config命令来增加HTTP传输的缓冲区大小,比如:
    1. git config --global http.postBuffer 524288000
    复制代码
    这样可以镌汰传输过程中的分包和重连,进步传输效率。然后再重新克隆远程仓库。
  • 如果你怀疑是远程仓库不可用的原因,你可以实验访问远程仓库的网页,看是否能正常打开,或者使用ping命令来测试网络连通性,比如:
    1. ping gitee.com
    复制代码
    如果网页无法打开或者网络不通,说明远程仓库有题目,你必要等候它恢复正常后再重新克隆。
  • 如果你怀疑是磁盘空间不足的原因,你可以实验使用df -h命令来查看你的磁盘空间使用情况,比如:
    1. df -h
    2. Filesystem      Size  Used Avail Use% Mounted on
    3. /dev/sda1       100G   80G   15G  85% /
    4. /dev/sda2       200G   50G  140G  25% /home
    复制代码
    如果你发现你的磁盘空间不足,你必要清算一些不必要的文件或者扩大你的磁盘空间,然后再重新克隆远程仓库。
示例:
  1. # 假设你想克隆一个远程仓库# 实验克隆git clone https://gitee.com/xxxxxx.gitCloning into 'xxxxxx'...remote: Enumerating objects: 1024, done.remote: Counting objects: 100% (1024/1024), done.remote: Compressing objects: 100% (512/512), done.error: RPC failed; curl 18 transfer closed with outstanding read data remainingfatal: the remote end hung up unexpectedlyfatal: early EOFfatal: index-pack failed# 增加HTTP传输的缓冲区大小git config --global http.postBuffer 524288000
  2. # 再重新克隆远程仓库git clone https://gitee.com/xxxxxx.gitCloning into 'xxxxxx'...remote: Enumerating objects: 1024, done.remote: Counting objects: 100% (1024/1024), done.remote: Compressing objects: 100% (512/512), done.Receiving objects: 100% (1024/1024), 1.00 MiB | 1.00 MiB/s, done.Resolving deltas: 100% (256/256), done.
复制代码
总结

本文先容了一些Git常见题目及解决办法,希望能够帮助你更好地使用Git。固然,Git还有很多其他的题目和功能,如果你想了解更多,你可以参考以下的资源:


  • Git官方文档
  • Git常见题目解答
  • Git教程
感谢你阅读本文,如果你有任何题目或者建议,接待留言或者接洽我。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表