引:虽然日常使用git,但是有些时候总是会忘记一些操作,难免会面向搜索引擎查找。所以这里就总结一下。
版本控制系统
谈到Git,就需要先说说版本控制系统。版本控制系统就是能自动帮我们记录每次文件的改动的一个软件,而Git就是它的一种实现。想想我们写论文还是写代码,是不是有了他就很方便了,再也不用自己手动备份每一次修改了。版本控制系统又分为集中式和分布式。
集中式(SVN)
集中式版本控制系统的版本库是集中存放在中央服务器的,而我们在干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
问题:必须联网才能工作;中央服务器要是出了问题,所有人都没法干活了
分布式(Git)
每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。在双方协作的时候,如果你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,而且如果你们俩不在一个局域网内,两台电脑也互相访问不了。所以分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
Git使用
Git安装
这里就不多说了,推荐廖雪峰的官方网站安装教程。
Git区域
- 工作区(Workspace):在计算机能看到的目录。
- 缓存区(Index/Stage):临时保存我们的改动。
- 版本库(Repository):工作区有一个隐藏的目录.git,它是Git的本地版本库。
- 远程仓库(Remote):“Git中央服务器”,托管在网络中的项目的版本库,可供多人协作开发。(国外有基佬俱乐部Github,国内有码云、Coding、还有可个人或者公司定制的GitLab,请按需选择)
Git个人操作
在上面的区域图中,其实我们已经看到很多操作,这里我再总结一下:
新建仓库
在当前目录新建一个Git仓库
1
git init
在当前目录克隆一个仓库
1
git clone [url]
增加文件
添加指定文件/目录到暂存区
1
git add [file]/[dir]
添加当前目录的所有文件到暂存区(慎用,尤其在IDE中,因为它会包含IDE的配置文件,如IDEA的.idea和iml文件)
1
git add .
提交文件
- 提交缓存区的文件到仓库区
1
git commit -m [改变信息]
查看信息
显示有变更的文件
1
git status
显示当前分支的版本历史
1
git log
根据关键词搜索提交历史
1
git log -S [keyword]
显示暂存区与工作区的差异
1
git diff
显示工作区与当前分支最新的commit之间的差异
git diff HEAD(当前最新commit)
- 上传本地指定分支到远程仓库
1
git push [remote] [branch]
远程同步
下载远程仓库的变动
1
git fetch [remote远程仓库名] [分支]:[本地新分支]
显示所有远程仓库
1
git remote -v
显示某个远程仓库的信息
1
git remote show [branch]
增加一个远程仓库并命名
git remote add [shortname=remote] [url]
上传本地指定分支到远程仓库
1
git push [remote] [branch]
强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
- 推送所有分支到远程仓库
git push [remote] -all
撤销
恢复暂存区的指定文件到工作区
1
git checkout [file]
恢复某个commit的指定文件到暂存区与工作区
1
git checkout [commit] [file]
恢复暂存区的所有文件到工作区
1
git checkout .
重置暂存区与工作区,与上一次commit保持一致
git reset --hard
重置当前分支的HEAD(指针,指向commit-id)为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]
后者的所有变化都将被前者抵消,并应用当前分支
git revert [commit]
暂时将未提交的变化移除,稍后再移入
git stash
git stash pop
Git多人协作
多人协作就会涉及到分支的概念(其实单人开发也会遇到,只是多人会更常见)
我们先看看下面的图:
这张图可以很清楚让我们认识到在工作中使用git工作流的开发流程。Master分支是线上分支,我们在开发新功能的时候不会去动它,Hotfix分支是如果出了bug就拉一条bug分支快速修复合并到master分支里。我们平时开发都是先从Master分支拉出一条Develop分支,在这个分支上进行开发。每个人一般都会负责项目的一个特性功能,所以我们又会从Develop分支拉出几个Feature分支。在开发测试完成后我们形成Release分支,再次检验后将它与Master分支合并,然后我们之后Release分支拉出Develop分支进行新一轮的开发。
Git分支
列出所有本地分支
1
git branch
列出所有远程分支
1
git branch -r
列出所有本地分支和远程分支
1
git branch -a
新建一个分支,但依然停留在当前分支
1
git branch [branch-name]
新建一个分支,并切换到该分支
1
git checkout -b [branch]
切换到当前指定分支,并指定工作区
1
git checkout [branch-name]
切换到上一个分支
1
git checkout -
建立追踪关系,在现有分支与指定的远程分支之间
1
git branch --set-upstream [branch] [remote-branch]
合并指定分支到当前分支
1
git merge [branch]
删除远程分支
1
git branch -d [branch-name]
协作冲突
在多人协作的过程中肯定会碰到这样的问题:如果你的小伙伴已经向一个分支推送了他的提交,而碰巧你也对同个分支的同样的文件作了修改,并试图推送,那么就会提交被拒绝,这个时候就需要先:1
git pull
等价于:1
2git fetch temp(临时分支)
git merge temp
这个时候合git会将你们两个人对文件的修改都呈现在同一个文件中,你需要在与你的小伙伴商量出一个最终版,修改之后再提交上去。
IDEA与Git
可能大家对使用命令行并不感冒,所以这里也为大家找了一份IDEA的git使用教程,至此大家只要点点点就好了。当然这里还会有很多我没有涉及到的地方,就需要平时多积累了。
别急,别急!!还要最后一点就是 .gitignore 了!
我们发现在使用IDEA的时候,他默认会要求我们把所有的文件加入到git控制里,但是我们知道很多IDEA的自带配置文件是不用也没有必要加入git(之前在说git add . 的时候也说过),所以可以利用IDEA的.gitignore插件来帮助我们忽略这些没有必要的插件,这里也放一个.gitignore教程。