常用命令

   
Git 配置
    git config --global
初始化Git
    git init
添加文件到GIt仓库
    添加:    git add dir/files    example:git add Readme.txt
    提交:    git commit -m "commit instruction(本次提交的说明)"
查看仓库当前状态
    git status
查看上一次修改
    git diff
版本回退
    查看提交日志:    git log    /    git log --pretty=oneline
    版本回退:           git reset --hard commit_id         git reset --hard HEAD(HEAD当前版本,HEAD^上个版本,HEAD~100上一百个版本)
    重返未来:           git reflog 查看命令历史,然后在其中确定commit_id 
撤销修改
    撤销工作区修改:    git checkout -- file        example: git checkout -- Readme.txt
    撤销暂存区修改:    git reset HEAD file   然后 git checkout -- file
删除文件
    删除本地文件:        rm file   然后通过 git status 可以查看删除记录
    撤销删除本地文件:  git checkout -- file
    从git 库删除:          git rm file      然后 git commit
同步

   
上传
    要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

下载
        第一次通过Clone
    git clone git@github.com:michaelliao/gitskills.git
    git clone git@github.com:UserName/FolderName.git
    平时直接用Sync
    
分支操作

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>



分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:



小结:
Git分支十分强大,在团队开发中应该充分应用。

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。


来源: <http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758410364457b9e3d821f4244beb0fd69c61a185ae0000>
 
其它分支

BUG 分支
    修复bug时,可以另外建立一个bug分支,修改完后切换回master并合并分支,删除bug分支
    去修复bug前,你要保存当前工作区,通过git stash 修复完成后返回工作区(git stash apply、git stash drop、)git stash pop
Feature分支
    当为系统添加新功能时可以建立一个Feature分支
    

多人协作


git remote 查看远程库的信息

git remote -v显示更详细的信息

git push origin master将本地所有提交推送到远程库的master分支上

 git push origin dev推送到远程库的dev分支上




master分支是主分支,因此要时刻与远程同步;

dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。



多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

这就是多人协作的工作模式,一旦熟悉了,就非常简单。


小结
查看远程库信息,使用git remote -v;

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。






标签操作



发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

打新标签  git tag <name>     git tag -a v0.1 -m "version 0.1 released" 3628164    -a指定标签名,-m指定说明文字  3628164 指定commit id
查看标签git tag
查看标签信息git show <tagname>

小结
命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a <tagname> -m "blablabla..."可以指定标签信息;

git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

命令git tag可以查看所有标签。


其它操作

git log 之后按q键返回正常模式

查看commit id:git log --pretty=oneline --abbrev-commit

当出现分支合并问题后,可以用下面这句查看分支合并图:git log --graph --pretty=oneline --abbrev-commit