分布式版本控制系统——Git(下)

接着上次分布式版本控制系统——Git(上)继续学习Git啦。多一些刻意的练习,就会多掌握一份技能。ヾ(◍°∇°◍)ノ゙

文章目录

      • 分支管理
        • 创建与合并分支
        • 切换分支
        • 解决冲突
        • Bug分支
        • 多人协作
          • 推送分支
          • 抓取分支
      • 标签管理
      • 自定义Git
        • 忽略特殊文件
        • 搭建Git服务器

分支管理

创建与合并分支

创建dev 分支,然后切换到dev分支

分布式版本控制系统——Git(下)_第1张图片

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout 命令加上-b参数表示创建并切换,相等于以下两条命令:

$ git branch dev
$ git checkout dev

使用git branch命令查看所有分支,当前分支前面会标一个*号:

$ git branch
* dev
  master

然后,就可以在dev分支上正常提交了,git addgit commit -m提交完成,分支工作结束之后,切换回master分支:

$ git checkout master
Switched to branch 'master'

将dev分支的提交合并到master上 :

#参数--no-ff:表示禁用Fast forward,可以看出曾经做过合并,
$ git merge [--no-ff -m "message"] dev

git merge命令用于合并指定分支到当前分支,关于合并模式

  • Fast-forward:快进模式,直接把master指向dev的当前提交,在这种模式下,删除分支后,会丢掉分支信息。

合并完成,可以删除dev分支了

# git branch -D [branch] 强行删除 
$ git branch -d dev
Deleted branch dev (was 3ba40f4).

切换分支

git switch [-c] master切换分支,-c:创建并切换到新的分支。

解决冲突

需要解决冲突即Git无法自动合并分支时,首先需要解决冲突:git status查看产生冲突的文件,查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。手动解决完冲突之后,再进行提交

#用带参数的git log --graph查看分支的合并图,若不加--graph的话,只会出现commit信息
$ git log --graph --pretty=online --abbrev-commit

Bug分支

场景:若当前正在工作的分支为dev(未完成),突然来了一个紧急代号为101的bug,需要创建一个临时分支issue-101进行修改。

  • 保存当前所在dev分支的工作

    #将当前工作中的分支储藏起来,等以后恢复继续工作
    $ git stash
    # git status查看工作区,干净,放心修改bug
    
  • 需要确定在哪个分支上修复bug,转到该分支之后,建立临时分支[例如bug在master分支上]

    $ git checkout master
    $ git checkout -b issue-101
    #接下来,进行修复工作,add,commit,修复完成
    #切换到master分支
    $ git switch master
    #完成合并
    $ git merge --no-ff -m "message" issue-101
    #删除临时分支
    git branch -d issue-101
    
  • 恢复dev分支

    $ git switch dev
    # 查看之前工作现场保存到何处了
    $ git stash list
    # 恢复现场
    #1.恢复后,stash内容并不会删除,stash@{0}-删除指定的stash,是由git stash list获得
    $ git stash apply [stash@{0}]
    #需要删除stash内容
    $ git stash drop
    #2.恢复的同时把stash内容也删除了
    $ git stash pop
    

    若该bug也在dev分支中存在,该如何修复呢

    #将issue101提交的修改复制到dev分支上即可
    $ git cherry-pick <commit id> 
    

多人协作

推送分支
$ git push <远程库的名字,默认是origin> <所要推送的branch>

向bug这种分支就不需要进行推送,自己本地用就可以。

抓取分支

小伙伴clone下远程库,默认只能看到本地的master分支,要想在dev分支上开发,就必须创建远程origin的dev分支到本地

$ git checkout -b dev origin/dev

此时小伙伴就能在dev分支上工作了,若多人产生推送冲突

#先把最新的提交从origin/dev抓下来,然后本地合并,解决冲突,再推送
$ git pull
#若提示no tracking information表示没有指定本地dev分支与远程origin/dev分支的链接,执行
$ git branch --set-upstream-to=origin/dev dev
#再次git pull之后,若产生冲突,查看解决冲突部分

标签管理

发布一个版本时,通常先在版本库中打一个标签(tag)实际上就是指向某个commit的指针,但标签不可以移动。若commit出现在多个分支上,那么这几个分支均可以看到这个标签。

  • 创建标签

默认标签是打在最新提交的coomit上的;查看标签的时候,是按照字母排序的。

#切换到需要打标签的分支上,执行
$ git tag v1.0
#向某个指定commit上打标签
$ git tag <tagname> <commit id>
#创建带有说明的标签
$ git tag -a <tagname> -m "message" <commit id>
  • 操作标签

    #创建的标签只存在本地,不会自动推送到远程,打错的标签可在本地安全删除
    $ git tag -d <tagname>
    #推送某个标签到远程
    $ git push origin <tagname>
    #一次性推送所有尚未推送到远程的标签
    $ git push origin --tags
    #若标签推送至远程库,要想删除远程标签
    #1.先从本地删除
    #2.再从远程删除
    $ git push origin :refs/tags/<tagname>
    

自定义Git

忽略特殊文件

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把妖忽略的文件名填进去,Git就会自动忽略这些文件。忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
# git reset HEAD file:将暂存区的修改撤销掉,重新放回工作区
$ git config --global alias.unstage 'reset HEAD'
#显示最后一次提交信息
$ git config --global alias.last 'log -1'

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 lg
有点炫酷哈,没有实操,直接截的图,O(∩_∩)O哈哈~真够懒的 ,o(╥﹏╥)o
分布式版本控制系统——Git(下)_第2张图片

每个仓库的Git配置文件都放在.git/config文件中;当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig文件中。修改和删除别名可以直接在配置文件中进行修改。

搭建Git服务器

准备一台Linux机器,推荐使用Ubuntu或Debian,通过apt进行安装。

使用的账号要有sudo权限

#1.安装git
$ sudo apt-get install git
#2.创建一个git用户,运行git服务
$ sudo adduser git
#3.创建证书登录,将所有需要登录的用户的公钥(id_rsa.pub)导入/home/git/.ssh/authorized_keys文件里,每行一个
#4.初始化Git仓库;选定一个目录为Git仓库/sample/rep.git,在/sample目录下输入
$ sudo git init --bare rep.git
# 这个仓库不让用户登录到服务器去改工作区,并且服务器上的Git仓库通常都是以.git结尾的
#修改owner
$ sudo chown -R git:git rep.git
#5.禁用shell登录,编辑/etc/passwd文件
#6.clone远程仓库

管理公钥、权限的工具=》Gitolite

GUI工具=》SourceTree

你可能感兴趣的:(工具癖,分布式,git,github)