Write in the first
开发过程中离不开源代码的管理,
目地:为了解决在软件开发过程中,由源代码引发的各种蛋疼、繁琐的问题。
目前开发使用较广的 版本控制系统「Git & SVN」,后续会单开一篇总结正在使用的【强大的 Git 客户端:SourceTree】。
本篇文章主要从使用者角度【Git & SVN 详解使用】学习总结。
在「时间 & 知识 」有限内,总结的文章难免有「未全、不足 」的地方,还望各位好友指出,以提高文章质量。
目录:
- 源代码管理认知
- 源代码管理 SVN 详解使用
- SVN 基础知识概念
2.SVN 客户端实用命令
3.SVN 客户端实用示例
4.「SVN–>branch & tag」分支和标签
5.SVN ST 显示的文件状态- 源代码管理 Git 详解使用
1.Git基础知识概念
2.Git 几个核心概念
3.Git 工作原理 / 流程
4.Git 客户端实用命令
5.「Git–>branch & tag & remote」分支、标签和远程
6.Git 客户端实用示例- SVN & Git 两者比较
- 码农们踩过的坑整理(持续~)
源代码管理认知
下面简单几点总结,来给初学者快速对源代码管理有个认知;
为什么会出现源代码管理工具 ? |
---|
- 为了解决在软件开发过程中,由源代码引发的各种蛋疼、繁琐的问题。
源代码会引发哪些问题 ? |
---|
无法后悔:做错了一个操作后,某些情况下无法返回,没有后悔药可以吃。
版本备份:费空间、费时间。
版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本。
代码冲突:多人操作同一个文件(团队开发中的常见问题)。
权限控制:无法对源代码进行精确的权限控制。
追究责任:出现了严重的 BUG,无法定位到负责人,容易耍赖。
源代码管理工具的作用是 ? |
---|
- 能追踪一个项目从诞生一直到定案的过程。
- 记录一个项目的所有内容变化。
- 方便地查阅特定版本的修订情况。
温馨提示: |
---|
如果是团队开发,使用源代码管理工具是强制性的!
如果是单人开发,也强烈建议现在就开始使用源代码管理工具。
源代码管理 SVN 详解使用
基础知识概念
SVN
是集中式控制系统,需要一个中央服务器。Repository
代码仓库,保存代码的仓库。Server
服务器,保存所有版本的代码仓库。Client
客户端,只保存当前用户的代码仓库。用户名&密码
访问代码仓库需要使用自己的 “用户名和密码”,从而可以区分出不同的人对代码做的修改。
SVN 客户端实用命令
svn checkout「简写svn co」
:将服务器上最新的代码仓库下载到本地(只需要做一次)。svn update「简写svn up」
:从服务器上将其他人所做的修改下载到本地 (每天上班必须要做的事情)。svn commit「简写svn ci」
:将改动的文件提交到服务器(每天下班之前至少做一次)。
svn add
:向本地的版本控制库中添加新文件。svn delete、svn remove「简写svn del、svn rm」
:从本地的版本控制库中删除文件。svn move
:移动文件或者目录或文件更名svn mkdir
:创建纳入版本控制下的新目录svn revert
:撤销之前的一切修改svn merge
:将两个版本之间的差异合并到当前文件
svn info
:查看文件的详细信息。svn diff
:查看不同版本的区别。svn log
:查看日志信息。svn list
:列出版本库下的文件和目录列表。svn status「简写svn st」
:查看文件状态。svn help
:获取帮助信息(比如 svn help ci)。svn lock
:加锁。svn unlock
:解锁。
SVN 客户端实用示例
检出:
- 去到公司的第一天,将项目检出(下载)至本地。
svn checkout URL[PATH]
svn co URL[PATH]
注意:
这里的中括号[ ]代表可选(可以省略)。
URL:代码仓库的远程地址。
[PATH]:将代码下载到本地的哪个路径(如果省略本地的路径,就下载到命令行当前所在的路径)。
提交:
- 将改动过的旧文件提交至服务器。
svn commit-m "注释"[PATH]
svn ci-m "注释"[PATH]
注意:
一定要养成写注释的良好习惯。
“注释”:”修改了User.m文件”。
[PATH]:代表是 提交哪个文件到服务器(如果省略路径,就将命令行所在路径中所有改动过的文件提交到服务器)。
添加:
提交一个新建的文件到服务器,需要2个步骤。
添加新建的文件到本地的版本控制库中:
svn add
。提交刚才的添加操作到服务器:
svn commit
。将文件添加到本地的版本控制库。
svn add PATH
PATH
:代表是 添加哪个文件到版本控制库中。
删除:
删除服务器上的某个旧文件,需要做2个步骤。
将文件从本地的版本控制库中移除:
svn delete、svn remove
。提交刚才的删除操作到服务器:
svn commit
。将文件从本地的版本控制库中移除。
svn delete PATH
PATH
:代表是 将哪个文件从版本控制库中移除。
更新:
将服务器上其他同事提交的,最新代码更新到本地。
svn update [PATH]
PATH
:代表是 更新哪个文件的内容(如果省略路径,就更新命令行所在路径的所有内容)。
回滚:
改动没有被提交。
这种情况下,使用svn revert
就能取消之前的修改。当为单个文件时,直接svn revert 文件
就行了;当为目录时,需要加上参数-r (Recursive,递归)
,否则只会将改文件这个目录的改动。改动已经被提交。
这种情况下,用svn merge
命令来进行回滚。先运行svn up
保证拿到最新的版本,然后svn log
查看并找到要回滚的版本号,如果想要更详细的了解情况,可以使用svn diff -r HEAD:2500 [文件](回滚到版本号2500)
,此处的[ ]
可以是文件、目录或整个项目。
「SVN–>branch & tag」分支和标签
SVN 官方推荐在一个版本库的根目录下先建立trunk
、branches
、tags
这三个文件夹,其中 trunk 是开发主干,存放日常开发的内容;branches 存放各分支的内容,比如为不同客户定制的不同版本;tags 存放某个版本状态的标签。branhces
和tags
本质没有区别,都是通过svn copy
方式建立的,差异在于通常branches
中的内容是需要继续修改或开发的,tags
中的内容是存放不再修改的,这一般通过权限设置来解决,tags
通常只给管理员开放写权限。
|
|
分支与主干的合并:
merge分支B到分支A
冲突提示
SVN ST 显示的文件状态
' '
没有修改。A
被添加到本地代码仓库。C
冲突。D
被删除。I
被忽略。M
被修改。R
被替换。X
外部定义创建的版本目录。?
文件没有被添加到本地版本库内。!
文件丢失或者不完整(不是通过svn命令删除的文件)。~
受控文件被其他文件阻隔。U
服务器收到文件更新了G
本地文件以及服务器文件都已更新,而且成功的合并了
源代码管理 Git 详解使用
基础知识概念
git是一款开源的分布式版本控制工具。
在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的。
作者是Linux之父:Linus Benedict Torvalds。
当初开发git仅仅是为了辅助Linux内核的开发(管理源代码)。
Git 几个核心概念
工作区(
Working Directory
):仓库文件夹里除.git目录以外的内容。版本库(
Repository
):.git目录,用于存储记录版本信息。暂存区(
stage
)分支(
master
):git自动创建的第一个分支。HEAD指针:用于指向当前分支。
Git 工作原理 / 流程
git add
:将工作区文件修改添加到暂存区。git commit
:将暂存区的所有内容提交到当前分支(提交区)。git push
:将提交区内容 推送到服务器上。git pull
:从服务器上更新文件。
Git 客户端实用命令
1.
git clone
:从服务器上克隆(下载)最新的代码到本地。2.
git init
:初始化本地仓库(在当前目录新建代码库),也可以git init Desktop/GitCode
(在指定位置创建代码库) ,如果使用了git clone
不用使用此命令。3.
git config
:配置用户名和邮箱。12345678910git config --global user.name "GO_ln"git config --global user.email "xxx @xx.com"```- 4.`add`:将工作区的文件提交到暂存区。```objc// 添加指定文件git add GitTest/GitTest/ViewController.m// 添加本地库所有文件git add .
- 5.
git commit
:提交信息。
|
|
6.
git status
:查看当前 git 的状态。7.
git push
:将提交区内容 推送到服务器上。8.
checkout
:撤销某次提交的某个文件。1git checkout 8989920311bacb3f4e3ced7f82ab75ca47c318c7 GitTest/GitTest/ViewController.m9.
revert
:撤销某一次提交。1git revert 8989920311bacb3f4e3ced7f82ab75ca47c318c710.
checkout HEAD
:放弃本地某一文件的修改。1git checkout HEAD GitTest/GitTest/ViewController.m11.
git reset
:回退到某个版本并保存未追踪的改动。(通过log来查询)1git reset 8989920311bacb3f4e3ced7f82ab75ca47c318c712.
git reset --hard HEAD
:放弃本地全部修改。13.
git reset --keep
:回退到某个版本并保存未提交的改动。1git reset --keep 8989920311bacb3f4e3ced7f82ab75ca47c318c714.
log
:查看提交日志。15.
git show
:查看每次提交的具体内容。16.
diff
:查看追踪文件的差异。1234// 查看追踪文件的差异git diff// 查看某一文件的差异git diff GitTest/GitTest/ViewController.m17.
rm
:删除文件。1git rm GitTest/GitTest/ViewController.m18.
mv
:修改某一个文件的名字。12// 注意,路径要对应,否则会自动移动git mv GitTest/GitTest/ViewController.m GitTest/GitTest/View.m19.
blame
:查看文件被谁修改。1git blame GitTest/GitTest/ViewController.m
「Git–>branch & tag & remote」分支、标签和远程
branch
:分支。12345678910111213141516171819202122232425262728293031// 查看本地分支git branch// 查看远程分支git branch -r// 查看远程和本地分支git branch -a// 创建本地分支,但是不切换git branch branch1// 新建一个分支并切换git checkout -b branch2// 新建一个分支,指向指定commitgit branch branch3 8989920311bacb3f4e3ced7f82ab75ca47c318c7// 新建一个分支,与指定的远程分支建立追踪关系git branch --track branch4 origin/master// 切换到指定分支,并更新工作区git checkout branch4// 切换到上一个分支git checkout -// 建立追踪关系,在现有分支与指定的远程分支之间git branch --set-upstream branch3 origin/master// 合并指定分支到当前分支git merge branch2// 选择一个commit,合并进当前分支git cherry-pick 8989920311bacb3f4e3ced7f82ab75ca47c318c7// 删除分支git branch -d branch1// 删除远程分支git push origin --delete branch1git branch -dr branch1// 将当前分支push到指定远程分支git push origin HEAD:branch1tag
:标签。12345678910111213141516// 列出所有taggit tag// 新建一个tag在当前commitgit tag 1// 新建一个tag在指定commitgit tag 2 8989920311bacb3f4e3ced7f82ab75ca47c318c7// 删除本地taggit tag -d 1// 查看tag信息git show 2// 提交所有taggit push --tags// 删除远程taggit push origin --delete tag 2// 新建一个分支,指向某个taggit checkout -b [branch] [tag]remote
:远程。123456789101112// 查看远程库的地址列表git remote -v// 查看这个远程库的信息git remote show origin// 从远程库更新所有的信息到本地,但是不合并git fetch origin// 从远程库更新所有的信息到本地,但是不合并并清理已删除的远程分支git fetch -p origin// 从远程库更新数据并立即合并数据git pull origin branch1// 将本地数据同步到远程库中git push origin branch1
Git 客户端实用示例
1、示例:将本地代码提交到 GitHub 上。
前期准备:
cd Desktop/git
(桌面文件夹)git clone https://github.com/CustomPBWaters/liunDemo.git(仓库的URL)
cd liunDemo
(github上建的文件夹) 把要上传的Demo
放到建的桌面 git 文件夹里。ls -a
会提示下步操作。git commit -am CoreDataDemo
,这里的CoreDataDemo是我本地的Demo。12git add CoreDataDemo 把工作区的内容提交到暂存区git commit -m CoreDataDemo 把暂存区中的内容提交到提交区git status
查看提交状态。这时第一次提交,会让输入GitHub用户名密码。
git push
将文件推送到服务器上。注意:要传得Demo项目中,有的含隐藏文件.git,需要删除 rm -rf .git,再上传就可以了。
2、示例:解决冲突(手动解决)。
打开冲突文件,删除<<<<<<< HEAD ======= >>>>>>> branch1
这三行
再修改成想要的,添加,提交即可。
SVN & Git 两者比较
SVN & Git特点 |
---|
结构(最主要的区别) |
SVN是集中式管理,Git是分布式管理 |
速度 |
在很多情况下,git的速度远远比SVN快 |
难度 |
SVN功能简单,指令简单,入门容易。Git功能完善,指令复杂,入门简单掌握难 |
其他 |
SVN使用分支比较笨拙,git可以轻松拥有无限个分支 |
SVN必须联网才能正常工作,git支持本地版本控制工作 |
旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git |
补充
集中式版本控制
在分布式下开发者可以本地提交。
每个开发者机器上都有一个服务器的数据库。
从稳定可靠的角度来看,分布式肯定是更好的选择。
总结
这两个版本控制一直持续到现在,两者都有其优点和缺点。
个人认为两者没有绝对的优势,能够取代另一方。
但是从功能上来讲,Git 拥有SVN大致所有的功能,还拥有更多可靠,便捷,个性化的指令方便操作。
就剩最后一句话了,没错,想要复杂的功能,就要承受学习的代价。
码农们踩过的坑整理(持续~)
期待
- 如果在阅读过程中遇到 error || new ideas,希望你能 messages 我,我会及时改正谢谢。
- 点击右上角的 喜欢 和 订阅Rss 按钮,可以收藏本仓库,并在 Demo 更新时收到邮件通知。