this is my pull

一、Git简介

    1、世界最先进分布式版本控制系统（没有之一）。
    2、版本控制器：结束手动管理版本时代，CVS、SVN、Git等。
    Git的诞生

    1、Linux代码的管理，BitKeeper协议的破解，Samba的Andrew，收回免费使用权。
    2、Linus两周用C写出Git，一个月内Linux开始使用Git管理。
    3、2008年GitHub网站上线，免费提供Git存储，很多开源项目迁移至GitHub，如：Ruby、jQuery、PHP。
    
    集中式vs分布式

    1、集中式必须联网才能工作。
    2、分布式每台电脑都是一个版本库。
    3、分布式更安全，避免库房丢失。
    4、CVS提交文件不完整、VSS集成Visual Studio中反人类。
    5、分布式BitKeeper、Mercurial、Bazaar等。

二、安装Git

    1、Linux上安装Git，直接yum或者apt-get
    2、Mac上安装Git，AppStore安装Xcode集成Git
    3、Windows上安装Git，http://msysgit.github.io/下载
    4、git全局配置：
    目的：自报家门，记录操作身份。
        $ git config --global user.name "username"
        $ git config --global user.email "email@example.com"
    实际写入~/gitconfig文件

三、创建版本库

repository（仓库）
    1、找个合适的地方创建空目录
        $ mkdir learngit
        $ cd learngit
        $ pwd
        $ /home/username/learngit
    2、初始化Git库
        $ git init
    提示：安装空白Git库房于。。
    3、添加文件到Git
        $ git add <file>
        $ git commit -m '描述' <file>

四、时光穿梭机

    1、查看库状态
        修改库内文件（增删文件或修改文件内容）
        $ git status
        显示库内变化和分支情况等信息
    2、查看修改详情
        $ git diff <file>
        显示文件修改行的增删情况
 
    版本回退

      1、重置版本
            $ git reset --hard commit_id/HEAD^    上个版本一个HEAD^，上上个HEAD^^,100个版本HEAD~
      2、查看版本
            $ git log <file>
      3、恢复版本钱查看commit_id
            $ git reflog       
            $ git reset --hard commit_id    恢复的版本id
       
    工作区和缓存区

        工作区（Working Directory）,可视目录，用于代码编辑，如：learngit
        版本库（Repository），隐藏.git目录。里面包含stage还有master等分支。
        
        1、添加文件分两步
            第一步git add将文件加入暂存区
            第二步git commit将文件提交至当前分支

        2、可用git status 查看状态。

    管理修改

        只有add 放入暂存区才能提交成功！

    撤销修改

        1、修改文件后，想撤销，不提交。
            $ git checkout -- <file>
            -- 很重要，没有就变成创建新分支。
        2、提交暂存区后撤销
            $ git reset HEAD <file>
              然后再工作区撤销
             $ git checkout -- <file>

    删除文件

        1、确认删除文件
            $ rm -f <file>
            $ git rm <file>
            $ git commit -m 'rm file'
        2、撤销删除
            $ rm -f <file>
            $ git checkout -- <file>
         git rm 用于删除文件，误删可以恢复上一个提交版本
        
五、远程仓库

        1、本地库与远程库（github）需要传输信任
            $ ssh-keygen -t rsa -C "you@example.com"
            生成.ssh目录，讲公钥拷贝到github上即可。
    
    添加远程库

        1、将本地库同步给GitHub
            $ git remote add origin git@github.com:username/learngit
        username为github注册用户名，origin为远端库的意思
        2、将内容推送至远端
            $ git push -u origin master    （首次）
            $ git push origin master    （之后）
    从远程库克隆

        1、克隆远程库到本地
            $ git clone git@github.com:username/learngit
        
六、分支管理

        互不影响，独立成线，可以合并。

    创建于合并分支

        1、创建并切换分支dev
            $ git checkout -b dev
            参数-b表示创建并切换
        2、查看分支
            $ git branch
        3、切换分支
            $ git checkout <name>
        4、合并某分支到当前
            $ git merge <name>
        5、删除分支
            $ git branch -d <name>
            当前所在分支不能删除
    
      解决冲突

        1、两分支对同一文件修改，合并会出现问题。
        2、冲突部分用<<<<<<<<<,==========,>>>>>>>>>来标记。
        3、手动解决冲突后提交。
        4、查看分支情况
            $ git log --graph --pretty=oneline --abbrev-commit
    
    分支管理策略

        1、主干稳定，分支开发
            合并时不删除分支信息的合并策略
            $ git merge --no-ff

    Bug分支

        1、保存暂存区状态
            $ git stash
        2、切换其他分支回来后，可查看stash状态
            $ git stash list
        3、恢复
            $ git stash apply
        4、删除
            $ git stash drop
        5、恢复直接删除
            $ git stash pop
        一般bug突然出现后，可先git stash，修复后再git stash pop
 
    Feature分支

        1、对新分支的删除
            $ git branch -d <name>
            如果新分支没有合并过，则提示失败
        2、强制删除
            $ git branch -D <name>
        -D来丢弃一个没有合并过的分支
    多人写作

        1、将分支推送至github
            $ git push origin dev
        2、抓取分支，先clone远程库
            $ git clone git@github.com:KID-G/lgit
        3、在创建新分支从远程的分支
            $ git checkout -b dev origin/dev
        4、此后可以向远端分支提交修改
            $ git push origin dev
        5、多人协作流程
            1、首先，向远端推送本地修改git push origin branch-name
            2、失败可能因为远端比本地新，用git pull试图合并
            3、如果合并有冲突，手动解决并提交本地
            4、都解决后推送远端
            5、提示no tracking information 需要创建连接

七、标签管理

    标签，一个版本的标识，可通过标签获得版本，所以标签也是快照。
        创建标签
            1、创建标签
                $ git tag <tagname>[/commit id]
            2、查看标签
                $ git tag
            3、查看标签信息
                $ git show <tagname>    
        操作标签
            1、删除标签
                $ git tag -d <tagname>
            2、推送标签到远端
                $ git  push origin <tagname>
                $ git  push origin --tags                全部
            3、删除远端标签
                先删除本地再推送删除的标签名
                $ git push origin :refs/tags/<tagname>
                

八、使用GitHub

    GitHub：Git远程仓库，一个很多著名项目托管的社区平台。
    如：Ruby、Bootstrap、jQuery、PHP、Linux内核等
    

    建议：可以将他人的公开项目克隆到自己账户，然后协同修改，推送补丁等。