最近在学习Git,打算记录下主要使用的一些命令。主要是摘自[廖雪峰老师的Git教程]。(http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
Git是一个分布式版本控制系统。

1.安装Git

因为使用的是Windows系统,所以安装方法是从[http://msysgit.github.io/](http://msysgit.github.io/)上下载msysgit,这是Windows下的git,下载后按照默认选项安装即可。
如果是在Linux上安装,则可以通过一条命令**sudo apt-get install git**即可安装。
在安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global  "Your Name"
$ git config --global user.email "email@example.com"

其中 –global参数表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以为某个仓库指定不同的用户名和邮箱地址。

2.创建版本库
创建Git版本库主要用到 git init这条命令,主要流程如下:
首先是创建一个空的目录,

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

然后,在命令行输入:

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

这样就创建好一个仓库了,并且当前目录会多了一个.git的目录,这个目录默认是隐藏的,可以使用命令ls -ah查看。

3.添加文件到版本库
这里主要使用的命令是git addgit commit
例子如下:
Git 学习笔记_解决冲突
git commit命令后的-m后面是本次提交的说明,此外,可以commit命令可以一次提交多个文件,即可以add多个文件,再使用git commit命令

4.查看状态
git status可以查看当前仓库的状态,如下图所示:
Git 学习笔记_解决冲突_02
上图表示readme.txt文件被修改过,但是还没有提交。
查看修改的内容可以使用git diff命令,可以告诉我们具体修改的内容。
Git 学习笔记_版本库_03

当对修改的文件在使用add命令时,再次使用git status命令,如下图所示:
Git 学习笔记_学习笔记_04
这里告诉我们将要被提交的修改包括readme.txt。
再使用commit命令后,使用git status命令时,则显示:
Git 学习笔记_工作区_05
这里告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的

5.版本回退
git log可以用于查看从最近到最远的提交记录。如果加上–pretty=oneline则可以一行显示一次提交的记录。
Git 学习笔记_git_06
上图中commit后面的一串数字和字母的组合就是这条提交记录的id,可以根据这个id返回到这次提交的版本。
Git 学习笔记_版本库_07
git reset –hard HEAD^命令可以返回上次提交的版本。
Git 学习笔记_解决冲突_08
如上图,通过git reset –hard d912930命令则返回到最新的提交记录。

git reflog则是可以查看命令历史,如下图所示:
Git 学习笔记_版本库_09
每行开头显示的则是每次commit的id,这可以方便要回退到未来的哪个版本,因为git log显示的是现在到过去的提交记录,并不能显示未来的版本。

6.修改

  • 管理修改

Git跟踪并管理的是修改,在Git的版本库中,即.git目录中存在一个称谓stage的暂存区还有分支,而stage中存放的是通过git add命令添加的文件,分支则是保存通过git commit命令的文件。
因此,如果对文件进行修改后,不使用git add命令,直接使用git commit命令是不会保存这次修改的内容的。

  • 撤销修改

    工作区是指在电脑中可以看到的工作目录。关于撤销修改可以分为以下三种情况:
    (1)仅仅是在工作区修改了某个文件的内容,想要丢弃工作区的修改,可以使用git checkout – file
    Git 学习笔记_工作区_10
    (2)在工作区修改了某个文件的内容,并且还使用git add命令将文件添加到暂存区,则需要先使用git reset HEAD file命令,该命令可以撤销暂存区的修改,再使用(1)中的命令git checkout – file即可
    (3)采用了git commit命令,但在没有推送到远程仓库的前提下,可以根据版本回退的方法,即采用git reset –hard HEAD^命令或者git reset –hard commit_id

7.删除文件
rm命令可以直接删除工作区的某个文件,当删除了该文件后,工作区和版本库就不相同了。此时有两种情况:
(1)确实需要删除该文件,则使用git rm file命令,再用git commit命令即可;
(2)误删除了该文件,使用git checkout – file命令,该命令可以用版本库里的版本替代暂存区的版本,所以工作区无论是修改或者删除,使用该命令都可以起到一键还原的作用。

8.添加远程仓库
关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
在这里关联的远程仓库就是Github,在注册一个Github后,登陆并创建一个仓库,再使用上面的命令即可。
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

9.分支管理
(1)创建与合并
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
Git 学习笔记_git_11
如图所示,其中*号表示当前所在分支。
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name

(2)解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
Git 学习笔记_工作区_12
如上图,发生冲突后,可以使用命令git status查看到发生冲突的文件,而查看文件的时候,如下图所示:
Git 学习笔记_解决冲突_13
Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,此时再进行修改,并提交后即可解决冲突。
git log –graph命令可以看到分支合并图。
Git 学习笔记_学习笔记_14

(3)分支管理策略
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D name强行删除。

(4)Bug分支
在当前分支中,如果工作内容并未完成,但又需要创建新的分支来修改某个bug,但此时该分支内容又还没到能提交的时候,可以使用命令git stash将当前工作内容保存起来。
在修复完bug后,回到刚才工作的分支中,使用git stash list命令可以查看工作内容,而恢复的办法有两种,
一是先用命令git stash apply,但此时stash的内容还存在,再用命令git stash drop来删除;
二是直接用命令git stash pop即可完成恢复和删除stash的内容。
此外命令git stash可以多次使用,可以使用命令git stash apply来选择恢复所需要的内容