• 分布式代码管理系统Git实践


    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 aaa 456 bbb" > 1.txt //创建一个文件 1.txt
    git add 1.txt  //把1.txt添加到仓库中
    git commit -m "add new file 1.txt"   //add完了必须要commit才算真正把文件提交到git仓库里
    echo -e "111111 2222222222" >> 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 aaa 456 bbb" > 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到远程。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    HDU 1982 Kaitou Kid The Phantom Thief (1)
    HDU 1984 Mispelling4
    HDU 2546 饭卡
    HDU 1009 FatMouse' Trade
    在VC 中如何隐藏一个主程序窗口
    .菜单项
    SetClassLong,GetClassLong 动态改变光标
    .窗口捕获鼠标
    .主窗口向子控件发送消息
    线段树 1698 Just a Hook 区间set更新
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/7417977.html
Copyright © 2020-2023  润新知