- Git来源
- Git可以解决什么问题
- Git的基本使用方法
本文主要叙述了Git是怎么产生的,最开始是要解决什么问题,现在用来解决什么问题。另外,重点叙述了怎么使用git在本地创建仓库,本地进行版本控制,连接远程仓库,通过分支更好地服务多人协作,方便软件迭代更新的标签管理,以及在线平台Github的深入理解。
内容 |
---|
Git是什么以及来源 |
Git可以解决什么问题 |
Git基本使用(增加文件,删除文件,版本控制,Git工作机制) |
远程仓库(本地推送到远程,远程克隆到本地) |
分支管理 |
标签管理 |
使用Github |
Git是什么以及来源
Git是由Linux内核开发者Linus用C语言实现的一个分布式版本控制系统,可以实现对文本文件包括代码的版本控制。最初是为了解决Linux代码合并问题。
相比于集中式版本控制系统,分布式的系统不需要把所有的文件和改动都存在中央管理器上,每个人的电脑上都有一个完整的版本库。但同时,为了更好地协作,引入一个“中央服务器”,仅用来交换大家的修改信息。
Git可以解决什么问题
- 需要反复修改的文本文件
- 多人协作开发文件
基本使用
查看文本内容
git bash查看文本内容:cat filename
创建版本库
git bash切换到指定目录,然后运行git init
就会在当前目录生成一个.git文件,仓库建立完成
把文件添加到版本库
- 添加文件:
git add filename ...
- 提交到仓库:
git commit -m "imfomation about change"
文件版本控制
为什么git的版本号(commit id)是一个很大的数字? 这是因为git是一个分布式系统,这样做而非简单的使用1,2,3···是为了防止多人在同一仓库工作时出现冲突
- 查看仓库当前状态:
git status
- 查看版本更改内容:
git diff
- 显示提交日志:
git log
- 显示简化版本的提交日志:
git log --pretty=oneline
- 显示命令日志:
git reflog
- 回退到上一个版本:
git reset --hard HEAD^
- 回退到往上100个版本:
git reset --hard HEAD~100
- 跳转到指定版本号的版本:
git reset --hard 版本号前几位
工作区,暂存区,仓库
git管理的是对文件的修改,而不是文件。比如修改文件后,使用add将修改提交到暂存区,然后再修改文件,使用commit将修改上传至仓库,仓库中的文件将只有第一次修改。
撤销修改
- 撤销工作区的修改:
git checkout -- filename
- 丢弃暂存区的修改:
git reset HEAD filename
- 丢弃仓库的修改:使用版本回退
删除内容
- 删除工作区的内容:
rm filename
- 删除仓库中的内容:
git rm fileneme
+git commit -m "information of delete"
远程仓库
分布式版本控制系统在工作时不需要考虑远程库的存在,因此在没有联网的时候也可以正常工作,只要在网络存在的时候把本地提交推送即可。
需要在github的Account Settings界面添加本电脑的ssh公钥,然后就可以从这台电脑推送仓库到github。
- 从本地仓库推送到远程仓库
- 关联github上的远程库:
git remote add origin git@github.com:<username>/<reponame>.git
- 关联后,第一次推送master分支所有内容:
git push -u origin master
- 以后推送修改:
git push origin master
- 关联github上的远程库:
- 从远程仓库克隆到本地仓库
- 在github上新建一个仓库
git clone git@github.com:<username>/<reponame>.git
分支管理
为什么需要分支管理呢?考虑这样的一个应用场景,代码开发到50%,A,B都想要在这个基础上增加一个模块,为了都可以在完整可运行的代码基础上开发,A,B各自创建一个分支,等各自的工作都完成以后,再进行分支合并即可
- 创建dev分支:
git branch dev
- 切换到dev分支:
git checkout dev
- 创建并切换到dev分支:
git checkout -b dev
- 查看当前分支:
git branch
- 合并指定分支到当前分支:
git merge dev
- 删除dev分支:
git branch -d dev
Git 的分支管理是通过指针实现的,所以切换速度很快。
- 图形化查看分支提交:
git log --graph --pretty=oneline --abbrev-commit
- 合并分支以后保留分支状态:
git merger --no-ff -m "information about merge" dev
团队合作时的分支模式示意图:master只用来发布新版本,平时的工作都在dev分支上进行,而不同的员工又根据需要创建自己的分支,并不定期将自己的工作merge到dev分支上,需要发布新版本时,将dev分支merge到master分支上即可。
用分支解决bug
- 临时出现bug,需要放下当前工作去debug时,保存工作目录的进度:
git stash
- 显示之前保存的进度:
git stash list
- 恢复指定的进度:
git stash apply +[ stash@{i}]
- 删除指定的进度:
git stash drop +[ stash@{i}]
- 恢复并删除指定的进度:
git stash pop +[ stash@{i}]
- 如果要开发一个新的feature,最好新建一个分支,如果要丢弃一个没有被合并过的分支,可以使用:
git branch -D <name>
多人协作
- 查看远程库的信息:
git remote -v
- 创建远程origin的dev分支到本地:
git checkout -b dev origin/dev
流程:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功! - 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
。
标签管理
给commit id起别名就是tag,可以通过tag v1.2的形式直接得到某个版本。
- 给分支当前状态打标签:
git tag <tagname>
- 给分支指定状态打标签:
git tag <tagname> <commit id>
- 创建带有说明的标签:
git tag -a <tagname> -m "information of tag" <commit id>
- 查看所有标签:
git tag
- 查看指定标签信息:
git show <tagname>
- 远程推送指定标签:
git push origin <tagname>
- 远程推送全部标签:
git push origin --tags
- 删除本地标签:
git tag -d <tagname>
- 删除远程标签:
git push origin :refs/tags/<tagname>
使用Github
Github是一个远程仓库托管平台,可以在上面建立自己的远程仓库,并通过自己账号的ssh设置,与自己电脑上的仓库建立链接,这样就可以推送自己本地的修改到远程仓库,也可以从远程仓库clone到本地。相当于Github就是分布式版本控制系统的“中央处理器”,用来供不同用户交换修改。
参与开源项目的流程,fork开源项目,在自己的账号下克隆一个仓库,然后从自己的账号clone到本地,修改后,push即可
修改并推送到自己的仓库以后,可以在Github上发起一个pull request