此篇文章记录本人在使用git命令时遇到的问题,及其处理办法。
1、回退版本至某次提交
首先,需要知道这次提交的commit id,可以使用git log命令,根据自己的提交日志及时间查找id
然后,使用git reset命令将本地分支强制重置为id时的状态,如下
git reset --hard commit-id
注:commit-id是git log中找到的id。
最后,如果需要将此回退推送到远程仓库,可以使用强制推送,如下
git push origin HEAD --force
需要注意的是,这个提交会将远程仓库强制覆盖,请谨慎使用。
2、.gitignore文件修改不起作用
产生这个问题的原因,是因为ignore文件中新增的忽略文件在之前的版本中已经提交至远程库。
解决办法就是要删除忽略文件在本地的git缓存,再提交至远程库,如下
git rm -r --cached xxx.file
git commit -m ``"ignore"
git push
3、如何删除中间的某次提交
某次提交不小心push到远程仓库了,不用担心,如下即可
git rebase -i pre_commit_id(前一次提交id)
# 接下来将需要删除的提交 pick修改为 drop
# 然后Esc后 wq保存
# 最后强制推送至远程
git push origin HEAD --force
注意:这种方式会刷新该次提交之后的提交记录,会为他们生成一个新的commit_id,故:慎用。
4、gitlab push时出现GitLab: You are not allowed to force push code to a protected branch on this project
登录至gitlab取消保护即可
5、git 创建tag、删除tag相关的命令
## 创建本地tag,tag名为xxx
git tag xxx
## 将本地tag名xxx推送至远端
git push origin xxx
## 删除tag名xxx
git tag -d xxx
## 将删除的tag名xxx推送至远端
git push origin :refs/tags/xxx
6、github如何创建一个Release版本
直接按照github中的创建按钮操作就行,如果没有tag,它会自动生成一个对应的tag
7、git子模块更新问题
git的子模块只映射到某一次提交记录,若一个项目存在子模块,只需要运行下面两条命令即可
git submodule init
git submodule update
这种办法只会更新至当前项目映射的提交记录,并不会更新子模块最新的提交。
关于这个问题,你切换至子模块看看子模块的分支便可知道原因
F:\father\child>git branch
* (HEAD detached at c6ca594)
local
master
当前子模块并不在任何分支,而是在一个分离的HEAD分支。
这个时候,如果你需要合并最新的代码至当前主模块,只需要合并需要的分支即可
# 将local分支的最新记录合并至当前分支
F:\father\child>git merge local
# 回到主模块,提交当前的合并记录,并推送至远程分支
F:\father>git add child
F:\father>git commit -m ``"合并local最新提交"
F:\father>git push
这就大功告成了。
这里有一点需要注意,我们偶尔需要在子模块进行开发,如果在子模块切换了分支,就找不到分离HEAD分支了。
这个时候回到主模块,强制更新一下即可
F:\father>git submodule update -f
根据.gitsubmodule文件同步远端代码
git submodule update --remote
8、远程仓库迁移,修改本地的远程仓库地址
git remote set-url origin http:``//git.sxw.cn/web-base/boot-clean.git