为什么 Git把 SVN拍在了沙滩上!
来源丨云加社区
segmentfault.com/a/1190000016865867
Git vs SVN
Git 和 SVN 孰优孰好,每个人有不同的体验。
一、Git是分布式的,SVN是集中式的
这是 Git 和 SVN 最大的区别。若能掌握这个概念,两者区别基本搞懂大半。因为 Git 是分布式的,所以 Git 支持离线工作,在本地可以进行很多操作,包括接下来将要重磅推出的分支功能。而 SVN 必须联网才能正常工作。
二、Git复杂概念多,SVN简单易上手
所有同时掌握 Git 和 SVN 的开发者都必须承认,Git 的命令实在太多了,日常工作需要掌握 add
, commit
, status
, fetch
, push
, rebase
等,若要熟练掌握,还必须掌握 rebase
和 merge
的区别, fetch
和 pull
的区别等,除此之外,还有 cherry-pick
, submodule
, stash
等功能,仅是这些名词听着都很绕。
在易用性这方面,SVN 会好得多,简单易上手,对新手很友好。但是从另外一方面看,Git 命令多意味着功能多,若我们能掌握大部分 Git 的功能,体会到其中的奥妙,会发现再也回不去 SVN 的时代了。
三、Git分支廉价,SVN分支昂贵
在版本管理里,分支是很常使用的功能。在发布版本前,需要发布分支,进行大需求开发,需要 feature 分支,大团队还会有开发分支,稳定分支等。在大团队开发过程中,常常存在创建分支,切换分支的需求。
Git 分支是指针指向某次提交,而 SVN 分支是拷贝的目录。这个特性使 Git 的分支切换非常迅速,且创建成本非常低。
而且 Git 有本地分支,SVN 无本地分支。在实际开发过程中,经常会遇到有些代码没写完,但是需紧急处理其他问题,若我们使用 Git,便可以创建本地分支存储没写完的代码,待问题处理完后,再回到本地分支继续完成代码。
Git核心思想
Git 最核心的一个概念就是工作流。
工作区(Workspace) 是电脑中实际的目录。
暂存区(Index) 类似于缓存区域,临时保存你的改动。
仓库区(Repository),分为本地仓库和远程仓库。
从 SVN 切换到 Git,最难理解并且最不能理解的是暂存区和本地仓库。熟练使用 Git 后,会发现这简直是神设计,由于这两者的存在,使许多工作变得易管理。
通常提交代码分为几步:
git add
从工作区提交到暂存区git commit
从暂存区提交到本地仓库git push
或git svn dcommit
从本地仓库提交到远程仓库
一般来说,记住以下命令,便可进行日常工作了(图片来源于网络):
Git-SVN常用命令
看到Git-SVN不要懵!是的,在Git中甚至有命令可以直接和SVN进行桥接,Git 中所有与SVN桥接的基础命令就是
git svn
若服务器使用的 SVN,但是本地想要体验 Git 的本地分支,离线操作等功能,可以使用 Git-SVN功能。
常用操作如下(图片来源于网络):
# 下载一个 SVN 项目和它的整个代码历史,并初始化为 Git 代码库
$ git svn clone -s [repository]
# 查看当前版本库情况
$ git svn info
# 取回远程仓库所有分支的变化
$ git svn fetch
# 取回远程仓库当前分支的变化,并与本地分支变基合并
$ git svn rebase
# 上传当前分支的本地仓库到远程仓库
$ git svn dcommit
# 拉取新分支,并提交到远程仓库
$ svn copy [remote_branch] [new_remote_branch] -m [message]
# 创建远程分支对应的本地分支
$ git checkout -b [local_branch] [remote_branch]
初 始 化
从本节开始,除特殊说明,以下命令均适用于 Git 与 Git-SVN。
# 在当前目录新建一个Git代码库
$ git init
# 下载一个项目和它的整个代码历史 [Git only]
$ git clone [url]
配 置
# 列举所有配置
$ git config -l
# 为命令配置别名
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
Git 用户的配置文件位于 ~/.gitconfig
Git 单个仓库的配置文件位于 ~/$PROJECT_PATH/.git/config
增删文件
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加指定文件到暂存区
$ git add <file1> <file2> ...
# 添加指定目录到暂存区,包括其子目录
$ git add <dir>
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
把文件名 file1 添加到 .gitignore 文件里,Git 会停止跟踪 file1 的状态。
分 支
# 列出所有本地分支
$ git branch
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [new_branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个 commit,合并进当前分支
$ git cherry-pick [commit]
# 删除本地分支,-D 参数强制删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push [remote] :[remote-branch]
提 交
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交工作区与暂存区的变化直接到仓库区
$ git commit -a
# 提交时显示所有 diff 信息
$ git commit -v
# 提交暂存区修改到仓库区,合并到上次修改,并修改上次的提交信息
$ git commit --amend -m [message]
# 上传本地指定分支到远程仓库
$ git push [remote] [remote-branch]
拉 取
# 下载远程仓库的所有变动 (Git only)
$ git fetch [remote]
# 显示所有远程仓库 (Git only)
$ git remote -v
# 显示某个远程仓库的信息 (Git only)
$ git remote show [remote]
# 增加一个新的远程仓库,并命名 (Git only)
$ git remote add [remote-name] [url]
# 取回远程仓库的变化,并与本地分支合并,(Git only), 若使用 Git-SVN,请查看第三节
$ git pull [remote] [branch]
# 取回远程仓库的变化,并与本地分支变基合并,(Git only), 若使用 Git-SVN,请查看第三节
$ git pull --rebase [remote] [branch]
撤 销
# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复暂存区当前目录的所有文件到工作区
$ git checkout .
# 恢复工作区到指定 commit
$ git checkout [commit]
# 重置暂存区的指定文件,与上一次 commit 保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次 commit 保持一致
$ git reset --hard
# 重置当前分支的指针为指定 commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 重置当前分支的HEAD为指定 commit,同时重置暂存区和工作区,与指定 commit 一致
$ git reset --hard [commit]
# 新建一个 commit,用于撤销指定 commit
$ git revert [commit]
# 将未提交的变化放在储藏区
$ git stash
# 将储藏区的内容恢复到当前工作区
$ git stash pop
查 询
# 查看工作区文件修改状态
$ git status
# 查看工作区文件修改具体内容
$ git diff [file]
# 查看暂存区文件修改内容
$ git diff --cached [file]
# 查看版本库修改记录
$ git log
# 查看某人提交记录
$ git log --author=someone
# 查看某个文件的历史具体修改内容
$ git log -p [file]
# 查看某次提交具体修改内容
$ git show [commit]
来和小伙伴们一起向上生长呀!
扫描下方二维码,添加小詹微信,可领取千元大礼包并申请加入 Python 学习交流群,群内仅供学术交流,日常互动,如果是想发推文、广告、砍价小程序的敬请绕道!一定记得备注「交流学习」,我会尽快通过好友申请哦!
????长按识别,添加微信
(添加人数较多,请耐心等待)
????长按识别,关注小詹
(扫码回复 1024 领取程序员大礼包)
为什么 Git把 SVN拍在了沙滩上!相关推荐
- 为什么Git把SVN拍在了沙滩上?
关注+星标公众号,不错过精彩内容 来源 | 云加社区 Git和SVN是大家都比较熟知的版本管理,近几年Git越来越受到大家的喜欢. 下面就来分享下关于Git和SVN的内容. Git vs SVN ...
- 为什么 Gi t把 SVN 拍在了沙滩上!
点击"开发者技术前线",选择"星标????" 在看|星标|留言, 真爱 来源丨云加社区 segmentfault.com/a/1190000016865867 ...
- HTML5凭什么将Flash“拍死”在沙滩上?
放在最前面希望不会影响你的观看,文章很不错哦! 自己整理了一份2018最全面前端学习资料,从最基础的HTML+CSS+JS [炫酷特效,游戏,插件封装,设计模式]到移动端HTML5的项目实战的学习资料 ...
- 国产IT彪起来了,后浪要将前浪拍死在沙滩上
浪潮在广州浪潮服务器存储全国合作伙伴大会中再一次自信发声:2016年将继续保持中国服务器市场第一,存储进入中国市场前五. 作为去IOE和国产化的受益者,浪潮等国产厂商曾经受到不少质疑,国产服务器,能够 ...
- Git怎么把SVN拍在沙滩上的?
Git和SVN是大家都比较熟知的版本管理,近几年Git越来越受到大家的喜欢. 下面就来分享下关于Git和SVN的内容. ---------------------------------------- ...
- 用好 Git 和 SVN,轻松驾驭版本管理
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 凌承一 来源 | bubuko.com/infodeta ...
- Git的学习与使用(一)——Git 与 SVN 区别
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件. Git ...
- 谈一谈git和SVN两大版本管理工具。
Git 和 SVN 的区别? 写在前面: git和SVN都是一个版本管理工具,没有孰优孰劣之分,在这里,只是简单的说一说git和svn的优缺点.选用哪一个看自己公司的实际情况而定. 1) 核心的区别在 ...
- gitee项目能用SVN拉取吗_用好 Git 和 SVN,轻松驾驭版本管理
来源 | 凌承一链接 | bubuko.com/infodetail-2844306.html 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高 ...
最新文章
- R构建指数回归模型(Exponential Regression)
- 带你重读Youtube深度学习推荐系统论文,惊为神文
- java web每天定时执行任务(四步轻松搞定)
- window系统查看端口被哪个进程占用了
- mysql的学习笔记(四)
- 树莓派3B用Ubuntu MATE安装ros
- matlabsimulink仿真天体运行轨迹
- mac下安装JAVA开发工具(6)------tomcat、IDEA及nginx转发80端口到8080
- Android开发中的svn问题
- SAP Spartacus pop over 元素的单元测试
- Linux CPU 信息查看
- 2018-2019 20165204 20165216 20165220 实验四 外设驱动程序设计
- IT桌面运维常识系列 -(Windows部署服务 - 01)
- 织梦dedecms调用热门搜索关键词的方法
- 计算机学院毕业设计题库,计算机信息工程学院毕业设计课题审题表
- linux下查看显卡和驱动版本
- mysql的安装使用(免安装版)
- 基于SpringBoot+MyBatis的餐饮点餐系统
- 【用matplotlib,wordcloud和pyecharts分析三国的分词,词频,词性,小说人物出场次数排序小说人物关系】
- #编译原理# 概论(一)
热门文章
- windows下配置安装YAF环境
- thinkphp中配置信息的二维数组设置与使用
- PHPExcel设置自动列宽
- PHP数组对象Json的互相转换
- linux计算机中文件意思,shell在计算机语言中一般是啥意思,比如在linux中
- springboot嵌入thymeleaf后css404_SpringBoot2整合Thymeleaf
- 利用javascript实现简体与繁体的转换
- php判断目录是否有写的权限,php中判断文件空目录是否有读写权限的函数代码_php技巧...
- java 消息传递示例_java actor模型和消息传递简单示例
- fastjson 输出null值字段