图像具备强大的威力
引言
那是我在做毕业设计的时候,使用IDEA作为开发工具,我对系统做了比较大的改动,然后系统又跑不起来了,当时在宿舍写代码的我只想扇我自己的脸,我就想到了能不能将系统回退到正常运行的版本呢,但是我又没有使用版本控制工具,不过还好IDEA自带了一个文件历史记录,我又回退正常版本了。我想这就是版本控制工具的第一个功能吧,版本回退。
除了版本控制之外,Git还是一个团队协作工具,什么意思呢?在企业的开发过程中,我们都是不同的人开发不同的功能,但是这又是一个系统上面的东西,我们不可能使用U盘这种初级的方式将自己开发完成的功能拷到主系统上去。我们就可以使用Git将开发完成的代码提交到正在开发的系统中。
是啥
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git是一个免费开源的分布式版本控制系统,被设计用来管理小型到大型的项目。
分布式 VS 集中式
- 集中式版本控制工具需要一个中央服务器。代码最终被提交这里。
- 分布式版本控制系统没有"中央服务器的概念"。每个人电脑都有一个完整的版本库。
那可能有人就会问了,那我的代码提交到哪里呢? 只存在本地吗?
既然是多人协作,我们就需要指定一台服务器作为总仓库。每个人将自己所做的提交到这个服务器上,每天从这个服务器上拉取别人的修改。
那GitHub是?
GitHub是一个代码托管网站。开发者将自己的代码放到GitHub上。
有啥用
我们想象一下,开发团队不使用版本控制工具或者没有版本控制工具会怎么样呢?
一个团队不同的人开发的功能,该怎么整合在一起呢?好,你通过复制,然后开发人员如何获取最新的代码呢?
假定公司设定了这么一个岗位专门用来合并代码,我们称之为代码合并官吧! 代码合并官每天早上把最新的代码通过邮件再发给各个开发者。然后开发者再把用邮件中的最新代码覆盖自己的。
然后某天,CTO(首席技术官)改错了一个东西,想想看最新的代码,然后想看看之前的是什么样的。代码合并官表示,不用担心,你发的代码我都按天建文件夹,稍等一下,我给你找找。
上面的场景一想就很恐怖。程序员们不会让上面的场景出现,因为上面的工作是重复的,要知道复用可是我们的追求。
版本控制工具可以做到,将开发者的代码汇集在一起,让开发者每天拉取到最新的代码。还可以记录文件历史,假如的误操作,把正确的代码改成错了,你就可以回退到正常的版本。又比如吧,项目经理决定兵分两路,一路接着开发新的功能,一路修复bug。你就可以做一个分支,在一个分支上开发新的功能,在另一个分支上修复bug。修的差不多了,然后把两个分支合并在一起。
总结一下版本控制工具有啥用:
- 整合代码(将各个开发者的代码汇集在一起),高级一点的名字叫团队协。
- 记录文件历史(让你有后悔药可以吃)。版本控制
-
做分支(branch),分支大体上有下两个作用:
- 一路修bug,一路做新的功能。
- 代码要区分为个人版、企业版。个人版和企业版相同功能做完之后,做一个分支出来,团队就被切分为两组,不同的团队在不同的分支上开发。
怎么用?
要想用,你需要首先要下载Git。下载安装不做介绍。网上有详细的教程。
git基础概念
在学怎么用之前,我们首先介绍Git的一些基础概念。
- 工作区(workspace): 就是你存放代码的地方。(要执行Git init指令,产生.git文件夹之后)
- 暂存区(index): 工作区未被Git所控制的文件,在被控制之后就转到暂存区
- 本地仓库: 暂存区的文件,假定为a.txt,执行git commit a.txt -m'测试',就转入本地仓库
- 远程仓库: 处于本地仓库的文件, 执行git push -u 推送到远程仓库
在流程图中已经出现了一些Git的命令:
- git add
- git commit
- git checkOut
- git pull
- git push
- git fetch/clone
后文会将对这些命令进行详细的介绍.
git的基本操作
账号配置
设置邮箱、账户名:
范围:
--global use global config file (给整个计算机一次设置,给当前计算机上的所有用户)
--system use system config file (常用,给当前用户一次性设置)
--local use repository config file (给当前项目一次性设置)
从范围上看,global > system > local
但是小范围的会覆盖掉大范围的。
为什么要设置呢?
记录文件的提交历史,谁提交的,什么时候提交的。 我们称之为日志。
注意只有将文件从暂存区推进本地仓库才会有日志。
怎么设置呢?
git config --范围 user.name '你的用户名'
git config --范围 user.email '你的邮箱'
例子:
git config --system user.name 'fish'
git config --system user.email '[email protected]'
在哪里可以看见设置的账户和邮箱呢?
local 范围 :
在.git 文件夹下的config文件中。
system
进入根目录下, 打开 git bash here 后, 执行cd ~命令.
下面会有一个.gitconfig 文件。
里面就记录了你设置的账户和密码
add commit
这里我新建一个文件叫gitstudy,
git status: 查看工作区 暂存区的状态
工作区的文件有以下几种状态:
unstatge: 未纳入版本控制,处于工作区
statge: 加入版本控制,进入暂存区
commited: 进入本地仓库
我在gitstudy下新建一个文件,不执行任何指令,那么该文件就处于unstatge。
例子:
staged: 纳入版本控制
在 git bash here 中执行: git add 文件全名
代表把指定的文件加入版本控制中,也就是放入暂存区。
git add . 代表将所有的untracked的文件都加入暂存区。
平时用git bash here用习惯了,Git还提供了图形化界面,虽然很简陋。
执行git add d.txt 将文件推送至暂存区
执行git status 查看工作区、暂存区的状态
执行git add . 将所有不在暂存区处于工作区的文件推进暂存区
我们用git status 查看工作区、暂存区的状态
我们发现untracked files 就没有了。
进入暂存区的命令有两个:
- git add 文件全名 将处于工作区不在暂存区的指定文件加入到暂存区
- git add . 将处于工作区不在暂存区的所有文件加入到暂存区
将暂存区的文件推至工作区的命令也有两个:
- git commit 文件全名 -m'每次推本地仓库的注释'
将处于暂存区不在本地仓库的指定文件推进至本地仓库
- git commit . -m'每次推进本地仓库的注释'
将处于暂存区不在本地仓库的所有文件推进至本地仓库
看日志
最简单的命令就是: git log
这个命令列出所有的提交记录。
commit 5663dd0764d5ddd2f645737437f22c447ab772a7
commit 后的字符串是用加密算法(SHA1(不叫sha yi,叫sha one) 算法)产生的,用来标识每一次提交操作。
可能有人要问了,为什么你不用第几次提交了标识呢?
软件开发过程中大家是一起干活的, 假若有两个人的某一次的提交次数是相同的,那远程仓库怎么标识这两个提交呢.
所以还是用加密算法产生提交标识更为稳妥
那可能有人还是要问了?
我只想看最近几次。我只想看最近三次该怎么办呢?
git log -次数: 查看最新的三次提交
git log --graph
- 那我一不小心把注释打错了怎么办?
没关系可以重写。
git commit --amend -m'注释信息' 覆盖最近一次的提交信息
例子:
push 推送
如何将你的代码推给别人,或者推到服务器上呢?
- 假如你是拉公司的代码,拉下来的代码中就有.git文件夹。该文件夹中就有远程服务器的信息。
你将修改的文件从暂存区推进至本地仓库。后 git push -u 就可以了。
- 假如你想把你的代码推给别人
你就需要设定推送的目的地。
执行下面的命令:
git remote add origin 远程仓库的地址
我的远程仓库地址是:
[email protected]:CXK6013/studyGit.git
所以我执行的是:
git remote add origin [email protected]:CXK6013/studyGit.git
origin 后面的就代表目的地,最后一块肯定是项目名.git这种形式
一台计算机上的文件夹不是什么都不做就成为了远程仓库。
至于怎么使一台计算机上的文件夹成为远程仓库。那是后文讨论的问题了。
然后执行 git push 就可以将工作区的代码推送到远程仓库了。
删除 回退
误提
假如我误提交了一个文件呢。 没关系可以是删。
删除的两种方式:
直接调用操作系统的删除。
Changes not staged for commit,怎么理解这句话呢,not staged 没有暂存。 没暂存,也就是不在暂存区。还处于工作区。我们需要将这个删除命令也进入到暂存区,本地仓库区.
changes to be commit: 删除操作没有到本地仓库区。
我们commit一下,这个文件就被删除了。
Your branch is ahead of 'origin/master' by 1 commit. 这句话是说,我本地的分支不一致。我本地的比较新。
建议我执行git push。
调用git命令进行删除:
changes to be commited 也就是说命令已经到暂存区,还没有到工作区。
我们在执行 git commit . -m'删除本地仓库的文件'。工作区、暂存区、本地仓库区就保持一致了。
误删
那假如我误删了呢?
关系不是很大,操作系统上有撤销操作,版本控制工具上也有后悔药可吃.
那怎么吃这个后悔药呢?
reset: 调整; 重新设置; 重新安置; 将…恢复原位.
注意这个恢复原位
执行完 git reset head d.txt
Changes not staged for commit: 说明删除操作还没有到暂存区。你也可以认为是文件从暂存区到工作区了。
然后git认为你想做以下两件事情:
-
(use "git add/rm
..." to update what will be committed) 可以 - 使用 git add 或者 git rm 将你的操作也在暂存区执行一份。
-
(use "git checkout --
..." to discard changes in working directory) - 执行git checkout -- 文件全名。 就是你误删了某个文件,执行该命令后,丢弃删除操作,恢复该文件。