目录
作者和朋友建立的社区:非科班转码社区-CSDN社区云???
期待hxd的支持哈? ? ?
最后是打鸡血环节:你只管努力,剩下的交给天意? ? ?
前言
首先,大家都知道git是版本控制器,那什么是版本控制呢?
版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。
- 实现跨区域多人协同开发
- 追踪和记载一个或者多个文件的历史记录
- 组织和保护你的源代码和文档
- 统计工作量
- 并行开发、提高开发效率
- 跟踪记录整个软件的开发过程
- 减轻开发人员的负担,节省时间,同时降低人为错误
简单说就是用于管理多人协同开发项目的技术。
没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题。
就比如自己的毕业论文的版本1,版本2,版本3....
当我们写到版本n的时候,如果猫头鹰版本控制,我们就找不到版本1,但是有了git,我们就可以去找到版本1。
多人开发就必须要使用版本控制!
版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN。
版本控制分类
本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
集中版本控制 SVN
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS
分布式版本控制 Git
每个人都拥有全部的代码!
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况!
Git下载
打开 [git官网] https://git-scm.com/,下载git对应操作系统的版本。
下载对应的版本即可安装!
安装:无脑下一步即可!安装完毕就可以使用了!
启动
安装成功后在开始菜单中会有Git项,菜单下有3个程序:任意文件夹下右键也可以看到对应的程序!
Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
Git配置
所有的配置文件,其实都保存在本地!
查看配置 git config -l
![]()
Git相关的配置文件:
1. Git\etc\gitconfig :Git 安装目录下的 gitconfig --system 系统级
2. C:\Users\Administrator\ .gitconfig 只适用于当前登录用户的配置 --global 全局
设置用户名与邮箱(用户标识,必要)
当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
git config --global user.name "yuanlai" #名称
只需要做一次这个设置,如果你传递了--global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项。总之--global为全局配置,不加为某个项目的特定配置。
三个区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。
- Workspace:工作区,就是你平时存放项目代码的地方
- Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本
- Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
- WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
- .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
- Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
- Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
- Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
工作流程
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
Git操作(重要)
1. 建立git仓库(gitee)
2. git clone (https(默认会加密))
3. git add
4. git commit -m ”提交信息/日志“
5. git push
sudo yum install -y git Linux下安装
配置文件下面有个 .gitignore 不需要的,不想上传的都可以配置一下
PS:第一次用的时候,记得设置用户名和邮箱
Git官网小游戏部分笔记
git commit (HEAD位置提交)
git branch newImage(HEAD位置创建分支HEAD不变指向)commit时分支不变位置
git checkout newImage (改变HEAD指向)
第一种合并方法(merge)
HEAD指向master
git merge bugFix (会把master和bugFix合并,bugFix不变位置,合并位置由master指向)
(简单说,是把输入的bugFix合并下来)
第一种往下移动方法:下面是把bugFix往下移动
![]()
第二种合并方法(rebase)
Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
![]()
简单说就是把HEAD的指向合并到输入的指向的下面,原来的还存在,合并后需要更新(也是第二种分支往下移动方法)输入的分支
HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
如果想看 HEAD 指向,可以通过cat .git/HEAD
查看, 如果 HEAD 指向的是一个引用,还可以用git symbolic-ref HEAD
查看它的指向。
git checkout C4 (通过哈希值指定提交记录)通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用
git log
来查查看提交记录的哈希值。
并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是fed2da64c0efc5293610bdd892f82a58e8cbc5d8
。舌头都快打结了吧...
比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入fed2
而不是上面的一长串字符。1. 使用
^
向上移动 1 个提交记录
正如我前面所说,通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。
git checkout master^(切换到master的父节点,切换的是HEAD)2. 使用
~<num>
向上移动多个提交记录,如~3 我使用相对引用最多的就是移动分支。可以直接使用
-f` 选项让分支指向另一个提交。例如:
git branch -f master HEAD~3
上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。(会让分支向上移动!)PS:为了能随意让分支移动,可以让HEAD先指向目标位置,然后git branch -f target_branch HEAD 就可以让目标分支指向HEAD的位置,而HEAD的位置你是可以直接通过哈希值或者你只需要提供能够唯一标识提交记录的前几个字符即可!!!
HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
如果想看 HEAD 指向,可以通过cat .git/HEAD
查看, 如果 HEAD 指向的是一个引用,还可以用git symbolic-ref HEAD
查看它的指向。
git checkout C4 (通过哈希值指定提交记录)
//
通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用git log
来查查看提交记录的哈希值。
并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是fed2da64c0efc5293610bdd892f82a58e8cbc5d8
。舌头都快打结了吧...
比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入fed2
而不是上面的一长串字符。
//
使用
^
向上移动 1 个提交记录
`
正如我前面所说,通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。
git checkout master^(切换到master的父节点,切换的是HEAD)使用
~<num>
向上移动多个提交记录,如~3 我使用相对引用最多的就是移动分支。可以直接使用
-f` 选项让分支指向另一个提交。例如:
git branch -f master HEAD~3
上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。(会让分支向上移动!)PS:为了能随意让分支移动,可以让HEAD先指向目标位置,然后git branch -f target_branch HEAD 就可以让目标分支指向HEAD的位置,而HEAD的位置你是可以直接通过哈希值或者你只需要提供能够唯一标识提交记录的前几个字符即可!!!
撤销变更
在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。
主要有两种方法用来撤销变更 —— 一是git reset
,还有就是git revert
。接下来咱们逐个进行讲解。
//git reset
通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset
向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
git reset(重置) HEAE~1(删除一个,^一次,这是用法规定)
漂亮! Git 把 master 分支移回到C1
;现在我们的本地代码库根本就不知道有C2
这个提交了。
//
虽然在你的本地分支中使用git reset
很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!
为了撤销更改并分享给别人,我们需要使用git revert
。来看演示:
git revert(恢复原状;回复) HEAD(这个默认是指向的,但是可以通过^n 来控制第n个)
整理提交记录
开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。
看起来挺复杂, 其实是个很简单的概念 。//
git cherry-pick <提交号>... (cherry-pick 择优挑选 cherry樱桃 pick 挑选) 如果你想将一些提交复制到当前所在的位置(
HEAD)下面的话, Cherry-pick 是最直接的方式了。我个人非常喜欢
cherry-pick`,因为它特别简单。
//
当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。
但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了交互式 rebase 指的是使用带参数
--interactive
(交互的))的 rebase 命令, 简写为-i
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。git rebase HEAD~4
当 rebase UI界面打开时, 你能做3件事:
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换
pick
的状态来完成,关闭就意味着你不想要这个提交记录)- 合并提交。 它允许你把多个提交记录合并成一个。
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换
pick
的状态来完成,关闭就意味着你不想要这个提交记录)- 合并提交。 它允许你把多个提交记录合并成一个。
## 只取一个提交记录
来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。
这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!
最后就差把
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换
pick
的状态来完成,关闭就意味着你不想要这个提交记录)- 合并提交。 它允许你把多个提交记录合并成一个。
## 只取一个提交记录
来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。
这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!
最后就差把bugFix
分支里的工作合并回master
分支了。你可以选择通过 fast-forward 快速合并到master
分支上,但这样的话master
分支就会包含我这些调试语句了。你肯定不想这样,应该还有更好的方式……
实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样,我们可以使用
git rebase -i
git cherry-pick
来达到目的。
PS:注意了,都是在HEAD分支上进行往下提交分支里的工作合并回
master
分支了。你可以选择通过 fast-forward 快速合并到master
分支上,但这样的话master
分支就会包含我这些调试语句了。你肯定不想这样,应该还有更好的方式……
实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样,我们可以使用
git rebase -i
git cherry-pick
来达到目的。
PS:注意了,都是在HEAD分支上进行往下提交
最后的最后,创作不易,希望读者三连支持?
赠人玫瑰,手有余香?