2016年01月04日

Git是这个世界上最牛逼的版本控制系统(没有之一)

(本文同步发在我的OSCHINA博客)

本篇作为总结回顾或速查手册. 感谢廖雪峰前辈的精彩写作,也算借本文总来GIT的使用

一、简介

  1. Git是目前世界上最先进的分布式版本控制系统(没有之一)
  2. Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!

二、安装

  1. Linux:sudo apt-get install git

  2. Mac:

    • 通过homebrew安装Git参考homebrew:http://brew.sh/
    • 安装Xcode, 菜单“Xcode”->“Preferences”->“Downloads”->“Command Line Tools”->“Install”
  3. Windows: 从http://msysgit.github.io/下载msysgit安装.

  4. 安装完成后配置(–global参数,表示本机所有Git仓库都使用这个配置):

     $ git config --global user.name "Your Name" 
     $ git config --global user.email "email@example.com" 
        
    

三、创建版本库

  1. 创建库

     $ mkdir learngit  
     $ cd learngit
     $ git init
     Initialized empty Git repository in /Users/michael/learngit/.git/ (系统输出)
        
    
    • .git的目录是Git来跟踪管理版本库的,默认是隐藏的。
    • Windows请使用高级文本编辑避免BOM问题及注意编码问题。
  2. 添加文件到GIT仓库

    • 创建readme.txt文件

    • 把文件添加到仓库索引
      $ git add readme.txt

    • 把文件提交到仓库(-m后面输入的是本次提交的说明)
      $ git commit -m "wrote a readme file"

    • 也可以一次提交很多文件

        $ git add file1.txt  
        $ git add file2.txt file3.txt 
        $ git commit -m "add 3 files." 
              
      

四、时光穿梭机

  1. 查看结果(查看当前状态)
    $ git status
  2. 比较文件区别
    $ git diff readme.txt
  3. 查看历史记录(查看每次的改动)(–pretty=oneline可缩成一行一条, 看起来更清楚)
    $ git log
  4. HEAD表示当前版本, 上一个版本HEAD^, 上上一个版本HEAD^^, 上一百个版本HEAD~100
  5. 退回上一个版本
    $ git reset --hard HEAD^ 或者是ID号 $ git reset --hard 3628164
  6. git reflog用来记录你的每一次命令, 可用来查找已被回退的版本号。
  7. 当前目录是就是一个工作区
  8. 用git add把文件添加进去,实际上是把文件修改添加到暂存区
  9. 用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支
  10. 创建Git版本库时,Git自动为我们创建了唯一一个master分支
  11. $ git checkout -- readme.txt放弃工作区的修改
  12. $ git reset HEAD readme.txt把暂存区的修改撤销掉(unstage),重新放回工作区
  13. $ git rm test.txt删除文件

五、远程仓库

  1. 关联远程仓库 git remote add origin git@server-name:path/repo-name.git
  2. 第一次推送并关联(参数-u关联分支)git push -u origin master
  3. 以后就可以直接推送git push origin master
  4. 克隆远程仓库$ git clone git@github.com:michaelliao/gitskills.git
  5. Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快.

六、分支管理

  1. 查看分支:git branch
  2. 创建分支:git branch <name>
  3. 切换分支:git checkout <name>
  4. 创建+切换分支:git checkout -b <name>
  5. 合并某分支到当前分支:git merge <name>
  6. 删除分支:git branch -d <name>
  7. 合并冲突时Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
  8. git log --graph命令可以看到分支合并图。
  9. 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
  10. git stash可以暂存现场,然后去修复bug,修复后再git stash pop,回到工作现场。
  11. 也可全用 git stash apply 恢复, git stash drop 来删除。
  12. git branch -D <name> 可以强行删除分支
  13. 查看远程 库信息$ git remote
  14. 显示远程库详细信息git remote -v
  15. 从本地推送分支git push origin branch-name
  16. 在本地创建和远程分支对应的分支git checkout -b branch-name origin/branch-name
  17. 建立本地分支和远程分支的关联git branch --set-upstream branch-name origin/branch-name
  18. 从远程抓取分支git pull

七、标签管理

  1. git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id
  2. 指定标签信息git tag -a <tagname> -m "blablabla..."
  3. 用PGP签名标签git tag -s <tagname> -m "blablabla..."
  4. 查看所有标签git tag
  5. 推送一个本地标签git push origin <tagname>
  6. 推送全部未推送过的本地标签git push origin --tags
  7. 删除一个本地标签 git tag -d <tagname>
  8. 删除一个远程标签 git push origin :refs/tags/<tagname>

八、自定义GIT

  1. 忽略某些文件时,需要编写.gitignore

  2. .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

  3. 配置别名,例:$ git config --global alias.st status 用st表示status

  4. 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"配置上看看就知道啥效果了。

  5. 配置文件都放在.git/config文件中

  6. 搭建GIT服务器

     $ sudo apt-get install git
     $ sudo adduser git
     $ sudo git init --bare sample.git
     $ sudo chown -R git:git sample.git
     git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
        
     $ git clone git@server:/srv/sample.git