版本控制简介

版本控制

工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理代码的版本迭代。

版本控制工具

集中式版本控制工具:CVS、SVN、VSS…… 分布式版本控制工具:Git、Mercurial、Bazaar、Darcs……

版本控制工具应该具备的功能

  1. 协同修改
    多人并行不悖的修改服务器端的同一个文件。
  2. 数据备份
    不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
  3. 版本管理
    在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文 件系统快照的方式。
  4. 权限控制
    对团队中参与开发的人员进行权限控制。
    对团队外开发者贡献的代码进行审核——Git 独有。
  5. 历史记录
    查看修改人、修改时间、修改内容、日志信息。
    将本地文件恢复到某一个历史状态。
  6. 分支管理
    允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。

Git 简介

Git 简介

图片描述

Git 的优势

  1. 大部分操作在本地完成,不需要联网
  2. 完整性保证
  3. 尽可能添加数据而不是删除或修改数据
  4. 分支操作非常快捷流畅
  5. 与 Linux 命令全面兼容

Git 结构

图片描述

Git 和代码托管中心

代码托管中心的任务:维护远程库
局域网环境下: GitLab 服务器
外网环境下: GitHub,码云

Git 命令行操作

本地库初始化

命令:git init
效果: 在此目录下生成.git 目录,把这个目录变成 Git 可以管理的仓库
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改

设置签名

作用:区分不同开发人员的身份
注意:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。
命令:

  • 项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name "你的名字"
git config user.email "你的邮箱"
1
2

信息保存位置:./.git/config 文件

  • 系统用户级别:登录当前操作系统的用户范围
git config --global "你的名字"
git config --global "你的邮箱"
1
2

信息保存位置:~/.gitconfig 文件

  • 级别优先级
    就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
    如果只有系统用户级别的签名,就以系统用户级别的签名为准
    二者都没有不允许

状态查看

命令:git status
查看工作区、暂存区状态

添加

命令:git add [file name]
将工作区的“新建/修改”添加到暂存区
如果有很多改动可以通过 git add -A .来一次添加所有改变的文件。

git add -u [< path >]: 把< path >中所有跟踪文件中被修改过或已删除文件的信息添加到索引库。它不会处理那些不被跟踪的文件。省略< path >表示 . ,即当前目录。

git add -A: []表示把中所有跟踪文件中被修改过或已删除文件和所有未跟踪的文件信息添加到索引库。省略< path >表示 . ,即当前目录。

提交

命令:git commit -m "本次提交的描述" [file name]
将暂存区的内容提交到本地库

查看历史记录

命令:git log
历史记录过多时,多屏显示控制方式:空格向下翻页,b 向上翻页,q 退出

git log --pretty=oneline
1

图片描述

git log --oneline
1

图片描述

git reflog
1

图片描述

HEAD@{移动到当前版本需要多少步}

版本回退

  • 基于索引值操作[推荐]
    git reset --hard [局部索引值]
  • 使用^符号:只能后退
    git reset --hard HEAD^
    注:一个^表示后退一步,n 个表示后退 n 步
  • 使用~符号:只能后退
    git reset --hard HEAD~n
    注:表示后退 n 步
  • reset 命令的三个参数对比
    --soft 参数
    仅仅在本地库移动 HEAD 指针
    --mixed 参数
    在本地库移动 HEAD 指针,重置暂存区
    --hard 参数
    在本地库移动 HEAD 指针,重置暂存区,工作区

删除文件并找回

前提:删除前,文件存在时的状态提交到了本地库。
操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD

比较文件差异

git diff [文件名]
将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] -- [文件名]
例:git diff HEAD -- < filename >
将工作区中的文件和本地库历史记录比较
git diff [< commit-id >][< commit-id >]
不带文件名比较多个文件

SSH 登录

进入当前用户的家目录
$ cd ~
删除.ssh 目录
$ rm -rvf .ssh
运行命令生成.ssh 密钥目录
$ ssh-keygen -t rsa -C 你的邮箱@qq.com
[注意:这里-C 这个参数是大写的 C]
进入.ssh 目录查看文件列表
$ cd .ssh
$ ls -lF
查看 id_rsa.pub 文件内容 $ cat id_rsa.pub
复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像 →Settings→SSand GPG keys
New SSH Key
输入复制的密钥信息
回到 Git bash 创建远程地址别名
git remote add origin_ssh git@github.com:atgui/huashan.git
推送文件进行测试

撤销修改

git checkout -- file
可以丢弃工作区的修改
这里有两种情况:
一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git reset HEAD < file >
可以把暂存区的修改撤销掉(unstage),重新放回工作区

标签管理

首先,切换到需要打标签的分支上
git tag < name >
默认标签是打在最新提交的 commit 上的
git tag < name > < commit id >
标签是打在历史提交的 commit 上
git tag -a v0.1 -m "version 0.1 released" 1094adb
创建带有说明的标签,用-a 指定标签名,-m 指定说明文字
可以用命令 git tag 查看所有标签
注意,标签不是按时间顺序列出,而是按字母排序的。可以用 git show < tagname >查看标签信息
注意:标签总是和某个 commit 挂钩。如果这个 commit 既出现在 master 分支,又出现在 dev 分支,那么在这两个分支上都可以看到这个标签。

操作标签

如果标签打错了,也可以删除:
git tag -d v0.1
如果要推送某个标签到远程,使用: git push origin < tagname >
要删除远程标签就麻烦一点,先从本地删除,然后,从远程删除。删除命令也是 push
git tag -d v0.9
git push origin :refs/tags/v0.9

分支管理

什么是分支?

在版本控制过程中,使用多条线同时推进多个任务

分支的好处?

同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

分支操作

创建分支

git branch [分支名]

查看分支

git branch -v

切换分支

git checkout [分支名]

合并分支

第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
第二步:执行 merge 命令
git merge [有新内容分支名]

解决冲突

冲突的表现

图片描述

冲突的解决

第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
第三步:git add [文件名]
第四步:git commit -m "日志信息"
注意:此时 commit 一定不能带具体文件名

忽略特殊文件.gitignore

在 Git 工作区的根目录下创建一个特殊的.gitignore 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件
不需要从头写.gitignore 文件,GitHub 已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
1.忽略操作系统自动生成的文件,比如缩略图等;
2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如 Java 编译产生的.class 文件;
3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

远程库

查看和创建远程库地址别名

git remote -v 查看当前所有远程地址别名 git remote add [别名][远程地址]
图片描述

推送

git push [别名][分支名]

克隆

git clone [远程地址]
效果:
完整的把远程库下载到本地
创建 origin 远程地址别名
初始化本地库

团队成员邀请

图片描述

“岳不群”其他方式把邀请链接发送给“令狐冲”,“令狐冲”登录自己的 GitHub 账号,访问邀请链接。
图片描述

拉取

pull=fetch+merge
git fetch [远程库地址别名][远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名][远程分支名]

解决冲突

要点:
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

跨团队协作

Fork
图片描述 图片描述 图片描述

本地修改,然后推送到远程
Pull Request

图片描述

图片描述

对话
图片描述

图片描述

审核代码
图片描述

合并代码
图片描述

将远程库修改拉取到本地
参考:Git 教程-廖雪峰的官方网站尚硅谷 Git&GitHub 视频教程

TOC