许多写代码的同学最终终究会有代码管理这个部分,尤其在多设备,代码版本更新,以及多人开发的情况,git就自然而然接触到。当然平常的基于文件以及个人的管理,复杂度低,更新频率低,常用开发设备少的时候,是可以管理得过来的,而git的学习成本还是较高的,有许多命令,有许多教程,还有分支这个概念,搞不好还会因为操作不当导致不知道怎么回退。既然是工具,那就发挥工具的特性,本文希望对于一些主要的操作简单下来,形成一个套路,解决大部分的问题,让我们的精力真正放置于需要解决的问题上来。当然最后一句,其实这个东西我熟悉下来,最重要还是实践,在慢慢实践中,就知道其实没那么困难。
git参考资料
- 说明
- 网上还是有很多资料的,但是优质的资料很少(就是那种我看一篇即可,又学习曲线是平缓上升的),这里参考了一些很好的资料,然后作为一个集合他们的地方,对其评价一下,让后来者有个选择的参考。当然后续的一些总结的操作,也是参考他们的基础上编写的。
- 资料
- 廖雪峰老师的git教程
- 该教程基本上关于git原理以及一些不涉及分支操作的初始化,拉取,推送等基本操作已经说明得很好了
- https://www.liaoxuefeng.com/wiki/896043488029600
- git菜鸟教程
- 该部分也是一个很好的教程,把一些机理以图的形式展示出来,让使用者遇到问题有思考与搜索的方向
- https://www.runoob.com/git/git-tutorial.html
- 交互式学习git指令
- 该教程以动画交互形式让使用者熟悉指令,是一个不错的学习体验
- https://learngitbranching.js.org/?locale=zh_CN
- Github建议指南
- 与github使用流程差不多,看完大概有个模样了
- https://zhuanlan.zhihu.com/p/359342402
- GitLab的安装及使用教程
- 该部分可以让初学者熟悉如何进行git操作(gitlab与github基本一致),跟着操作即可直接入门
- https://www.cnblogs.com/niuben/p/10867877.html
- 廖雪峰老师的git教程
git主要使用情况
- 本地仓库维护与远程仓库协作
- 初始化
$ git init #初始化仓库 $ git config --global user.name "Your Name" #设置账户 $ git config --global user.email "email@excample.com" #设置用户邮箱 $ ssh-keygen -t rsa -C "youremail@example.com" #生成ssh key(用于github ssh认证) $ git remote add origin git@github.com:YourGithubAccount/YourRepository.git #在github申请完仓库后使用,等于链接上仓 $ git remote -v #查询远程连接情况 $ git remote remove origin #删除origin(这个估计指代本地仓库的名字)与对应的远程仓库的链接 $ git push -u origin master #用git push命令,实际上是把当前分支master关联到远程 #(我们第一次推送master分支时,加上了-u参数, #Git就会把本地的master分支内容推送的远程新的master分支)
- 更新
- 补充说明:一般分冲突与不冲突,冲突的话就人为干涉解决,即对应看修改文档两个分支的不一致,看留谁;不冲突,即不同部分存在加减不会影响,该部分基本上不是大变动都不会影响工作使用。
$ git add {$file_name} #增加,把文件从工作区提交到暂存区 $ git add . #把当前目录的情况从工作区提交到暂存区 $ git commit -m "YourMessage" #提交,把文件从暂存区提交到存储区,增加与删除需要提交 $ git clone git@github.com:xxxx/xxxxx.git#利用ssh下载东西(第一次需要) $ git pull #git fetch 与git merge的结合体,直接在远程仓库下拉取下来 $ git fetch / git fetch origin branchNAME #全部拉取远程仓库/只拉取对应的分支, $ git checkout {$branch_name_ptr} #补充,应该在多分支中说明,切换分支时会自动更新工作区 $ git merge {$branch_name_ptr}#拉取完还要合并,合并时会处理冲突与不冲突事宜完会更新工作区 $ git push / git push origin {$branch_name_ptr} #当前分支推送远程仓库/推送指定的分支
- 回退
$ git reset --hard {$branch_node} #把版本库还原成对应节点(ID版本) $ git push -f {$branch_node} #强行把本地库更新至远程库上
- 远程仓库与远程仓库维护(即多人协作)
- 这里不太需要太多疑虑,只能说大家的设计都设计得太好了,只说一下我个人的理解:对于可能存在的风险解答一下,比较疑虑的两个问题就是(1)怕同一分支上,别人更新了bug,我怎么知道以及审核并入,(2)还有,同一分支有两条支线(即别人更新了,我继续更新怎么解决);
- 这上面其实基于四个思想就能协助解决了:(1)是每次修改不是本人或维护者权限都需要开辟新分支然后申请并入,并入时由维护者审核;(2)同一部分的若发生冲突,则亦由维护者选择取舍,通过本地或网页端来审查;(3)借鉴分支的概念,针对不同用途,分支内容的层层提取(即个人->团队->正式分支->测试分支->发布分支),我们只关注此刻与下一步的关系即可,也能保证代码管理的安全性;(4)最后不行认准当前代码如何,不考虑历史关系,克隆下来进行重新创建仓库就好了,以及发生重大失误,则直接回退版本。(工具始终是工具,重要的是人怎么做,能达成目的即可)
- 异常处理
$ git checkout -- . #当前所有文件更新成当前分支储存区的样子 $ git reset . #当add之后,但没commit,需要清空暂存区时使用 $ git log #查询日志,可以看节点ID $ git log --graph #会有树的样子看看仓库历史的样子 $ git status #查询工作区、暂存区、存储区之间的不一致 $ git branch -a #查询有什么分支 $ git push orgin :<destination> #这个可以同时删除远程仓库与本地仓库的分支 $ git clean -f #删除 untracked files $ git clean -d -f #删除目录也一起删掉
奇技淫巧
$ git log --pretty=oneline #查询修改日志(回到过去)
$ git switch dev #切换到dev分支
$ git rebase NAME#把分支添加到对应分支后面
$ git push origin <source>:<destination>
$ git fetch origin <source>:<destination>
$ git revert #也是恢复但是便于提交