Git 与 SVN 及核心命令总结(附SourceTree)

Git 与 SVN

现在有甲乙丙三个人,他们合作去开发一个购物网站:

  • 甲:订单处理模块

  • 乙:商品管理模块

  • 丙:其他模块

每个人单独在自己的系统中进行开发,这时候最终需要把单个分散的系统整合成一个完成的,怎么办?

Copy到一个人的机器上,大家眼睛都盯着这个电脑,然后啪啦啪啦copy。如果说在整合的时候,你发现哪个哥们他写的模块有问题。数据库的整合,订单模块里面的内容需要调用到商品模块的内容。

当你中招了之后,这是好事,犯了错,才能解决嘛。纵观整个软件开发历史,也有几十年的历史了吧,当你现在的遇到的一些问题,我们前辈们肯定遇到的。既然前辈们遇到了,他们肯定有义务(想要)去解决。

Git来源于Linux。Linux的内核全球有很多开发者贡献代码(原因是BItKeeper最开始是免费的,后面要收费了)(用一个不开源的框架版本管理一个开源的框架,大牛感觉到了侮辱)所以Git天生就是分布式的。

1.Git 与 SVN 的区别?

SVN 是早期的版本控制工具,那它和 Git有什么区别呢?

1.1 存储方式区别

Git 只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异。这类系统(如SVN)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,然而 Git 并不保存这些前后变化的差异数据。

实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

  • GIT把内容按元数据方式存储类似k/v数据库
  • SVN是按文件(新版svn已改成元数据存储)

1.2 版本管理模式区别

Git是分布式的,SVN不是。这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;

  • git 是一个分布式的版本管理系统

在这里插入图片描述

  • SVN是一个远程集中式的管理系统

    在这里插入图片描述

1.3 使用方式区别

SVN 断开网络或者断开VPN就无法commit代码,但是Git 可以先commit到本地仓库。

用SVN的话,没有网络或者断开VPN时,你当然也可以继续在本地开发,但是无法commit代码,因为SVN 每次commit都必须联网,长时间不commit代码会丢失大量开发进程的历史纪录。有个比喻是:不能commit就像用word写文档不能save一样危险。而且有网络的情况下每一次commit都会花上数秒甚至更长时间。

但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,因为是在本地仓库commit所以几乎不需要时间,而且commit一定要频繁,不然无法记录你的改动,如果你一天commit一次,中间的修改你就找不回来,然后等到了有网络的时候再将版本纪录和代码一起上传到远程仓库。

  • 从本地把文件推送远程服务,GIT需要 add、commint、push 三个步骤

    在这里插入图片描述

  • SVN 只需要commint

在这里插入图片描述

为什么要用Git?

  1. git每台电脑都有一个版本库,可以在本地做版本管理;
  2. 速度快。git的速度远超大部分版本管理系统,包括svn
  3. 强大的分支管理功能
  4. 活跃的开源社区,如最著名的github

2.GIT 支持的通信协议

上面说了 Git 是分布式的,那么必定会涉及远程通信,所以 Git 是采用什么协议进行远程通信的呢?

2.1 Local(本地协议)

基于本地文件系统或共享(NFS)文件系统进行访问,

  • 优点:简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事。
  • 缺点:这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度也慢。
  • 适用场景:小团队,小项目临时搭建版本服务。
# 基于 file 协议克隆本地项目
git clone file:///C/git/atals

如果在 URL 开头明确的指定 file://,那么 Git 的⾏为会略有不同。 如果仅是指定路径,Git 会尝试使⽤硬链接(hard link)或直接复制所需要的⽂件。 如果指定 file://,Git 会触发平时⽤于⽹路传输资料的进程,传输过来的是打包好的⽂件,更节约硬盘空间。

2.2 ssh协议

git 支持支持利用 ssh 协议进行通信,这是绝大部分linux、uninx系统都支持的,所以利用该协议架设GIT版本服务是非常方便的。

  • 优点:首先SSH 架设相对简单、其次通过 SSH 访问是安全的、另外SSH 协议很高效,在传输前也会尽量压缩数据。
  • 缺点:权限体系不灵活,必须提供操作系统的帐户密码,哪怕是只需要读取版本。
  • 适用场景:小团队、小项目、临时项目
 git clone root@192.168.0.147:/data/git-repository/test.git

2.3 http(Dumb、Smart)

Git http 协议实现是依懒 WEB容器(apache、nginx)及cgi 组件进行通信交互,并利用WEB容器本身权限体系进行授权验证。在 Git 1.6.6 前只支持http Dumb(哑)协议,该协议只能下载不能提交,通常会配合ssh 协议一起使用,ssh 分配提交帐号,http dumb提供只读帐号。1.6.6 之后 git 提供了git-http-backend 的 CGI 用于实现接收远程推送等功能。

  • 优点:解决了local 与ssh 权限验证单一的问题、可基于http url 提供匿名服务,从而可以放到公网上去。而 local 与ssh 是很难做到这一点,必如实现一个类似 github 这样的网站。
  • 缺点:架设复杂一些需要部署 WEB 服务器,和 https 证书之类的配置。
  • 场景:大型团队、需要对权限精准控制、需要把服务部署到公网上去。
git clone http://git.tl.com/test.git

注意,http Smart 协议 是基于 CGI 配合GIT git-http-backend 脚本进行使用,配置较复杂,现在一般不会这么去做,而是采用gitlab 、gogs 之类的web管理进行代替,

2.4 GIT协议

Git 协议是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。

  • 优点:目前,Git 协议是 Git 使用的网络传输协议里最快的。 如果项目有很大的访问量,或者项目很庞大并且不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。
  • Git 协议缺点是缺乏授权机制。 而且9418是一个非标准端口,一般防火墙不会开放。
git clone git://192.168.0.147:9418/test.git

命令

1.Git 核心命令

git 客户端安装(无脑下一步就行):

1.1 配置管理

在刚装完git的需要配置 email 和 name,然后才能使用 Git,那怎么配置呢?

#查看所有配置信息
git config -l

#查看系统级别配置(git安装目录下etc)
git config --system --list
#查看全局级别配置(当前用户之下表示的是全局级别的)
git config --global --list
#查看仓库级别配置(当前仓库级别下的.git>config文件)
git config --local --list

#添加配置
git config --global user.name "yourusername"
git config --global user.email "youremail@email.com"
#删除配置
git config --unset user.name

注:覆盖优先级为local > global > system。优先读取local,其次是global,最后是system。

1.2 本地初始化Git仓库

如何初始化一个 Git 本地仓库 ?

#当前目录初始化为 git 本地仓库(在同级目录下会出现一个隐藏的.git文件)
git init  <directory>

#删除本地仓库=删除.git文件夹

#基于远程仓库克隆至本地
git clone <remote_url

1.3 本地添加

如何将工作空间的文件添加到暂存区?

#添加指定文件到暂存区
git add <fileName>
#添加指定目录至暂存区
git add <directory>
#添加所有
git add -A

#将指定目录及子目录移除出暂存区(注:本地文件还在)
git rm --cached <target> -r

#查看提交状态。如果还未提交到暂存区的文件会标红,在暂存区的文件会标绿。
git status 

#添加勿略配置文件 .gitignore

如果我们不想让某个文件被git管理起来,所以如何让 git 忽略这个文件呢?

在仓库的根目录下创建一个.gitignore 文件,写入不想让git管理的文件。两点注意

  1. .gitignore本身就需要忽略,所以此文件也要写进去
  2. .gitignore 文件中可以使用“#”字符开头表示注释,文件夹路径是用“/”字符,文件名可以使用通配符“*”,另外还可以使用“!”字符表示排除。比如 * .class
  3. .gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交
  4. 每一个文件夹沟可以创建自己的“.gitignore”文件,如果它上层的文件夹也有“.gitignore”文件,这个文件夹也会受到它的影响

1.4 本地提交

如何将暂存区的文件提交到本地仓库?

#提交指定文件到本地仓库
git commit <fileName>
#全部提交
git commit -a 
#-m编写提交注释(注:如果在commit命令中指定了-m,那么就不会再弹出vim让写提交注释了)
git commit <fileName> -m <注释>
#快捷提交至本地仓库
git commit -am '快添加与提交全部暂存区文件'

#版本回退(这个id可以根据git log查看日志信息去找到)
#仅仅只是撤销已提交的版本库,不会修改暂存区和工作区
git reset --soft <commitid>
#仅仅只是撤销已提交的版本库和暂存区,不会修改工作区
git reset --mixed <commitid>
#彻底将工作区、暂存区和版本库记录恢复到指定的版本库
git reset --hard <commitid>

1.5 日志管理

如何查看我当前库的历史提交信息?

#查看当前分支下所有提交日志
git log
#查看当前分支下所有提交日志
git log {branch}
# 单行显示日志
git log --oneline
# 比较两个版本的区别
git log master..experiment

#以图表的方式显示提交合并网络
git log --pretty=format:'%h %s' --graph

1.7 分支管理

如果我现在有多个开发人员,开发不同模块,都在master上写吗?

#查看当前分支, -avv查看远程分支
git branch [-avv]

#基于当前分支新建分支
git branch <branch name>
#基于提交新建分支
git branch <branch name> <commit id>

#切换分支
git checkout <branch name>

#删除分支(注:删除时必须在其他分支上)
git branch -d {dev}

#合并分支(比如将要将dev分支的内容合并到master分支,那么要在master分支执行该命令)
#注: 如果因冲突导致自动合并失败,此时 status 为mergeing 状态。需要手动修改后重新提交(commit) 
git merge <merge target>

分支规范:

  • master分支:主分支。保持稳定

    • 不允许直接往这个分支提交代码,只允许往这个分支发起 merge request
    • 只允许 release 分支和 hotfix 分支进行合流 , 所有在 Master 分支上的 Commit 应该Tag
  • develop分支:开发分支。相对稳定的分支,用于日常开发,包括代码优化、功能性开发。

  • feature分支:特性分支。

    • 从develop分支拉取,用于下个迭代版本的功能特性开发。
    • 功能开发完毕合并到develop 分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留。
  • release分支:发布分支。

    • 从develop分支拉取,用于回归测试,bug修复

    • 发布完成后打tag并合入master和develop, (注:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)

  • hotfix分支:热更新分支。

    • 从develop分支拉取,用于紧急修复上线版本的问题

    • 修复后打tag并合入master和develop

1.8 tag 管理

Commitid不容易记住,能不能用一种比较独特的方式去记住每个版本?答:Commitid相当于IP,Tag相当于域名。

#查看当前仓库的标签列表
git tag
#创建分支
git tag <tag name> <branch name>
#删除分支
git tag -d <tag name>

1.9 远程仓库

本地仓库说完了,那如果我不同地区的人要合作开发怎么搞?答:远程仓库,GitHub或Gitee。

#查看远程配置
git remote [-v]
#添加远程仓库地址(注:远程仓库一般命名为origin,不同的远程仓库需要配置不同的名字; url一般多采用http协议)
git remote add <github name> <url>
#删除远程地址
git remote remove <github name> 

#上传新分支至远程
git push -u <github name> <branch name>
#将本地分支与远程建立关联
git branch --track --set-upstream-to=<github name>/<remote branch> <local branch>
#直接使用git push 时只会上传的到一个远程仓库的一个分支,是上面 --track 设置的仓库和相应分支
git push 

# 拉取代码到本地
git clone <url>
git clone <url> <filepath>

#提取远程仓库(如果服务器有修改,不会到本地)
git fetch
#合并冲突(如果只是本地或远程一端修改的话,就不会冲突)
git merge
# git pull(更新拉取) = git fetch + git merge
git pull <url>

无论是推送还是拉代码,需要有这样一个权限,也就是说你目前使用的这台电脑是否安全,如果不安全,人家不会让你去推送,而github采用的是RAS加密方式通讯:

  1. 在本地中生成一个 ssh key。ssh-keygen -t rsa -C youremail.com,输入后一直回车即可完成。

  2. 把这个key告诉github/码云。Settings -> SSH and GPG keys --> New SSH key --> 将公钥粘贴并保存

把常用命令再画个图来总结一下:
在这里插入图片描述

2.工具使用 Git

一般我们在实际开发更多是用现成IDE自带的GIT工具或者图形化工具去操作Git

后面博主有时间了会再出一篇搭建 Git 私服的教程(先挖个坑)…

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sourcetreegit是两个不同的工具,但它们可以一起使用来管理和操作git仓库。 Git是一个分布式版本控制系统,用于跟踪和管理代码的变更。Sourcetree是一个可视化的git客户端,它提供了一个直观的界面,帮助用户更方便地使用git命令进行版本控制操作。 要使用sourcetreegit一起工作,您可以按照以下步骤进行操作: 1. 首先,您需要下载并安装适用于您操作系统的sourcetree软件。您可以在sourcetree官方网站上找到软件的下载地址。 2. 安装完成后,打开sourcetree并进行初始设置,如配置用户名和邮箱等。 3. 接下来,您需要将您的git仓库克隆到本地。在sourcetree中,您可以通过点击"克隆/新建"按钮来进行克隆操作。在克隆对话框中,输入git项目的地址和本地目标路径,然后点击"克隆"按钮。 4. 完成克隆后,您可以在sourcetree界面中看到您的仓库。您可以使用sourcetree提供的图形化界面来进行代码提交、拉取、推送等操作。 5. 如果您需要提交代码到git仓库,您可以在sourcetree中选择要提交的文件,右键点击并选择"添加到暂存区",然后在提交面板中输入提交描述,并点击"提交"按钮。 6. 当要将本地代码推送到远程仓库时,您可以在sourcetree中选择"推送"按钮,然后选择要推送的分支和目标仓库,点击"推送"按钮。 7. 在使用sourcetree时,您还可以查看代码的历史记录、分支管理、合并代码等操作,这些操作都可以通过sourcetree提供的界面完成。 综上所述,sourcetree是一个图形化的git客户端,可以帮助您更方便地使用git进行版本控制操作。您可以使用sourcetree来克隆git仓库、提交代码、拉取和推送代码等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值