简介
git是Linux之父Linus开发出来的用于分布式版本控制的系统软件, 我们项目就式用git来做版本管理的。
基本原理
git流程图
- :工作区
- :暂存区
- :仓库区(或本地仓库)
- :远程仓库
分支管理
- :线上分支 预发环境测试通过后,运营/测试会将此分支代码发布到线上环境;
- :开发分支 开发人员每天都需要拉取/提交的最新代码分支
- :测试分支/预发布分支 开发人员自测通过的bug或功能提交到此分支 发布测试环境 给测试人员测试 大公司一般测试环境和预发布环境是分开的,预发布的数据跟正式的数据库是共用的 这时测试环境测完了才合到预发布分支
- :功能开发分支 开发人员基于dev分支创建的新功能开发分支,开发完成合并到develop 多个新功能可同时进行开发
- :bug修复分支 基于dev或master分支创建的用于bug修复的分支 一般修复完要到release分支进行测试再发布到线上 若基于master修复的 可提交后使用cherry-pick进行复制到develop和release分支
常用命令
- 初始化区(开发前准备 相关命令)—————– 拉取远程仓、初始本地仓 保持本地仓和远程仓一致
git config –global user.name ‘用户名’ 配置全局用户名
git config –global user.email ‘git账 ’ 配置全局用户账
git config –global –unset user.xxx 删除全局配置
git init 初始化git仓库
git remote add origin git@server-name:path/project-name.git 关联远程仓
git remote rm origin 删除已关联的远程仓库
git remote set-url origin git@xxx:xxxxx.git 更新关联的远程仓库
git remote -v 查看远程关联仓库
git clone git@server-name:path/project-name.git project-name 克隆远程仓库代码到本地
- 开发区(开发过程中 常用命令)——————– 本地仓操作、推送远程仓 实现文件最新修改更新至远程仓
git branch 查看分支(本地)
git branch -a 查看分支(本地+远程)
git branch <name> 新建本地分支
git checkout <name> / git switch <name> 切换分支 (如果暂存区有内容会切换到新分支、但是commit的不会被移过去)
git checkout -b <name> / git switch -c <name> 创建+切换
git checkout -b <name> origin/<name> 创建并切换新分支且与远程分支建立联系
git branch -d <name> 删除某分支
git branch -D <name> 强制删除某分支
git branch |grep ‘xxx’ |xarhs git branch -D 批量删除分支
git merge <name> 合并分支到当前分支
git remote update origin -p / git remote update origin –prune 刷新远程仓库分支(清理无效远程追踪分支)
git add <file> 添加到暂存区
git commit -m <message> 提交到本地仓库
git branch –set-upstream-to <branch-name> origin/<branch-name> /
git branch –set-upstream-to=origin/<branch-name> <branch-name> 本地分支和远程分支建立联系(第一次推)
git push 本地仓推送到远程仓
git push –set-upstream origin test / git push -u origin test 推送远程库(第一次推送,要建立联系)
git push origin HEAD –force 强制推送更新远程仓
git merge –no-ff -m ‘merge with no-ff’ dev 合并分支到当前分支(禁用模式)
git rebase 整理提交历史分叉线为一条直线(但分支提交被修改了 不建议使用)
git status 查看工作区状态
git diff 查看修改内容
git log 查看提交历史,回退版本可用
git log –oneline 查看历史记录的紧凑简洁版本
git reflog 查看命令历史,重置回退版本操作可用
git checkout — file 丢弃工作区的修改 (git add 之前用)
git reset HEAD <file> 丢弃暂存区的修改(git add 之后git commit之前用)
git reset –soft HEAD^ 取消上一步commit (commit内容不会删除 会在暂存区可再次提交)
git reset –hard commit_id 版本穿梭 (git commit之后用,也可配合强制推送使用实现回退远程仓)
git reset –hard HEAD^ 本地回退上一个commit
git reset –hard HEAD~3 本地回退3个commit之前的版本,以此类推,回退到n之前
git rm file 删除文件(暂存区和目录都会删掉)
git satsh 暂存工作现场代码
git stash list 查看储藏的代码列表
git stash apply 取出最新储存的代码(不会删除)
git stash drop 删除最新储存的代码
git stash pop 取出+删除最新储存的代码
git stash clear 清空储藏区
- 维护区(开发完成之后 常用命令)—————– 拉取远程区 修复更新远程区
git tag <name> 打标签(默认为HEAD)
git tag <name> commitId 给某一次commit打标签
git tag -a <name> -m ‘说明文字–‘ 打带说明的标签(用指定标签名,指定说明文字)
git tag 查看所有标签
git show <tagname> 查看某个标签
git tag -d <name> 删除标签
git push origin <tagname> 推送某标签到远程
git push origin –tags 一次性推送未推送的本地标签到远程
git cherry-pick commitId 复制特定提交到当前分支
常见问题及处理
Q:版本回退
A: 先回退本地仓库代码,再推送到远程更新—->先git reset –hard HEAD~3 再 git push origin HEAD –force
Q:删除远程标签
A:先删除本地标签 再推送远程删除—> 先git tag -d <tagname> 再git push origin :refs/tags/<tagname
Q: 拉取别人代码分支合并后 不小心删除了别人上传的文件 再拉取提示already-up 怎么办
A: 回滚代码 重新拉取
Q: git pull遇到错误:error: Your local changes to the following files would be overwritten by merge
A:原因是本地有未提交代码
解决方案:
①stash保存 再拉取 stash apply取出 ;
② 如果本地代码不想要 可以直接 git reset –hard 再拉取
Q: git push后出现 src refspec dev does not match any
A: 问题应该是出在了本地分支和远程当前分支不匹配上 新建切换分支 重新提交
Q:git 使用出现MERGING状态 无法提交
A:出现原因 是本地git 和远程 git版本不一致 有冲突
三种解决方法:
1.解决冲突,删除代码中矛盾的代码,然后上传或者下拉
2.回退git reset –hard head到操作前的状态 (一般使用这条即可 但是使用前要记得备份一下本地修改代码)
3.discard删除下载的,或者上传的代码,然后分别check out两个分支
Q: 不小心把本地的某些文件上传到远程仓库/想要删除远程仓库中的文件
A:使用git rm –cached filename 命令 取消对该文件的追踪 git下次提交就不会提交这个文件 从而远程库的该文件也会被删除
Q:每次git push 都会要输入用户名、密码
A:
step 1:打开git bash 生成公钥 ssh-keygen -t rsa -C “xxxxx@xxxxx.com” 三次回车
step 2:查看已生成的公钥 cat ~/.ssh/id_rsa.pub
step3:复制已生成的公钥添加到 git 服务器 并测试 ssh 是否能够连接成功 ssh -T git@github.com
step4:使用 ssh 协议 clone 远程仓库 或者 如果已经用 https 协议 clone 到本地了,那么就重新设置远程仓库
git remote set-url origin git@xxx.com:xxx/xxx.git
Q:git不允许提交空文件夹
A:当前目录 添加一个 .gitkeep 文件
Q: 如何修改最后一次提交 修订提交历史
Q:分支名称出现拼写错误
A:
- 没有push ——-> git branch -m future-brunch feature-branch;
- 已经push 到远程分支 —–>
git branch -m future-brunch feature-branch; // 改名
git push origin –delete future-brunch // 删除远程错误名分支
git push origin feature-branch // 重新推送
Q: 删除远程分支
A: git branch -d <name>
git push origin –delete <name>
Q: git push 或者 git clone时 错:RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
A: git上传文件有限制文件大小 当前上传文件超出git限制
处理方案: git config http.postBuffer 524288000
Q: git分支如何强制覆盖
A:两个方案–
方案Ⅰ.git push origin test:master -f //将test分支强制(-f)推送到主分支master
方案Ⅱ.
git checkout master //将当前分支切换到主分支
git reset –hard test //将主分支重置为test分支
git push origin master -f //将重置后的master分支强制推送到远程仓库
名词备注
- 版本控制:开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的技术。(’后悔药’)
- 分布式:版本控制的一种方式,中心服务器控制最新版本代码,每个开发者自己还有一个本地仓库,开发过程中先把代码提交到本地再推送到服务器上。 如下图:
- 集中式:版本库放在中央服务器上,当需要的时候从中央服务器取得最新版本,修改完毕之后上传到中央服务器。如下图:
- 其他常见的版本控制工具:SVN、CVS (三者的共同点是:免费开源;不同点是:git是分布式 后者是集中式;git不需要联 ,后者需要联 )
- Fast forward模式:git合并分支的默认模式,删除分支会丢掉该分支信息;使用 –no-ff则会生成一条新的commit记录,会禁用该模式
- 知识点:Git Reference简写为refs,是管理本地分支的
1)本地分支的Reference格式:refs/heads/<local_branch_name>
如refs/heads/master,在保证唯一的情况下可以简写为master
2)远程追踪分支的Reference格式:refs/remotes/ <remote_repository>/<remote_branch_name>
Reference Specification简称refspec 在执行push或fetch操作时,refspec用以给出本地Ref和远程Ref之间的映射关系
参考文献
1.廖雪峰的git教程:https://www.liaoxuefeng.com/wiki/896043488029600
2.开发工具之git: https://www.cnblogs.com/wangxinwen/p/9836936.html
3.国外友人总结常用命令: https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf
文章知识点与官方知识档案匹配,可进一步学习相关知识Git技能树首页概览2889 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!