之前用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
|