配置用户信息:
$git config --global user.name"Your Name"
$git config --global user.email"email@example.com"
git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
一、创建版本库及提交基本操作
$git init
创建版本库
$git status
查看仓库状态
$git add <file>
添加文件或文件夹到暂存区
$git commit -m "message"
把暂存区中的文件提交到本地仓库
$git log
显示由近到远的提交日志(加上--pretty=oneline可简化输出)
$git reflog
显示所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
二、版本控制
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本,依此类推,当数量过多可以使用HEAD~N表示前N个版本。
$git reset --hard commit_id
回到某个版本
回到旧版本:用git log可以查看提交历史,以便确定要回退到哪个版本。
回到新版本:用git reflog查看命令历史,以便确定要回到未来的哪个版本。
$ git reset HEAD <file>
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

$git checkout -- <file>
命令git checkout -- <file>意思就是,把file文件在工作区的修改全部撤销,这里有两种情况:
一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
$git rm <file>
从版本库中删除文件,删除后commit保存删除状态
三、远程仓库
git remote add origin git@server-name:path/repo-name.git
关联到远程仓库
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。
$git clone git@server-name:path/repo-name.git
克隆远程仓库
$git remote
查看远程库的信息,加上-v可查看更详细的信息
$git push origin master
格式: git push <remote> <place>
place又可写成refspec的格式,<source>:<destination>
推送分支,把该分支上的所有提交推送到远程仓库。
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
$git fetch <refspec>
从远程仓库更新到本地远程分支
$git pull [ --rebase ]
默认相当于顺序执行fetch+merge两条指令,从远程仓库更新到本地远程分支并合并到当前HEAD所指分支上。加上--rebase可改merge为rebase。
四、分支管理
$git checkout -b dev
创建并切换到dev分支,相当于以下两条 命令
$git branch dev
创建分支
$git checkout dev
切换分支
$git branch
打印:* dev
master
列出所有分支,当前分支前有*号
$git merge dev
合并指定分支到当前分支
$git merge --no-ff -m "message" dev
以普通模式合并
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
$git rebase dev
把指定分支的提交作为当前分支的新提交,若以该方式合并,在log上是看不到整个合并关系的,好处分支树是比较简洁。
$git cherry-pick dev
把某次提交作为当前分支的新提交,与rebase不同的是cherry-pick是单次提交,而rebase是某个分支的所有提交。
$git branch -d dev
删除分支
git log --graph
$ git log --graph --pretty=oneline --abbrev-commit
查看分支的合并情况
$git stash
把当前工作现场“储藏”起来
$git stash list
查看储藏列表
$git stash apply stash@{0}
恢复指定储藏
$git stash drop
删除指定储藏
$git stash pop
恢复最近储藏,并删除该储藏
bug分支:修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
$git branch -D
删除未合并分支
feature分支:开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
四、标签
$git tag <tagName>
用于新建一个标签,默认为HEAD,也可以指定一个commit id;
$git tag -a <tagName> -m "blablabla..."
可以指定标签信息
git tag -s -m "blablabla..."
可以用PGP签名标签;
$git tag
可以查看所有标签。
$git push origin
可以推送一个本地标签
$git push origin --tags
可以推送全部未推送过的本地标签;
$git tag -d
可以删除一个本地标签
$git push origin :refs/tags/
可以删除一个远程标签
五、忽略
忽略配置参考:https://github.com/github/gitignore
忽略文件的原则是:
1.忽略操作系统自动生成的文件,比如缩略图等;
2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
$ git add -f <file>
强制添加已忽略文件
$git check -ignore -v <file>
检查是第几行规则忽略了该文件
学习自:廖雪峰老师的Git教程
练习:交互式教程
网友评论