1.1 版本管理工具介绍
 
什么是版本管理工具
 
为什么要使用版本管理工具?
 
老板要求小明写一个可行性报告,当他写完给老板看后,结果……
 
 
Git简介
 
早先linux内核代码托管在BitKeeper,这个东西是商业的,但是免费给linux社区使用
 
llinux社区有个牛人试图破解BitKeeper,被BitKeeper公司人发现后,不再免费提供使用权,于是linus花两周时间开发了一个分布式的版本控制系统,就是git
 
其实git功能和svn是类似的,但svn是集中管理,git是分布式管理
 
集中管理:必须要有一台服务端,代码仓库是在服务端上,客户端(个人电脑)需要从服务端上同步代码到自己电脑上,开发完要推送到服务端。这种架构依赖网络,传输也比较慢。
 
分布式:可以没有服务端,所有个人电脑都可以有完整的代码仓库,代码的更新、推送、分支、合并都可以在自己电脑上完成。它也支持多人协作,不过需要有一个公共的git服务器作为支撑。
 
 
 
集中管理和分布式
 
 
 
1.2 git安装
 
CentOS上
yum install -y epel-release ; yum install -y git
Ubuntu上
sudo apt-get  install  git
windows上安装msysgit
下载地址  https://git-for-windows.github.io
或者 http://pan.baidu.com/s/1skFLrMt#path=%252Fpub%252Fgit
安装完成后,还需要最后一步设置
git config --global user.name "Your Name" //比如 weifeng
git config --global user.email "weifeng@weifenglinux.com" //写你的邮箱
 
 
 
创建版本仓库并推送文件
 
mkdir  /home/gitroot
cd /home/gitroot
git init   //用这个命令初始化,让这个目录变成git可以管理的仓库
ls -a  可以看到多了一个.git的目录
echo -e "123\naaa\n456\nbbb" > 1.txt //创建一个文件 1.txt
git add 1.txt  //把1.txt添加到仓库中
git commit -m "add new file 1.txt"   //add完了必须要commit才算真正把文件提交到git仓库里
echo -e "111111\n2222222222" >> 1.txt  //更改一下1.txt
git status   //查看当前仓库中的状态,比如是否有改动的文件
git diff 1.txt  //可以对比1.txt本次修改了什么内容,相比较仓库里面的版本
 
 
 
版本变更
 
多次更改1.txt,并进行 git add,  git commit操作
git log  //可以查看所有提交git仓库的记录操作
git log --pretty=oneline  //一行显示,更清楚
通过git log可以查看到过去提交的所有版本,所以根据这个log,可以指定回退某个版本
git reset --hard 0ff5ab1  //可以回退到第二行的这个版本,这里后面跟的字符串可以简写。
当回退到该版本后,再  git log 则最上面的版本不再显示了,那如果想再倒回退到第一行那个版本怎么办?
git reflog  //可以显示所有的版本
 
 
文件恢复
 
修改1.txt,发现改的不对,想恢复到上一次提交时的状态。或者1.txt不小心给删除掉了。可以使用
git checkout -- 1.txt  //恢复到上一次提交时的状态
 
如果1.txt修改完了,保存后,git add 1.txt了,但没有commit,再想回退到上一次提交时的状态。可以使用
git  reset HEAD 1.txt
然后再
git checkout -- 1.txt
 
那如果不仅add也commit了,那就用版本变更的办法吧
 
 
文件删除
 
echo "22222222222222" > 2.txt  //新建2.txt文件
git add 2.txt
git commit -m "add new file 2.txt"
上面的操作,我们在git仓库里提交了一个新的文件2.txt,下面删除它
rm -f 2.txt
git status //可以看到,提示2.txt文件被删除了
如果要想恢复,直接用  git  checkout -- 2.txt
现在是,我们想在git仓库里删除
git rm 2.txt
git commit -m "delete 2.txt"
这样就彻底删除了2.txt
 
 
创建一个远程仓库(github)
 
首先到 https://github.com 注册一个账号,创建自己的git,点repositories 再点new
名字自定义,比如叫studygit  选择public  点 create repository
添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys
左侧点New SSH key,把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里          ( 创建 rsa.pub:  ssh-keygen -t rsa  )
把本地仓库推送到远程仓库
git remote add origin git@github.com:aminglinux/studygit.git  //这一步是在远程创建一个新的仓库studygit,名字尽量和本地的一致
git push -u origin master  //然后把本地的studygit仓库推送到远程的studygit
下一次再推送,就可以直接 git push
 
 
[[root@weifeng01 home]# mkdir studygit2
[root@weifeng01 home]# cd studygit2
[root@weifeng01 studygit2]# git init
Initialized empty Git repository in /home/studygit2/.git/
[root@weifeng01 studygit2]# git remote add origin git@github.com:weifeng1463/studygit2.git
[root@weifeng01 studygit2]# ls
[root@weifeng01 studygit2]# echo -e "123\naaa\n456\nbbb" > 1.txt
[root@weifeng01 studygit2]# git add 1.txt
[root@weifeng01 studygit2]# git commit -m "add new file 1.txt"
[master (root-commit) 4cc5084] add new file 1.txt
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 1.txt
[root@weifeng01 studygit2]# ls
1.txt
[root@weifeng01 studygit2]# git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:weifeng1463/studygit2.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
 
[root@weifeng01 studygit2]# vi 1.txt
[root@weifeng01 studygit2]# git add 1.txt
[root@weifeng01 studygit2]# git commit -m "change 1.txt"
[master 9acf786] change 1.txt
 1 files changed, 7 insertions(+), 0 deletions(-)
[root@weifeng01 studygit2]# git push
Counting objects: 5, done.
Writing objects: 100% (3/3), 265 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:weifeng1463/studygit2.git
   4cc5084..9acf786  master -> master
 
 
克隆一个远程仓库
 
远程仓库需先已建立
 
 cd /home
git clone  git@github.com:aminglinux/lanmp.git
它提示,会在当前目录下初始化一个仓库,并创建一个.git的目录,如下
Initialized empty Git repository in /home/lanmp/.git/
完成后,ls可以看到一个lanmp的目录
cd  lanmp
vi lanmp.sh 编辑一下文件,然后提交
git add lanmp.sh
git commit -m "sdlfasdf"
然后再推送到远程服务端
git push
 
 
分支管理
 
git branch //查看分支
git branch aming  //创建分支
git checkout  aming //切换到了aming分支下
再用git branch查看,会看到有两个分支master和aming,当前使用的分支前面会有一个*
在aming分支下 ,编辑2.txt,并提交到新分支
echo "askdfjlksadjflk" >  2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj"
切换回master分支
git checkout master
此时cat 2.txt发现并没有更改内容
 
 
分支的合并与删除
 
git merge aming   //把aming分支合并到了master
如果master分支和aming分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
解决冲突的方法是在master分支下,编辑2.txt,改为aming分支里面2.txt的内容。 然后提交2.txt,再合并aming分支。
但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 可以编辑2.txt内容,改为想要的,然后提交。切换到aming分支,然后合并master分支到aming分支即可。(倒着合并)合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
git  branch -d aming //删除分支
如果分支没有合并,删除之前会提示,那就不合并,强制删除
git branch -D aming
 
使用分支的原则
 
对于分支的应用,建议大家以这样的原则来:
master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支
在dev分支合并bob分支的命令是:
git checkout dev   //先切换到dev分支,然后
git merge bob
 
 
现场保留
 
当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。
比如我们在aming分支,编辑了一个新的文件3.txt
这时候我们需要到其他分支去修复一个bug,所以需要先git add 3.txt
然后 git  stash  保存一下现场
再切换到另外分支去修复bug,修复完bug后,再回到aming分支
git stash list 可以看到我们保存过的现场
用 git stash apply 恢复现场
也可以指定stash:
git stash apply stash@{1}
 
 
远程分支
 
查看远程库信息,使用git remote -v  本地新建的分支如果不推送到远程,对其他人就是不可见的
查看远程分支  git ls-remote origin
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
 
 
标签管理
 
标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。
git checkout master 先切到master分支上
git tag v1.0  给master打一个标签v1.0
git tag 可以查看所有的标签
tag是针对commit来打标签的,所以可以针对历史的commit来打tag
git log --pretty=oneline --abbrev-commit  //先查看历史的commit
git tag v0.9 46d3c1a  //针对历史commit打标签
git tag -a v0.8 -m "tag just v1.1 and so on"  5aacaf4  //可以对标签进行描述
git tag -d v0.8  //删除标签
git push origin v1.0   //推送指定标签到远程
git push --tag origin   //推送所有标签
如果本地删除了一个标签,远程也想要删除需要这样操作:
git tag v1.0 -d    //删除本地标签
git push origin :refs/tags/v1.0   //删除远程标签
 
巧用别名
 
git commit 这个命令是不是有点长? 用别名可以提高我们的工作效率
git config --global alias.ci commit
git config --global alias.co  checkout
git config --global alias.br  branch
 
查看git别名使用命令
git config --list |grep alias
 
查询log小技巧:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
 
取消别名
git config --global --unset alias.br
 
 
搭建git服务器
 
github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。
找一台服务器,首先要安装git
yum install git
添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆
useradd -s /usr/bin/git-shell git
cd /home/git
创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥
mkdir .ssh
touch .ssh/authorized_keys
chown -R git.git .ssh
chmod 600 .ssh/authorized_keys
 
 
定好存储git仓库的目录,比如 /data/gitroot
mkdir /data/gitroot
cd /data/gitroot
git init --bare sample.git // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾
chown -R git.git sample.git
以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的。
首先要把客户端上的公钥放到git服务器上/home/git/.ssh/authorized_keys文件里
在客户端上(自己pc)克隆远程仓库
git clone git@ip:/data/gitroot/sample.git
此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程仓库了。进入到这里面,可以开发一些代码,然后push到远程。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

分布式代码管理系统Git实践的更多相关文章

  1. 分布式代码管理系统GIT

    1.1Git安装 CentOS上   yum install -y epel-release; yum install git Ubuntu上    apt-get install git Windo ...

  2. GIT分布式代码管理系统

    1:GTI介绍及使用 环境搭建: 服务器 IP地址 主机名 角色 Centos7.5 192.168.200.113 gitserver GIT服务器 Centos7.5 192.168.200.11 ...

  3. git分布式版本管理系统

    Git是分布式版本管理系统Svn是集中式版本管理系统 git速度快,适合大规模协同开发 什么是分布式版本管理系统 假如有10个人,每个人的代码库都是独立的,自己想进行代码提交回滚都可以,无需链接中央服 ...

  4. CODING 代码多仓库实践

    关于代码的管理问题已经讨论多年,随着企业业务的复杂度提高.软件行业技术栈的选择度变宽泛,现代软件的代码仓库也变得越来越庞大和复杂.一个中型项目,将测试代码.核心业务代码.编译构建.部署打包等基础设施的 ...

  5. [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境

    [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...

  6. 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境(服务器端及客户端)(转)

    近期想改公司内部的源码管控从TFS为git,发现yubinfeng大侠有关git的超详细大作,现将其转载并记录下,以防忘记,其原博客中有更加详细的git及.net开发相关内容.原文地址:http:// ...

  7. 开源分布式版本控制工具 —— Git 之旅

    Git 主张的分布式代码库与文件快照的设计思想,相对于传统 CVS.SVN 等集中式.文件差异式版本控制工具是一种挑战与颠覆.Git 带来了离线提交.轻量级分支等诸多便利.不过,也有人质疑 Git 的 ...

  8. [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git

    [.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...

  9. [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...

随机推荐

  1. angular 4 http 之web api 服务

    Angular Http是获取和保存数据的.主要是为了取到我json文件里的数据. 直接上代码吧: 1.  先介绍Promise模式的:(直接代码) heroes.json: 1 2 3 4 5 6 ...

  2. MySQL Command Line Client显示中文的部分为空

    一连接数据库的时候就设置如下: 先设置 set names gbk,然后再插入就显示中文

  3. esp8266 终于装上固件了!半个月了!开始进军简单粗暴的lua语言!!

    第一次测试2017-10-2720:33:33 感谢这位大神的汇总资料太详细了 http://www.cnblogs.com/yangfengwu/p/7524326.html --first tes ...

  4. .net Core学习笔记3 编辑列表并绑定下拉列

    本次主要实现列表的编辑及下拉列表的绑定 先看效果图: 主要用DropDownList绑定下拉列后端代码: 1:定义一个存下拉数据类 public class SelectItem { public s ...

  5. python初识-day3

    1.字符串常用操作(较多,用代码加注释表示) name = '\tMy name is congcong' print(name.capitalize())#输出结果为 My name is cong ...

  6. java IO(一):File类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. su鉴定故障

    su切换用户鉴定故障 [yolo1@izqfsfqp8ejn9zz ~]$ su root密码:su: 鉴定故障[yolo1@izqfsfqp8ejn9zz ~]$ sudo root 我们信任您已经 ...

  8. awk完全手册

    awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项3. 模式和操作 3.1. 模式 3.2. 操作4. awk的环境变量 5. awk运算符 6. 记录和域  ...

  9. 【转】DEM DTM DLG DRG DOM DSM

    pasting DTM DLG DRG DOM DSM" title="[转载]DEM DTM DLG DRG DOM DSM" height="477&quo ...

  10. js基本语法与变量

    1.//声明变量,js是弱类型语言,变量类型声明示没有意义的.变量类型是随时可以变化的.var a = 1;      a = "haha";    a = false;2.注释与 ...