本篇博客内容大部分整理自廖雪峰的git教程,是本人对该教程的一个学习总结,列出了一些Git的常用知识点,多去运用这些知识点才能熟练掌握,结合github的使用可以为自己管理项目和代码带来极大的方便。
1 Git简介
1.1 Git是什么
Git是Linux之父Linus为方便管理Linux项目以及Linux社区贡献者提交代码而写的一个非常流行的分布式版本控制系统。
1.2 Git和github的关系
github相当于是一个远程的代码仓库,它为开源项目免费提供git存储
1.3 版本控制系统:集中式vs分布式
- 集中式版本控制系统(CVS,SVN等):版本库集中存放在中央服务器上
- 分布式版本控制系统(Git等):无“中央服务器”概念,每台电脑都是一个完整的版本库。多人协作通过相互推送修改实现(借助github作为平台推送更为方便)
2 Git常用命令图解
图片来源:常用Git命令清单-阮一峰的网络日志
几个专用名词译名如下:
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
3 创建版本库
- 创建本地仓库:
git init
- 将文件添加到暂存区:
git add file
- 把暂存区的文件提交到仓库:
git commit -m "提交说明"
4 时光穿梭机
4.1 工作区和版本库
图片来源:廖雪峰的git教程
4.2 版本回退
- 查看提交历史(含commit_id):
git log [--pretty=oneline]
,其中[]
里面的为可选命令,--pretty=oneline
表示以简化的方式显示提交历史 - 执行回退:HEAD指向的版本就是当前版本,使用
git reset --hard commit_id
命令可回退至其它版本 - 重返未来:通过
git reflog
查看命令历史找到未来版本的commit_id(git log只能查看当前版本时间点以前的历史版本)
4.3 管理修改
- 查看工作区的状态(以文件和文件夹的形式显示):
git status
- 查看修改:
git diff
显示的是工作区(你电脑中看得到的仓库目录及文件)和暂存区的差别,以红色-号
显示的是相比于后者增加的内容,以蓝色+号
显示的是相比于后者删除的内容。
git diff --cached
显示的是暂存区和master分支间的差别
git diff HEAD
显示的则是工作区和分支间的差别
注意:在工作区的修改,如果不add到暂存区,commit时就不会被提交
4.4 撤销修改
- 场景1:丢弃工作区的修改(未添加到暂存区)
git checkout -- file
- 场景2:丢弃已添加到暂存区的修改 先用
git reset HEAD file
回到场景1(相当于用本地仓库的file版本重置暂存区的对应file) - 场景3:已提交不合适的修改到版本库,利用版本回退撤销本次提交
4.4 删除文件
git rm file
(删除并自动提交到暂存区)
注:在利用git命令操作文件时,如文件比较多,操作时可以多个文件并列或使用通配符,如git add file1 file2 ...
或git add file*
5 远程仓库
5.1 添加远程仓库
- 在远程仓库如github上新建一个空的仓库
- 关联远程仓库:
git remote add origin git@server-name:path/repo-name.git
- 推送到远程仓库:
git push [-u] origin master(第一次推送要在push后加'-u')
5.2 从远程仓库克隆
git clone [url]
(url是远程仓库项目的地址)
6 分支管理
Git鼓励使用分支管理
6.1 创建与合并分支
- 查看分支:
git branch
- 创建分支:
git branch [name]
- 切换分支:
git checkout [name]
- 创建+切换分支:
git checkout -b [name]
- 合并某分支到当前分支:
git merge [name]
(默认使用Fast-forward方式(直接把master指向待合并分支的当前提交)合并,合并后的历史没有分支;加上–no-ff参数可以用普通方式合并,合并后的历史有分支) - 删除分支:
git branch -d [name]
6.2 解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。办法是利用git status
查看是哪个文件发生了冲突(多半是对该文件的修改不一致引起的),然后对该文件发生冲突的地方(git会用<<<
和>>>
标示出来)手动进行修改。解决冲突后,再提交,完成合并。
查看分支合并图:git log --graph [--pretty=oneline --abbrev-commit]
6.3 分支管理策略
团队合作的分支图如下所示:
1. 稳定的master分支,仅用来发布新版本
2. 不稳定的dev分支用于平时干活(活干好后再合并到master上去)
3. 协作者在各自的分支上进行开发
6.4 Bug分支
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除Bug分支
- 当手头工作没有完成时,先把工作现场
git stash
一下,然后去修复bug,修复后再git stash pop
,回到工作现场
6.5 Feature分支
- 开发一个新的feature,最好新建一个分支
- 如果要丢弃一个没有被合并过的分支,可以通过
git branch -D [name]
强行删除
6.6 多人协作
- 查看远程库信息:
git remove -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 利用git进行多人协作的工作模式:
1.首先试图用git push origin branch_name
推送自己的修改
2.如果推送失败,说明远程分支比你的本地分支更新,需先用git pull
抓取远程的新提交
3.如果git pull
后提示”no tracking information”,说明两个分支的链接没有创建,用命令git branch --set-upstream branch_name origin/branch_name
为两个分支创建链接,然后再次git pull
4.如果git pull
成功(会自动进行分支合并),但合并有冲突,则解决冲突(参照6.2),并在本地提交
5.没有冲突或解决掉冲突后,再用git push origin branch_name
推送
7 标签管理
标签管理相当于给commit_id起有意义的别名
7.1 创建标签
git tag [name]
(默认为HEAD,也可指定一个commit_id)
7.2 操作标签
- 推送本地标签:
git push origin [tagname]
- 删除本地标签:
git tag -d [tagname]
- 删除远程标签:
git push origin: refs/tags/[tagname]
参考资料: