Git小记(基础命令)
2016年10月22日 Git

之前用Git都是直接使用SourceTree这个开源的Git图形界面的客户端,输入log,提交,从远程pull更新,都是点几下按钮,从来没有在命令行里面操作过Git,开始bugcodeCalendar这个项目之后,开始尝试完全用命令行进行Git的操作,四月份开始的这个小项目,一直到现在,断断续续的业余时间也有几个月了,现在命令行里操作Git算是『行动自如』了,这里对这几个月的使用总结一下,也算备忘吧。

创建仓库,添加文件,提交

1
2
3
4
5
git init  # 把当前目录当做Git仓库
git add filename1,filename2 # 可以多个文件名,也可以使用通配符号
git commit -m "提交注释" # 将已add的文件都提交到仓库
# 还可以像下面这样直接add并提交,commit的时候加入-a参数
git commit -am "提交注释" # 会把当前没有add的文件先add再提交

查看工作区状态

1
git status # 会显示当前工作区中的哪些修改,增加,删除,显示未被版本管理的文件

Log,回退,HEAD

1
2
git log 各种参数 # log后面参数可以自定义,可以参照文档定制自己需要的
git reset --hard 提交的id # 重置文件内容到某个提交

工作区,暂存区概念

下图展示了工作区,暂存区,仓库的关系,以及何种操作对应文件在什么区

回退修改

1
2
git checkout -- 文件名 # 根据上面的图可知,是从暂存区恢复至工作区
git resetHEAD 文件名 # 从仓库中恢复到暂存区

删除文件

1
2
git rm 文件名
rm 文件名 && git commit

分支

1
2
3
4
5
6
git branch # 查看所有分支
git branch 分支名字 # 创建分支
git checkout 分支名字 # 切换分支
git checkout -b 分支名字 # 创建同时切换到对应的分支
git merge 分支名字 # 合并一个分支到当前所在分支
git branch -d 分支名字 # 删除一个指定的分支

暂存,恢复

1
2
git stash # 将当前工作区改动暂存起来,把工作区变为clean状态
git stash apply # 将暂存的改恢复到工作区

标签

1
2
3
4
5
6
7
8
git tag # 查看所有标签
git tag 标签名字 # 创建一个标签,默认HAED
git tag -a 标签名字 -m "标签信息" # 指定标签信息
git tag -s 标签名字 -m "标签信息" # 给标签签名
git push origin 标签名字 # 向远程仓库推送一个标签
git push origin --tags # 把所有没推送的标签都推送到远程仓库
git tag -d 标签名字 # 删除一个本地标签
git push origin :refs/tags/标签名字 # 删除远程标签

diff

1
2
3
4
5
git diff # 比较当前工作区与暂存区的不同
git diff --cached # 比较的是暂存区与仓库最新提交的版本的不同
git diff HEAD/提交id # 比较当前工作区+暂存区与仓库某个版本的不同
git diff 提交id..提交id # 比较二次提交之间的不同,提交id如果省略,默认是HEAD
git diff master..branch # 比较二个分支的不同

git diff还有更多选项更多可定制的比较,具体可参照diff help。

小技巧

经常有这种需要,开了一个feature分支,添加了二个功能,结果一个功能写完了,另一个写到一半,要把这个已经写完的一个功能合并到主干上去,但是又不能像这样git merge feature直接合并分支,因为另一个功能只进行到一半。目的很明确只想把feature分支上的某几个文件合并到master上,可以这样:

1
2
git checkout master # 切到主干
git checkout feature aFile,bFile,cFile # 将对应文件直接checkout到当前分支

如是abc文件是新增的,这样没什么问题,如果cFile在master也有,并且做了修改,那这样就会把master上对应修改给覆盖掉,继续,从master创建一个临时分支,再把feature对应文件checkout到临时分支上去,再把临时分支合并回master,这样就达到了合并某分支的某几个文件到某分支的目的了。

1
2
3
4
5
6
git checkout master
git checkout -b masterhelper
git checkout feature aFile,bFile,cFile
git checkout master
git merge masterhelper
git branch -d masterhelper