Git 使用介绍
Git 使用介绍
一、什么是Git?
Git是一个分布式版本控制软件,与SVN、CVS一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。Git是由Linux之父 Linus(莱纳斯)创建。
在 Git诞生之前,Linus选择使用 BitKeeper 进行 Linux 版本管理。BitKeeper 是一个闭源的商业软件,这个决定长期受到社区的质疑和争议。2005 年,一位 Linux 开发成员 Andrew( 安德鲁)(Samba 协议之父)写了一个可以连接 BitKeeper 仓库的外挂,因此 BitMover 公司(BitKeeper 持有者)认为他反编译了 BitKeeper。BitMover 决定中止 Linux 免费使用 BitKeeper 的授权。最终 Linux 团队与 BitMover 磋商无果,Linus决定开发自己的版本管理系统。十天后,git 诞生了。
二、Git VS SVN
SVN 是集中式管理
优点
-
集中式管理,管理方式在服务端配置好,客户端只需要同步提交即可,使用方便,操作简单,很容易就可以上手。
-
在服务端统一控制好访问权限,利用代码的安全管理。
-
所有的代码以服务端为准,代码一致性高。
缺点
-
所有操作都需要通过服务端进行同步,这会导致服务器性能要求比较高。如果服务器宕机了就无法提交代码。
-
分支管理不灵活,SVN 分支是一个完整的目录,且这个目录拥有完整的实际文件,这些操作都是在服务端进行同步的,不是本地化操作,如果要删除分支,也是需要将远程的分支进行删除,这会导致大家都得同步。
-
如果无法连接到SVN 服务器,就无法提交自己的代码,更别说还原、对比等操作了。如果在内网还好,网速比较稳定,同步相对比较快,如果是通过外网同步,有可能就需要同步很久。
Git是分布式管理
优点
-
分布式开发时,可以git克隆一个本地版本,然后在本地进行操作提交,本地可以完成一个完整的版本控制。在发布的时候,使用git push来推送到远程即可。
-
git分支的本质是一个指向提交快照的指针,速度快、灵活,分支之间可以任意切换。都可以在本地进行操作可以不同步到远程。
-
冲突解决,多人开发很容易就会出现冲突,可以先pull远程到本地,然后在本地合并一下分支,解决好冲突,在push到远程即可。
-
离线工作,如果git服务器出现问题,也可以在本地进行切换分支的操作,等联网后再提交、合并等操作。
缺点
-
git没有严格的权限控制,一般是通过系统设置文件的读写权限来做权限控制。
-
工作目录只能是整个目录,而svn可以单独checkout某个有权限的目录。
-
git上手可能没有svn那样顺手,需要经过学习一下。
三、安装Git
- Git安装包下载地址:https://git-scm.com/downloads ,根据自己的操作系统选择下载Git安装包。
- Git安装教程 :
- TortoiseGit安装包下载地址:https://tortoisegit.org/download/ ,根据自己的操作系统选择下载Git安装包。
- TortoiseGit安装汉化教程:https://www.jianshu.com/p/33108325fc87
四、Git使用流程
日常使用记住下图6个命名就够用了。
几个专用名词的译名如下:
- Workspace:工作区
- Index / Stage:暂存区
- Repository:本地仓库
- Remote:远程仓库
五、公司Git使用流程
公司项目规定分三个分支:
- master分支:与生产环境同步,被保护的分支,不允许提交代码和合并代码。
- develop分支:开发人员的主要分支。
- feature分支 :收到新的开发任务,开发人员基于develop创建对应的feature分支,基于这个分支编写新功能,完成开发以后合并到develop分支。
- release分支:
1. 新建/关联仓库
1.1 设置身份
# 设置全局姓名
git config --global user.name "fuqian"
# 设置全局邮箱
git config --global user.email "fuqian@qq.com"
# 查看git配置
git config --list
1.2 关联项目
本地早已有my-test项目(创建my-test项目,创建a.java,输入内容a),然后打开
gitlab登陆账号,创建my-test项目。
# 初始化本地仓库
git init
# 连接到远程仓库
git remote add origin http://192.168.86.130/fuqian/my-test.git
# 添加所有文件
git add -A
# 提交所有文件到本地仓库
git commit -m "上传项目代码"
# 将项目推送到远程仓库
git push -u origin master
1.3克隆项目
打开
gitlab登陆账号,选择clone with http, 还有另外一种方式是SSH。
git clone git http://127.0.0.1/fuqian/my-test.git
1.4 创建develop分支
? 在本地创建develop分支,切换到develop分支,并且把develop分支推送到远程仓库。
# 创建分支
git branch develop
# 切换分支
git checkout develop
# 推送本地分支到远程仓库
git push origin develop:develop
默认master分支是保护分支,推送和合并分支受保护。
3. 开发新功能
今天项目经理安排了开发客户信息管理的新功能,那你应该创建新的feature分支,名称叫customer
# 创建分支
git branch customer
# 切换分支
git checkout customer
开发了一天,你创建了很多代码文件。但是要下班了,但是客户信息管理的功能还是没有开发完成,你又害怕电脑硬盘丢失数据,想把本地代码上传到gitlab上备份。
# 推送本地分支到远程仓库
git push origin customer:customer
# 添加所有文件
git add -A
# 提交所有文件到本地仓库
git commit -m "客户信息管理:完成新增功能"
# 将项目推送到远程仓库
git push
4.解决代码冲突
由于你进度太慢,项目经理安排了同事小A和你一块开发,他检出了你的customer分支,并且新增了代码。
你完成了客户信息管理的修改功能,你高高兴兴的的提交代码,发现提交失败,提示先进行更新本地代码,你选择了更新本地代码,提示代码冲突。打开冲突的代码文件,你选择保留自己的修改。然后再提交代码解决冲突。
a. 把更新到本地进行解决冲突。
b. 暂存自己的修改,先更新代码,然后再解决冲突。
# 暂存修改
git stash
# 恢复暂存,并且把此次暂存删除
git stash pop
# 恢复暂存,不删除
git stash apply
# 查看暂存
git stash list
5. 合并/删除分支
在你和同事的加班加点下,你俩顺利的完成客户信息管理, 现在要把customer 分支合并到develop分支。
# 切换分支
git checkout develop
# 合并分支
git merge customer
就能看到在customer分支下开发的功能代码了。
既然完成了功能开发,那么customer分支也就没必要保留了。
# 删除本地分支
git branch -d customer
# 删除远程分支
git push origin --delete customer
6.查看修改历史
想要回顾项目的提交历史。
# 查看提交历史
git log
# 简单查看
git log --pretty=oneline
7. 软件上线
经过三个月的开发,整个项目可以上线了,项目经理负责把develop分支合并到master分支。
# 将远程git仓库里的指定分支拉取到本地(本地不存在的分支)
git checkout -b develop origin/develop
# 切换分支
git checkout master
# 合并分支
git merge develop
tag版本号
创建版本号:0.0.1, 基于该版本的代码进行打包上线。
# 创建tag
git tag -a tagName -m "my tag"
git tag -a tagName -m "my tag" commitid
# 查看列表
git tag
# 查看指定tag
git show v1.0
# 删除本地tag
git tag -d v1.0
# 删除远程tag
git push origin :refs/tags/v1.0
# 推送tag
git push origin --tags
git push origin v1.0
# 按标签检出创建分支
git checkout -b 新分支名称 tag标签名
git checkout -b feature v1.0
8.忽略文件
有些文件你不想通过git来管理,例如填写密码的文件,可以通过添加文件.gitignore来忽略文件。
详细见文件.gitignore
语法:
以”#”号开头表示注释;
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
六、Git Flow模型
原文地址:https://www.jianshu.com/p/41910dc6ef29
我们一个人工作的时候喜欢想怎么干就怎么干,没有人评判,没有人检验。以为增删改查熟悉业务就能够搞定一些。但是当项目逐渐扩大,原来的灵活逐渐变成了混乱,原来的快速迭代因为过于随意的代码,而开发进度迟迟不前。掌握一种规范,便在处理类似问题的时候有章可循,也能够快速的融入一个团队。另外所谓规范,可以说是比较好的实践,按照规范来,项目也能稳健的发展。
Git Flow 就是如何使用git 分支的一种规范,或者叫做推荐。
以下是基于Vincent(文森特)提出的Git Flow 流程图
1. Git Flow 的常用分支
-
Master分支
这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改。
-
Develop 分支
这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支
-
Feature 分支
这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release,合并到develop分支之后,即可删除Feature分支。
-
Release分支
当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
-
Hotfix分支
当我们在Master发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release
2. Git Flow 如何使用
-
Master/Devlop 分支
所有在Master分支上的Commit应该打上Tag,一般情况下Master不存在Commit,Devlop分支基于Master分支创建
-
Feature 分支
Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支,毕竟保留下来意义也不大。
-
Release 分支
Release分支基于Develop分支创建,创建Release分支之后,我们可以在这个Release分支上测试,修改Bug等。同时,其它开发人员可以基于Develop分支新建Feature。发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。
-
Hotfix 分支
hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag。
3. Git Flow 命令示例
3.1 创建 Devlop
git branch develop
git push -u origin develop
3.2 开始 Feature
# 通过develop新建feaeure分支
git checkout -b feature develop
# 或者, 推送至远程服务器:
git push -u origin feature
# 修改md文件
git status
git add .
git commit
3.3 完成 Feature
git pull origin develop
git checkout develop
#--no-ff:不使用fast-forward方式合并,保留分支的commit历史
#--squash:使用squash方式合并,把多次分支commit历史压缩为一次
git merge --no-ff feature
git push origin develop
git branch -d some-feature
# 如果需要删除远程feature分支:
git push origin --delete feature
3.4 开始 Release
git checkout -b release-0.1.0 develop
3.5 完成 Release
git checkout master
git merge --no-ff release-0.1.0
git push
git checkout develop
git merge --no-ff release-0.1.0
git push
git branch -d release-0.1.0
git push origin --delete release-0.1.0
# 合并master/devlop分支之后,打上tag
git tag -a v0.1.0 master
git push --tags
3.6 开始 Hotfix
git checkout -b hotfix-0.1.1 master
3.7 完成 Hotfix
git checkout master
git merge --no-ff hotfix-0.1.1
git push
git checkout develop
git merge --no-ff hotfix-0.1.1
git push
git branch -d hotfix-0.1.1
git push origin --delete hotfix-0.1.1
git tag -a v0.1.1 master
git push --tags
git查看远程仓库地址命令
# 查询远程库信息
git remote -v
# 添加远程仓库
git remote add one(仓库名) git@gitee.com:fuqian/decoration.git
# 推送代码至远程仓库
git push -u one master
git log 无法正常显示中文,怎么解决
# 试试git --no-pager log
# 如果可以显示的话,把pager设置为more
git config --global core.pager more
git 通过提交关键字搜索
git log --grep keywords
git 通过作者搜索
git log --author yourname
git 每次提交对应的文件改动
git log --name-status --oneline -1
git 查看变动的目录
git fetch
git diff master origin/master --stat
git 分支建立关联并推送至线上 有时rebase 会出现分支要重新关联
git push --set-upstream origin dev
git 拉取远程分支至本地并切换到指定分支
git checkout -b feature-express-split origin/feature-express-split
git 删除远程分支
git push origin --delete uuu
git commit之前
- git 放弃当前所有或指定文件修改 未add
# 放弃单个文件修改,注意不要忘记中间的"--",不写就成了检出分支了!
git checkout -- filepathname
# 放弃所有的文件修改
git checkout .
- git 已经 add 缓存了代码 放弃缓存 保留当前工作区文件修改
# 放弃指定文件的缓存
git reset HEAD filepathname
# 放弃所有的缓存
git reset HEAD .
# 放弃缓存至指定版本
git reset commitid
git commit之后
- 撤销某次操作
# 撤销某次操作commitid的提交 注意的是revert奇数次生效,偶数次又回到之前的修改状态
git revert commitid
- 强制将缓存区和工作目录都同步到你指定的提交
# 回退到上一次commit的状态 并清空当前文件,慎用
git reset HEAD^
# 回退到上一次commit的状态 并清空当前文件,慎用
git reset --hard HEAD^
# 回退到任意版本
git reset --hard commitid **
# 完全退到之前版本
git reset --hard commitid
# 配合以下清理结合使用他们能让你的工作目录完全回退到最近一次commit的时候
git clean -f
git 查看日志
git log --oneline
git log --oneline --graph --all
git log --oneline --graph -n 20
git 合并多次commit提交
# 查看提交历史图
git log --oneline --graph -n -20
# 将要合并的提交 之前的一个commitid获取 -i 不需要合并的commitid
git rebase -i 10b73908
# 进入vi编辑模式 此处为最早的提交在最上方 pick 的意思是要执行这个 commit squash 的意识是这个 commit 会被合并到前一个 commit
# 最上次即最早的提交之下的pick 修改为squash or s
# 输入 :wq 保存退出
# 一 冲突
# 若有冲突,需要进行修改,修改的时候保留最新的历史记录,修改完之后输入以下命令:
git add .
git rebase --continue
# 二 放弃
git rebase --abort
# 三 无冲突或 冲突已 fix,则会出现一个 commit message 编辑页面,修改 commit message ,然后 输入:wq or x 保存退出
# 同步到远程 git 仓库
git push -f or git push --force
# 如果其它git获取时报分支分叉 have diverged 强至同步到线上分支
git reset --hard origin/feature-jd
所以需要先取消这次合并,使用“git merge --abort”命令
git 比对分支文件差异
git diff master feature-jd-invoice --name-only
git 合并多次分支提交
git rebase 合并多次提交.
git rebase -i [commit_log]
pick : 代表合并后的提交用这个提交的注释;
s : squash命令的简写,代表合并提交中包含这个提交;
d : 代表合并提交中排除这个提交。
七、阅读推荐
详细的git功能学习推荐业界大神廖雪峰的Git博客