使用问题
1 远程分支与本地状态不同步
远程仓库的 master 分支上包含了你的本地仓库所没有的提交
要解决这个问题,你有几个选项:
拉取并合并远程更改:
powershellgit fetch origin git merge origin/master如果合并过程中出现了冲突,你需要手动解决这些冲突
之后,再次尝试推送:
Shellgit push origin master拉取并变基远程更改:
Shellgit pull --rebase origin master解决可能出现的任何冲突,然后推送:
Shellgit push origin master强制推送(不推荐) :
Shellgit push -f origin master使用
-f或--force选项会覆盖远程分支上的提交,所以需要谨慎使用。
2 发现提交了错误的文件想撤回
安装git filter-repo
Shellpip install git-filter-repo
四种场景解决办法
只是git add 提交
Commongit rm --cached error_filecommit 到本地仓库
powershellgit reset HEAD^ # 回到上一个版本 git gc # 执行垃圾回收push 到了远程仓库
powershellgit 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 # 推送所有本地标签到远程仓库提交文件的是别人
方法一:获取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 10rev-list --objects -all列举当前仓库中的所有object对象git verify-pack -v .git/objects/pack/*.idxverify-pack 根据索引文件输出所有对象的ObjectID、对象类型、大小等grep blob过滤所有非 blob 对象sort -k 3 -n把结果以第三个字段进行数字排序cut -f 1 -d " "按空格分离字段,取第一个字段tail -10取尾部的十行数据
方法二:
Shellgit 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 提交文件超过限制
前提,文件在自己的工作目录中
powershell1. 找到大文件所在的提交 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 --forcepowershell# 清理全部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 拉取代码,然后按照常规方式解决冲突