1. git pull更新出问题
当遇到如下错误时,一般都是git pull出问题了。
可以使用如下命令解决:
git gc --prune=now //清理优化本地的 git 项目存储库
git pull
若还是报错,则多循环操作几次。
2. repo子模块多,代码量大,更新不完全
若项目仓库repo代码量太大,里面包含很多子模块。每次 (git checkout 分支名)切换分支后,直接git pull可能会更新不全。可以用下面命令确保每次都能把所有模块的代码更新到最新。
git submodule sync --recursive
git submodule update --init --recursive --force
git submodule foreach --recursive git reset --hard HEAD
git submodule foreach --recursive git clean -xffd
最后再git pull一下。
一般出现如下所示 Already up to date. 即代码更新到最新了。
3. 本地修改代码,远程有更新,或临时换任务切换到其他分支开发
(1)在多人协作开发时,经常碰到同事把最新修改推送到远程库,你在本地也做了修改,这个时候无论是执行git pull还是执行git push都会提示错误
我的解决方式如下:
【1】先隐藏掉本地的修改,然后执行git pull从代码块拉取最新代码,具体步骤如下:
1.输入 git status 查看本地的修改
2.输入git stash 隐藏掉本地修改
3.输入 git pull 从代码库拉取更新
4.输入 git stash pop stash@{版本号}
5.然后再git add git commit git push 就行了
【2】还有一种是 放弃本地修改 的改法 ----这种方法会丢弃本地修改的代码,而且不可找回
git reset --hard
git pull
git stash相关指令补充:
- git stash list:查看本地已有的stash版本;
- git stash save “xxx”:加上自己的注解进行缓存;
- git stash apply:与pop相似,但他不会在堆栈中删除这条缓存,适合在多个分支中进行缓存应用也可以进行指定git stash apply stash@{0};
- git stash drop/git stash clear:git stash drop [名] 删除单个缓存,举例git stash drop stash@{0};git stash clear全清;
- git stash show:git stash show [名] 显示与当前分支差异,举例git stash show stash@{0} ,加上-p可以看详细差异;
(2)另外,还有一种情况,因为自己粗心,在git push之前并没有看代码库的提交记录,导致同事做了修改我不知道,但是我已经执行了git add 和 git commit 这个时候怎么撤销掉git commit 呢?
我采用的解决方式如下:
1.先复制你本地的项目到另外一个文件夹
2.输入 git log 查看commit日志,找到最新的提交的commit_id
3.输入git reset - -hard commit_id
4.再把刚才的项目复制过来
5.执行 上面的2 3 4 5步骤就可以了
(3)另外需要注意的问题,当我们git pull 时发现本地的修改和远程代码库的修改有冲突,该怎么解决呢?
这个时候,我们可以根据提示来找到冲突的位置,其中Updated upstream 和=====之间的内容就是pull下来的内容,====和stashedchanges之间的内容就是本地修改的内容,需要我们手动进行确认需要怎么合并.
4. 当某个文件改的面目全非,想还原到远程repo上一样
(1)要修改的文件未添加到暂存区:
就是文件处于untracked状态:
git checkout -- xx/xx/xx.cpp[具体文件路径] //将某个文件复原
(2)要修改的文件已经添加到暂存区:
就是git add .过了,我们需要做如下操作:
- 先把文件恢复到未跟踪状态:
git reset head [filepath] //单个文件
git reset head . //所有文件
- 撤销文件修改:
git checkout -- [filepath]//单个文件
git checkout .//所有文件
这样文件就回到了未修改状态。
5. 本地开发中,copy了一份代码repo,切换到新分支时,遇到如下报错
参考链接
error: pathspec 'XXX新分支名' did not match any file(s) known to git
可以这样解决:
- 首先看下所有分支 是否有新分支
git branch -a
- 如果没看到,那么执行以下操作,这步是获取所有分支
git fetch
执行完会看到如下提示:
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
Unpacking objects: 100% (4/4), 1.06 KiB | 90.00 KiB/s, done.
From codeup.aliyun.com:5eeb0689892c58bb7c394ab5/pxb/pxb-fronted
* [new branch] XXX新分支名 -> origin/XXX新分支名
这时再 git checkout 新分支名 即可。
6. 进行 git cherry-pick commit号 操作时,遇到如下报错:
解决git cherry-pick xxx fatal: bad object xxx
我的情况是在B分支的同步A分支的一个commit,出现了如标题的错误。我是直接在web上看到A分支新提交的这个commit,然后我直接在本地的B分支中进行git cherry-pick xxx,就出现了这个问题。经过尝试 问题是出在了我没有切到B分支pull一下。git pull后即可顺利执行。
总结过来就是git cherry-pick是本地特性,本地要有这个commit才可以被git cherry-pick。
具体git cherry-pick用法可参考 blog