michaelliao/learngit — pull request #219 by KID-G (2014-11-11 07:59:52+00:00)
Title: 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
$ git commit -m '描述'

四、时光穿梭机

1、查看库状态
修改库内文件（增删文件或修改文件内容）
$ git status
显示库内变化和分支情况等信息
2、查看修改详情
$ git diff
显示文件修改行的增删情况

版本回退

1、重置版本
$ git reset --hard commit_id/HEAD^ 上个版本一个HEAD^，上上个HEAD^^,100个版本HEAD~
2、查看版本
$ git log
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 --
-- 很重要，没有就变成创建新分支。
2、提交暂存区后撤销
$ git reset HEAD
然后再工作区撤销
$ git checkout --

删除文件

1、确认删除文件
$ rm -f
$ git rm
$ git commit -m 'rm file'
2、撤销删除
$ rm -f
$ git checkout --
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
4、合并某分支到当前
$ git merge
5、删除分支
$ git branch -d
当前所在分支不能删除

解决冲突

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
如果新分支没有合并过，则提示失败
2、强制删除
$ git branch -D
-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 [/commit id]
2、查看标签
$ git tag
3、查看标签信息
$ git show
操作标签
1、删除标签
$ git tag -d
2、推送标签到远端
$ git push origin
$ git push origin --tags 全部
3、删除远端标签
先删除本地再推送删除的标签名
$ git push origin :refs/tags/

八、使用GitHub

GitHub：Git远程仓库，一个很多著名项目托管的社区平台。
如：Ruby、Bootstrap、jQuery、PHP、Linux内核等

建议：可以将他人的公开项目克隆到自己账户，然后协同修改，推送补丁等。