手把手教你如何进行 代码版本控制

请各位读者添加一下做者的微信公众号,之后有新的文章,将在微信公众号直接推送给各位,很是感谢。
javascript

0.前言


注意:若文章中出现图片没法加载的状况,请移步做者的其余博客。java

最近 S 君进入某互联网公司进行开发,但是进入公司工做的第一件事就是要将本身天天开发的成果递交给老大。git

但是,这时候 S 君遇到一个问题。github

“大家天天的代码要上传到仓库里,记得检查冲突。”服务器

仓库?代码上传?这些都是什么意思呀?微信

抱着试试看的心态,S 君找到了我,因而也就有了今天的文章。网络

1.版本控制


首先在文章的开始前,先来介绍一下,什么叫作版本控制。app

版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程当中,确保由不一样人所编辑的同一档案都获得更新。运维

说白了,所谓的版本控制其实就是咱们在平常的开发过程当中,将天天、每一个阶段、每一个功能等要求完成以后,将咱们的代码再提供给他人的一种行为。工具

这个行为的目的就是,让每个人的开发过程都有据可查,最后实现多人合做开发的目的。

而版本控制的过程当中,很是重要的一个问题就是,储存库(也就是仓库)的建立。

接下来咱们来介绍一下,关于仓库的概念。

2.数据仓库


通常在开发的过程当中,项目 leader 通常会将大家的项目仓库进行划分。

可是通常来讲,无论怎么划分,都离不开如下几个内容。

首先来讲一下上图中出现单词的含义。

  • Master : 领导,通常是大家 leader
  • Hotfix : 热修复,通常是有问题了,以后通知用户本身下载补丁
  • Release :发布,就是上线了
  • Develop :开发者,不用说了,就是咱们
  • Feature :特点,备用版本

除此以外,在开发过程当中,其实跟程序息息相关的倒是另外几个仓库。

这里会设计到一些公司 CTO 的想法和意见,因此每一个公司都不相同,请选择查看。

通常公司内部都会有一个研发规范,而我们须要注意的就是在研发规范中,对于仓库的使用。

PS:我竟然能找到这个,当时本身都惊了。

仓库名称 稳定程度 权限 说明
branches 开发分支,不稳定 开发team有权限 有开发任务时,从trunk打分支到branches,分支命名以dev_为前缀,加上日期(若是trunk分支在测试且证实极度不稳定,想取稳定分支,从tags取)。开发完成时,而且开发自测完成,由研发Leader合并到主干trunk,测试从trunk发包进行测试。
trunk 主干分支,趋于稳定 开发Leader有权限 最新趋于稳定版本代码存放地。开发Leader有权限从开发分支merge代码到主干,而后质量部进行测试,测试经过由运维部打上线分支到tags。研发leader要控制trunk的时序性。(也就是说尽可能避免一个brances合并到trunk进行测试以后,在没有完成测试前又合并一个分支,致使测试返工。)
tags 上线分支,稳定 运维有权限 方便回滚和记录。以日期命名,如201 *

实际开发中,大概就是这个样子。

固然,若是大家公司使用的是 Git ,其实效果也是同样,具体的都会由大家 leader 来完成。

3.版本控制的工具


上面说了这么多的内容,咱们在开发的过程当中,使用到了各类仓库。

能够,咱们又回到了 S 君的问题,就是,咱们怎么去进行版本控制呢?

在此,我想说明的是,若是遇到一个问题,你第一个反应不该该是去询问他人,而是看看本身是否可以解决。你是本身查询资料也好,是在网络上搜索也罢,只要是你本身独立解决的问题,你的记忆会很是深入的。

好了,回归正题。

关于代码版本控制经常使用的两个仓库分别是 SVNGithub,固然,也有不少其余的控制工具。

对于纯代码的方式,你们能够优先学习一下,并且网上教程一堆,在此就不作更多说明了。

而做者在此给你们推荐两个图形化仓库管理工具。

也就是 SourceTree 以及 Cornerstone。

关于下载地址,你们能够自行在网上搜索一下,做者在这里就不作更多说明了。

4.将你的代码上传至仓库


由于做者日常使用的都是 Git,因此这里的演示也以 Git 为准。

除此以外,今天只演示如何将一个本地的文件上传至 Git 上,若是在公司的话,请按照公司本身的标准来。

最后,在开始操做前,你须要保证本身已经有了如下内容。

  • SourceTree 的客户端
  • Github 的帐号

若是你们以前已经使用过 SourceTree 或者已经登陆过某帐号了,请在 SourceTree 中删除本来帐号。

以后请打开你的 Github,并登陆。

以后请在右下角处,选择 New repository 去建立一个新的仓库。

点击事后会出现这个界面。

建立完毕,这时候咱们就已经获得咱们的仓库了。

但是,想要向仓库中添加内容,这里还只是个开始。

这时候咱们找到咱们的仓库的地址,复制下来。

打开咱们的 SourceTree 工具。

一样点击 New Repository。

选择 Clone from URL。

选择完成后会要求你填写三个内容。

  • 第一个指的是你 Github 上的那个地址连接。
  • 第二个是指你须要克隆所使用的文件夹地址
  • 第三个会根据第二个自动生成,固然,你也能够修改

当克隆完毕以后,咱们当前这个文件夹就和 Git 上的那个文件夹相连啦。

这时候咱们只须要将咱们对应的文件直接拖进当前文件夹便可。

以后咱们须要作的就是,回到咱们的 SourceTree 中,开始提交。

固然,提交的过程当中,会提示你,让你输入你 GIT 的帐号和密码。

正常输入便可,当提交完毕以后,你就会发现咱们的内容已经上传到 Git 上啦。

5.经过代码来完成代码的上传


5.1 初始化

一般有两种方式来进行初始化:

1)git clone是一种较为简单的初始化方式,当你已经有一个远程的git版本库时,只须要在本地克隆一份便可。 例如在终端中输入:

git clone git://github.com/someone/some_project.git some_project复制代码

上面的命令就是将远程版本库克隆到本地电脑的some_project目录下。

2)git init和git remote。这种方式稍微复杂一些。当你本地建立了一个工做目录,你能够进入这个目录,使用git init命令建立一个git版本管理库。这时候若是须要将工程放到远程服务器上,能够在远程服务器上建立一个目录,并把可访问的URL记录下来,此时就可使用git remote add命令来增长一个远程服务器版本了。例如:

git remote add origin git://github.com/someone/another_project.git复制代码

上面的命令就会增长该URL地址且名称为origin的远程服务器。之后提交的代码只须要使用origin这个别名便可。

5.2 分支操做

  • 查看本地分支:git branch
  • 查看远程分支:git branch -r
  • 查看全部的分支:git branch -a
  • 建立本地分支:git branch name
    • 注意新分支建立后不会自动切换为当前分支
  • 切换分支:git checkout name

    • 这里须要注意的一点就是,若是是要同步远程的分支(好比同事创建了新的分支,以保证针对某个版本的修改在该分支下),请不要在本地新建一个跟远端同名的分支,也就是说不要使用git branch name这个命令,而是直接使用git checkout name命令把远端的分支拉下来便可。以免把新的代码合并到旧的分支里。
  • 建立新分支并当即切换到新分支:git checkout -b name

  • 删除分支:git branch -d name
    • -d选项只能删除已经参与了合并的分支,对于未有合并的分支是没法删除的。若是想强制删除一个分支,可使用-D选项
  • 合并分支:git merge name
    • 将名称为name的分支与当前分支合并,是合并到当前分支,而不是合并到name分支。要注意的合并前先使用 git branch查看下当前所处的分支。
    • 能够在后面加参数

好比我要把issue340分支合并到dev分支,能够先checkout到dev分支并使用如下命令:

git merge issue340 -n --ff复制代码
  • 建立远程分支(本地分支push到远程):git push origin name

  • 删除远程分支:git push origin :heads/name 或 git push origin : name。

这里须要注意的是,在开发新功能、测试或者重构部分代码时,最好是新建一条分支来操做,测试新功能OK后再合并回主分支,以免干扰到主分支。

5.3版本操做

  • 查看版本:git tag

  • 建立版本:git tag name

  • 删除版本:git tag -d name

5.4 撤销文件更改

git checkout有两个做用,其中一个功能是在不一样的branch之间进行切换,例如git checkout another_branch就会切换到another_branch的分支上去。

另外一个功能是还原代码的做用,例如git checkout app/model/user.rb就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容所有会回滚到改动前的状态。

5.5 查看git配置

git config --list该指令能够查看全部关于git的配置,用户和邮箱,远程库的URL等。

5.6 版本回滚

git版本管理的好处就在于有无限的反悔权。git reset HEAD^就會回到前一版本(一個^表示是前一版),並把其中的 changes 繼續留在 working tree 中。適合發現前一次 commit 有問題或是想要修改 commit log,能够修改後再从新 commit。

git reset若是加上–soft參數則會把 changes 直接加到 staging area(暂存区)。加上–hard參數表示不留 staging area 也不留 working tree(彻底刪除任何修改記錄)。例如git reset --hard指令会清楚全部与最近一次commit不一样的修改,也就是说放弃当前全部的更改。

若是在合并(merge)过程当中发生冲突了,想放弃此次合并,也可使用git reset --hard来取消。

git reset --hard ORIG_HEAD指令会取消最近一次成功的合并以及全部你在此次合并后所作的修改。

5.7 修改上一次提交的信息

有时候手抖,在尚未输入完提交信息的时候按了回车,能够用以下指令修改提交的信息:

git commit -m"your message" --amend复制代码

5.8 单个文件回滚

有时候为了改了一个功能,没彻底测试OK就推到服务器了,发现改的功能还不如以前的好用怎么办? 有两种状况,第一种是,在你提交错误的代码到服务器后,队友还有没有提交过,可使用该指令:

git reset --hard commit_id复制代码

其中commit_id是提交记录的代号,可使用指令:

git log复制代码

来查看全部的提交记录,找到你须要回滚的版本便可(键盘方向键可滚动查看全部记录,鼠标目测不行)。

这里要注意的是,git会回滚到你最近一次提交的commit_id以后的版本,而不是commit_id以前的版本。在本次操做中,因为队友都没有更新,只须要找到当前提交的上一次的commit_id便可。好比今天是3月21日,你提交了错误的代码到服务器,服务端在以前3月20日有一次更新,那你找到3月20日的commit_id便可。

第二种状况是,若是你提交了错误代码后队友也有新的提交,直接版本回退会把队友新提交的代码也搞没了,这时候若是你改动的文件很少的话,可使用单个文件回滚的方式: 1)执行git log test.h查看该文件的提交记录,找到须要回滚的commit版本,复制版本号。 2)执行git reset “commit版本号” test.h 3)继续执行git checkout test.h,文件回滚成功。

须要注意的是,若是文件在比较深的目录下,上述操做室须要输入目录结构的,好比git log aaa/bbb/test.h。

5.9 其余

  1. 提交代码的一般步骤git status查看当前状态,有改动则使用git add.把全部改动添加到本地仓库or暂存区?而后git commit -m"your commit message"后,先it pull拉下服务器的最新代码,确认没有问题后能够git push提交代码。

  2. git pull以后,或者进入其余界面,均可使用:wq退回到git的操做界面

  3. 若是在git pull或者git push时,提示没有设置pull或者push的默认分支,按照提示的指令设置默认分支便可。

再次强调,在开发新功能、测试或者重构部分代码时,最好是新建一条分支来操做!

6.后记


前先后后花了 6 个多小时,总算是写完了。

但愿可以帮到大家吧。

看完记得点个赞。

最后,本文由 李鹏 手打完成,请勿随意转载。

做者保留法律追究权利。

相关文章
相关标签/搜索