一文带你了解Git基本知识
1.Git介绍
集中式版本控制系统(例如SVN):版本库是集中存放在中央服务器上的,工作的时候用的都是自己的电脑,所以首先要从中央服务器上得到最新版本,然后开始工作,完成工作后再将自己的工作推送到中央服务器。集中式版本控制系统最大的缺点就是必须联网才能工作,对网速要求比较严格。
分布式版本控制系统(例如Git):没有中央服务器,每个人的电脑上都是一个完整的版本库,工作的时候不需要联网,因为版本库就在你自己的电脑上。多人协作的方法如下:比如你在自己的电脑上修改了文件A,你的同事也在他的电脑上修改了文件A,这时你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
2.Git安装
进入Git下载页面https://git-scm.com/download/win选择适合自己电脑系统版本下载,下载完成后按照提示一步一步安装就行,安装完成后在开始菜单中会有Git项,菜单下面会有这几项选项:
(1)Git Bash:类似liunx风格命令行
(2)Git CMD:windows风格命令行
(3)Git GUI:图形化界面的Git, 点击Create New Repository可以直接创建一个新的仓库。
3.Git结构
上面两张图展示了工作区、暂存区和版本库之间的关系:
工作区:就是你在电脑里能看到的目录,比如一个文件夹就是一个工作区,就是平时存放项目文件的地方。
暂存区:英文名字叫stage或者index。一般存放在.git目录下的index文件(.git/index)中,因此将暂存区有时也叫索引(index)。是工作区用来提交更改(commit)前可以暂存工作区的变化。
版本库:工作区中有一个隐藏目录.git,这个不算工作区,而是git的版本库。版本库也叫仓库(repository)。当我们对文件进行修改、删除时Git都可以对其进行跟踪。版本库中还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
上面第二张图例中左侧为工作区,右侧为版本库。在版本库中标记为index的区域就是暂存区(stage/index),标记为master的是master分支所代表的目录树。
图中HEAD指向了master分支,即主分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,因此HEAD指向的就是当前分支。
图中的 objects 标识的区域为 Git 的对象库,实际位于.git/objects目录下,里面包含了创建的各种对象及内容。
对工作区文件进行修改后执行git add命令是,暂存区的目录树被更新,同时工作区文件修改的内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行git commit命令时,暂存区的目录树写到版本库(对象库)中,master分支做出相应的更新。
当执行git reset HEAD命令时(),暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。
当执行git rm –cached命令时,会直接从暂存区删除文件,工作区则不做出改变。
4.Git配置
设置用户名与邮箱
完成Git安装后首先需要设置你的用户名和e-mail地址。因为每次Git提交都需要使用该信息。
$ git config --global user.name "用户名"
$ git config --global user.email e-mail地址
在设置用户名和邮箱地址时,如果传递了--global选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。因为--global为全局配置,不加为某个项目的特定配置。
设置完成后使用git config -l命令查看Git环境详细配置
5.创建版本库(仓库)
使用git init命令创建一个新的Git代码库
执行完git init命令后,查看Stm32f4_Hal文件夹,发现在此文件夹中多了一个.git文件夹,关于版本等的所有信息都在这个目录里面。
Git文件管理
6.文件的4种状态
Untracked:未跟踪,此文件在文件夹中,并没有加入到git库,不参与版本控制。可以使用git add命令将此文件变为Staged状态。
Unmodify:文件已经入库未修改,即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果被修改则变成Modified,如果使用git rm移出版本库,则变成Untracked状态。
Modified:文件已修改,并没有进行其他的操作,这个文件同样有两个去处,通过git add命令使其变成Staged状态,通过git checkout命令则丢弃修改过,返回Unmodify状态,git checkout命令从版本库中取出文件,覆盖当前修改。
Staged:暂存状态,通过git commit则将修改同步到库中,这时版本库中的文件和工作区的文件保持一致,文件为Unmodify状态,执行git reset HEAD filename取消暂存,文件状态变为Modified状态。
7.查看文件状态
使用下面的命令则可以查看文件的状态
查看指定文件状态:git status [filename]
查看所有文件状态:git status
通过git status查看文件状态,文件状态显示为untracked files(未跟踪),提示通过git add可以暂存
8.添加文件与目录
版本库中还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
将文件往Git版本库里添加的时候,分两步执行:
第一步使用git add命令把文件添加进去,实际上就是把文件修改添加到暂存区。
第二步使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。创建Git版本库时,Git自动为我们创建了唯一一个master分支,因此现在git commit就是往master分支上提交更改。
将未跟踪文件Untracked添加到暂存区使用如下命令
git add [file1][file2]… 添加指定文件到暂存区
git add [dir] 添加指定目录到暂存区,包括子目录
git add . 添加当前目录的所有文件到暂存区
执行完git add .命令
执行完git add .命令后,.git文件夹中多了一个index文件即暂存区。然后在git commit命令就可以一次性把暂存区的所有修改提交到分支。
使用git add命令只是将文件或目录添加到了index暂存区,使用git
commit命令可以实现将暂存区的文件提交到本地仓库。
git commit –m [message] 提交暂存区到仓库区
git commit [file1] [file2]… -m [message] 提交暂存区指定文件到仓库区
git commit –a 提交工作区自上次commit之后的变化,直接到仓库区
git commit –v 提交时显示所有diff信息
9.查看提交日志
查看提交日志使用git log指令,指令格式如下:
git log
查看所有分支日志使用git reflog指令,指令格式如下:
git reflog
“git reflog”中会记录这个仓库中所有的分支的所有更新记录,包括已经撤销的更新。
10.撤销更新
(1)撤销暂存区更新
使用git add把更新文件提交到了暂存区。这时git status的输出中提示我
们可以通过 git restore --staged..." to unstage把暂存区的更新移出到工作区中。
(2)撤销本地仓库更新
使用git log查看提交日志
撤销提交有两种方式:使用HEAD指针和使用commit id。在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本使用HEAD^,那么前一个版本可以使用HEAD^^,想回退到更早的提交,可以使用HEAD~n(HEAD^=HEAD~1,HEAD^^=HEAD~2)。
git reset --hard HEAD~1
git reset --d37490d6f6ac48ed351d0151aef833d158b8d3c2
现在又想恢复被撤销的提交可用git reflog查看仓库中所有分支的所有更新记录,包括已经撤销的更新,撤销方法与前面一样
git reset --hard HEAD@{1}
git reset --hard d37490d
11.关联远程仓库
Git是分布式版本 控制系统,同一个git仓库可以分不到不同的机器上,但开发参与者必须在同一个网络中,且必须有一个项目的原始版本,通常的办法是让一台电脑充当服务器的角色,每天24小时在线, 其他每个人都从这个服务器仓库克隆一份到自己的工作电脑并且各自把各自的提交推送至服务器仓库里,也从服务器仓库里面下载别人的提交。可以使用免费的代码托管平台充当服务器角色。
代码托管平台比较多,本文以github为例,进入GitHub官网https://github.com/注册一个账号。
使用ssh-keygen –t rsa –C “email”命令创建ssh key。执行完此命令后,会在下图所示的路径下.ssh文件夹下生成两个文件:id_rsa和id_rsa.pub。把id_rsa.pub文件中的内容复制到GitHub账户中进行设置。
进入GitHub网页,打开setting选项如下图所示:
点击左边栏中的SSH and GPG keys,将ssh key粘贴到右边的key里面。Title随便起个名字即可。
点击Add SSH key 按钮,即可添加成功。
输入ssh –T git@github.com命令进行测试。
如上图所示连接成功。
我的D盘目录下有一个Stm32f4的工程,我们以这个工程为例演示怎样将此工程上传至远程仓库并建立关联。
使用git init命令建立本地仓库,再使用git add命令把工作区中的文件添
加到暂存区,然后使用git commit命令将暂存区的文件提交到本地仓库中。最后使用git push命令将文件推送到远程仓库中。
第一次使用需要使用git clone命令从远程仓库中克隆一份文件到本地仓库,之后如果远程仓库的文件进行了更新,可以使用git pull拉取新更新的内容到本地仓库。
使用git int新建本地仓库如下图:
版本控制就是通过.git这个隐藏文件夹来实现的,将Stm32f4这个工程下的文件添加到暂存区如下图所示:
将暂存区的文件提交到本地仓库如下图所示:
关联远程仓库
打开GitHub网站,在GitHub上创建一个Stm32f4的仓库如下图所示:
点击Create repository按钮,仓库就创建好了。
将远程仓库和本地仓库关联起来
先到GitHub上复制刚才建立的仓库的SSH地址如下图所示:
运行git remote add origin 复制刚才的ssh地址
执行git push –u origin master将本地仓库中的文件上传至远程GitHub上的仓库中,可以在GitHub上看到我们上传本地仓库的文件
至此本地仓库已经和远程仓库关联完成。以后想在commit后同步到GitHub上,只要直接执行git push命令即可。可以在GitHub上看到修改。
12.利用GitHub管理你的文件
项目组成立之后,项目组负责人会给项目组成员分配一个git账号及一个远程仓库的地址。假设这个远程仓库的地址如下:
git@github.com:HuaYiSir/Stm32f4.git
首先你需要将本项目中的文件从远程仓库克隆下来存放在自己的工作电脑上存放在D盘如下图所示:
在自己电脑上工作了一天,增加了几个文件并上传至远程仓库:
查看远程仓库是否有更新
假如你下班了,你的同事更新了远程仓库中的文件,第2天你上班后第一件事情就是查看远程仓库中的文件是否有更新,操作如下:
如果没有更新则就不需要拉取远程仓库中的文件了。