楔子
如果入了程序员这一行,git应该是迟早都得弄明白的,对于初学者怎么理解这个东西呢。
用一个词概括就是“版本控制”。如果要学习的话廖雪峰前辈的教程非常不错,值得一看:git教程-廖雪峰,然后还有这个git简明指南。
既然已经有如此优秀的教程,那本文的用意便在于对其中一些特别需要注意的点和使用频率特别高的命令记录下,方便以后快捷查看。
正文
初始化
-
cd
到指定目录然后git init
状态查看
-
git status
查看当前的提交状态 -
git diff <filename>
对比文件的修改
提交(每次提交都需要add和commit)
-
git add <filename>
添加文件到暂存区 -
git commit -m "提交信息"
提交暂存区中的文件
版本回退
-
git reset --hard commit_id
commit_id可以从以前的提交记录或者用git log
和git relog
命令得到,还可以用HEAD^
以及HEAD^^
表示上一个版本或上两个版本,用HEAD~100
表示第上100个版本 -
git log
可查看当前版本的所有提交记录(不显示回退后未来的提交记录) -
git relog
可查看版本库建立以来所有的提交记录
撤销修改
git中版本管理分成三个区域:工作区、暂存区和分支
在这里引用一段关于解释这个三个区域关系的话:
1).从工作目录,提交到stage。
2).从stage提交到master。从工作目录提交到stage,需要用add或者rm命令,只提交到stage,而没有提交到master,是不会自动同步到master的。
从stage提交到master用commit命令。
退回也是要分两步,一个是从master退回到stage,然后再从stage退回到工作目录。
对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。
对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了,完全跟工作目录没关系
针对这三个区域的撤销修改如下:
- 工作区:
git checkout -- <filename>
此命令可以将工作区的文件修改成上一次add
或commit
的状态 - 暂存区:
git reset HEAD <filename>
通过此命令暂存区的版本回退至想要的版本,然后再用上面工作区的撤销修改命令将工作区文件进行撤销修改 - 分支: 参考上面版本回退命令,直接将版本回退至指定版本,然后工作区的文件也会随之改变
删除
-
git rm <filename>
删除工作区的文件并将这个删除的修改操作add
到暂存区
远程仓库
远程仓库的用法一般是:一台服务器,多台客户机,每次开发时用git clone
从服务器取到最新版本,开发结束后用git push
上传到服务器
- 推送到远程
git push
远程库是空的时,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
-
git remote add origin git@server-name:path/repo-name.git
使用这个命令第一次关联远程库 -
git push -u origin master
第一次推送master分支的所有内容 -
git push origin master
推送最新修改
- 从远程克隆
git clone
Git支持多种协议,默认的git://
使用ssh,但也可以使用https等其他协议。使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http
端口的公司内部就无法使用ssh
协议而只能用https
。
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令
克隆。
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快。
-
git clone git@github.com:michaelliao/gitskills.git
使用示例
分支管理
创建、合并和删除分支
-
git checkout -b dev
创建并切换到dev
分支,其中-b
分支表示创建并切换,相当于以下两条命令、
git branch dev
git checkout dev
-
git checkout <name>
切换到指定分支 -
git branch
此命令可以列出所有分支,显示结果中前面带*
号的为当前分支 -
git branch <name>
表示创建新分支 -
git branch -d <name>
删除指定分支 -
git branch -D <name>
强行删除一个分支 -
git merge <name>
合并某分支到当前分支
解决冲突
合并分支时,若分支之间存在冲突,那么就需要先解决冲突然后再进行合并
分支管理策略
实际开发时,我们应该遵循一定的开发策略,以便于进行管理和开发。
首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以 了。
所以,团队合作的分支看起来就像这样:
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
bug分支
一般修复bug会另外开一个专门的bug分支来进行修复,但是如果现在正在分支上进行工作,接到紧急任务需要修复一个bug就会出现一个冲突:工作区是被占用的。
此时可以用git stash
命令来储存当前工作现场
-
git stash
储存当前工作区 -
git stash list
列出当前已经储存了的工作区 -
git stash apply <stash@{0}>
恢复储存的工作区,此种恢复,不会删除存储的工作区,可以在后面加工作区名,表示要恢复到哪个工作区 -
git stash drop
用来删除指定工作区 -
git stash pop
用来恢复到一个工作区,并删除工作区记录
feature分支
用来开发新的功能
多人协作
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name
推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
-
git remote -v
查看远程库信息
标签管理
在git中,标签用于方便人的记忆,和某个commit绑定在一起,就像版本号(V1.0)一样,切换到分支后即可打标签
-
git tag <name>
新增一个标签,默认打到最新的commit上 -
git tag
查看所有标签 -
git tag v0.9 6224937
将标签打到指定的commit上 -
git show <tagname>
查看改标签的详细信息 -
git tag -a <tagname> -m "blablabla..."
-a后加标签名,-m后加标签信息 -
git push origin <tagname>
可以推送一个本地标签; -
git push origin --tags
可以推送全部未推送过的本地标签; -
git tag -d <tagname>
可以删除一个本地标签; -
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
自定义git
git config --global color.ui true
让git命令行显示颜色
文件忽略
.gitignore
文件中写需要忽略的文件,然后提交上去
格式如下:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
配置别名
--global
参数加上时表示全局,对本电脑下所有git仓库都有用,不加则只对当前仓库起作用
-
git config --global alias.st status
给status
起别名st
- 给这一长串命令起别名
lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"`
总结
至此git整理完毕,主要取材取git教程-廖雪峰,主要用于方便自己查阅。