本文是基于原教程地址学习后的一个笔记记录,感谢原作者的无私分享!github遵守开源协议,fork后的仓库代码可以读写,甚至可以pull request给官方仓库来贡献代码。
1.git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
2.初始化一个Git仓库,
git init
3.添加文件,并提交,与svn不一样每次修改都要add,
git add <file>
git commit -m <message>
#下面一行相当于上面两行
git commit -a -m <message>
4.查看文件状态
git status
5.比较文件不同
git diff
6.查看提交日志
git log
7.版本重置/及跳转
git reset --hard commit_id
8.查看历史命令
git reflog
9.用版本库文件替换工作区文件(撤销修改)
git checkout -- file
10.删除文件
git rm
11.关联远程库(注意:与github交互需要ssh支持,rsa加密的)
git remote add origin git@server-name:path/repo-name.git
origin是一个默认用户名
12.push到远程库
git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
13.克隆
git clone <project-address>
GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git支持多种协议,默认的git://
使用ssh,但也可以使用https
等其他协议。
使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
。
14.分支
Git鼓励大量使用分支:
#查看分支:
git branch
#创建分支:
git branch <name>
#切换分支:
git checkout <name>
#创建+切换分支:
git checkout -b <name>
#合并某分支到当前分支:
git merge <name>
#删除分支:
git branch -d <name>
15.查看分支合并图
git log --graph
16.bug分支处理
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场
17.新模块/特征分支处理
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
18.多人开发注意项
-
查看远程库信息,使用
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
,如果有冲突,要先处理冲突。
19.变基
git rebase
-
rebase操作可以把本地未push的分叉提交历史整理成直线;
-
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
20.标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
Git有commit,为什么还要引入tag?
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
git tag <tagname>#用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."#可以指定标签信息;
git tag#可以查看所有标签。
git push origin <tagname>#可以推送一个本地标签;
git push origin --tags#可以推送全部未推送过的本地标签;
git tag -d <tagname>#可以删除一个本地标签;
git push origin :refs/tags/<tagname>#可以删除一个远程标签。