Git学习笔记和使用手册

  • 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学习笔记和使用手册

撤销修改
  • 撤销工作区的修改: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 [email protected]:<username>/<reponame>.git
    • 关联后,第一次推送master分支所有内容:git push -u origin master
    • 以后推送修改:git push origin master
  • 从远程仓库克隆到本地仓库

分支管理

为什么需要分支管理呢?考虑这样的一个应用场景,代码开发到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分支上即可。
Git学习笔记和使用手册

用分支解决bug
  • 临时出现bug,需要放下当前工作去debug时,保存工作目录的进度:git stash
  • 显示之前保存的进度:git stash list
  • 恢复指定的进度:git stash apply +[ [email protected]{i}]
  • 删除指定的进度:git stash drop +[ [email protected]{i}]
  • 恢复并删除指定的进度:git stash pop +[ [email protected]{i}]
  • 如果要开发一个新的feature,最好新建一个分支,如果要丢弃一个没有被合并过的分支,可以使用:git branch -D <name>
多人协作
  • 查看远程库的信息:git remote -v
  • 创建远程origin的dev分支到本地:git checkout -b dev origin/dev

流程:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
  5. 如果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即可
Git学习笔记和使用手册
修改并推送到自己的仓库以后,可以在Github上发起一个pull request