Observe more,Think more
注:关于git,这是一篇总结性文章,希望对您有所帮助
雷锋和雷峰塔、老婆和老婆饼、js和jsp、git和github,所以他们到底是什么关系。。。
那么,我们今天来聊一聊 git和github
一、 关于 git 的一些简介
什么是 git:
官方说明:Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容
简而言之,git是一个分布式版本控制系统
在这里默认你已经安装好了适用于你个人开发平台的 git 版本,下面我们将首先进行一些配置
-
配置信息
由于 git 是分布式版本控制工具,因此我们需要一些信息(用户名、邮箱)来唯一标识个人身份
git config --global user.name="your name" git config --global user.email="your email"
需要注意的是:当使用 git config 命令中的 --global 参数时,你的系统中所有git仓库都将使用这个配置,当然你也可以针对某一个仓库设置姓名和密码
你可以使用如下命令,来查看你的个人信息
git config user.name # 查看用户名 git config user.password # 查看用户密码 git config user.email # 查看用户邮箱 git config --list # 查看配置信息
如果你需要修改这些信息,你可以这样做
git config --global user.name = "new name" # 修改用户名,同样的可以修改密码和邮箱
-
版本库
在了解版本库之前,我们先来看下 git 各区域之间的关系
workspace # 工作区
index # 暂存区(.git文件中有一个index文件,用于管理从工作区提交的修改)
repository # 版本库
remote # 远程仓库
版本库(repository)也叫版本仓库,你可以理解为就是一个文件夹,只是这个文件夹的修改、删除都会被 git 进行管理,下面我们就来创建这个文件夹
mkdir fileName # 创建一个仓库(目录)
cd fileName # 进入这个仓库(目录)
git init # 初始化这个仓库,使其可以被git管理
我们新建了一个文件夹,并且执行了 git init 操作
在这个在这个文件夹中,你会发现有一个 .git 的文件夹,在其内部有一个 index 文件,这个 index 文件就是你的暂存区了。
在 .git 文件夹中除了 index 以外的其他区域就是你的版本库。
并且,除了 .git 文件夹,在这个目录中的其他区域(文件、目录)就是你的工作区。
我们可以称,刚刚我们建的这个fileName的文件夹就是我们的本地仓库,里面包含了我们的工作区、暂存区、版本库
到此为止,你终于拥有了自己的本地 git 仓库
当我们继续执行 git 三连时,我们工作区的文件就可以提交到版本库里面去了。
# 如果你需要查看工作区与暂存区相比有哪些内容进行了修改
git status
# 1.将本地区的修改添加到暂存区
git add 1.md
git add 2.md
# 当然,上面两步git add 可以用一步来完成
git add . # 将全部本地区的修改,添加到暂存区
# 2.将暂存区修改提交到本地仓库
git commit -m "提交说明"
到此为止,我们已经知道怎样将本地工作区的代码提交到版本库了,这是一件让人感到快乐的事情。
二、管理版本
在上文中,我们已经知道怎样创建本地版本仓库,并将工作区修改提交到版本库,下面我们就来学习下,如何管理我们得版本
当我们在工作去进行了一次大范围的修改,当我们要提交时,却忘记具体修改哪些文件时可以使用如下命令:
# 查看修改了哪些文件
git status
# 查看某一个文件的哪些地方进行了修改
git diff fileName
在实际工作中,我们会进行很多此提交,当我们想要再次查看某一次提交时,我们可以使用 git log
git log # 查看提交(commit)历史,git会按照提交时间由近及远的顺序,展现出每一次提交
commit c0769bf3b93d1c0d06bb96ba40e1ad6e6f9ad210 (HEAD -> master)
Author: suaw <945565237@qq.com>
Date: Sun Jan 31 13:54:14 2021 +0800
change 2.md
commit aa8aef11251ec5211221d3abc4a78f4a886ddcda
Author: suaw <945565237@qq.com>
Date: Sun Jan 31 13:53:28 2021 +0800
change 1.md
commit 29fac03bc507134b89841bdc7c48f8b14012b7c7
Author: suaw <945565237@qq.com>
Date: Sun Jan 31 13:52:47 2021 +0800
change 1.md and 2.md
我们知道了提交了几次,以及提交的commit_id,当我们想知道提交的内容时,我们可以采用如下命令
git show aa8aef1125 # 使用 git show + commit_id 可以查看某一次提交的内容
commit aa8aef11251ec5211221d3abc4a78f4a886ddcda
Author: suaw <945565237@qq.com>
Date: Sun Jan 31 13:53:28 2021 +0800
change 1.md
diff --git a/1.md b/1.md
index 152aadf..5d6a050 100644
--- a/1.md
+++ b/1.md
@@ -1,2 +1,4 @@
### hello world
+### hello js
上面的这次提交我们可以看到 1.md 文件增加了 ** hello js** 这段话
现在因为某些原因,这时你想要回退到上次的提交,你可以这样做
git reset --hard HEAD^
# 或者这样做,找到需要回退的那次commit_id,你只需要输入id的前几位就可以,git会帮你自动找到该次提交
git reset -- hard c0769bf3b9
这时你会看到你的工作区内容会变成上一次提交的内容
这时关于版本回退我们可以做出这样的总结
git reset -- hard HEAD^ # 回退到上一次提交
git reset -- hard HEAD^^ # 回退到上上次提交
git reset -- hard HEAD~100 # 回退到第前一百次提交
git reset hard HEAD commit_id # 回退到指定的某一次提交
需要注意的是:这里的回退需要保证工作区没有修改,如果做了修改可以进行手动回退到前一次提交的状态,或者我们在后面的介绍再进行介绍其他修改方式
上面的内容我们探讨了:已提交到版本库,但工作区还未进行修改的内容进行管理
实际上,我们大部分需要处理的是工作区修改后的情况,一般有这两种情况:正常修改后需要继续提交、修改后发现无需提交需要撤销修改
- 正常提交
正常提交是很常见的情况,我们只需要进行 git 三连,提交到版本库即可
git status # 查看已修改的文件
git add # 添加需要提交的修改到暂存区
git commit -m "" # 将暂存区的修改提交到版本库
- 撤销修改
当工作区进行了修改,还未提交到暂存区,然而你发现这些修改不需要进行时
git checkout -- fileName / git restore fileName # 撤销工作区的修改
当工作区进行了修改,并且提交到了暂存区,然而你发现这个修改不需要进行时
git reset HEAD fileName / git restore --staged fileName # 将已提交到暂存区的修改,放回到工作区
git checkout -- fileName / git restore fileName # 撤销工作区的修改
当工作区进行了修改,并且提交到了暂存区后又进行了修改,然而你发现这个修改不需要进行时
git reset HEAD fileName / git restore --staged fileName # 将暂存区的修改返回到工作区
git checkout --fileName / git restore fileName # 撤销工作区的修改
到这里我们差不多了解完了在本地仓库的各种操作,我们学会了如何初始画一个本地仓库、如何进行 git 三连提交修改到版本库、如何回退版本、如何将暂存区的修改返回到工作区以及如何撤销工作区的修改
后面的内容我们就来聊一聊,本地仓库和远程仓库的关联操作
三、远程仓库
现实中,我们的开发常常需要建立一个远程仓库,来实现所有人员协同开发
这里我们以 github 为例,首先你需要创建一个远程仓库,其次将远程仓库与本地仓库进行管理。这一步默认你所有的github配置以完成
在GitHub页面你可以看到你的仓库地址,执行以下命令,进行首次关联。
git remote add origin XXXX # XXXX为你的远程仓库地址,origin为你的远程仓库名称,这里你可以任意设置
git push -u origin master # 由于远程仓库是空的,我们第一次推送时加上 -u 这个参数,
#不光会把本地master分支推送到远程,还会将本地master分支和远程master分支建立连接
完成上面一步,你会可以看到你的远程仓库中已经有了内容,并且和你本地master分支保持一致
当其他同事需要和我们一起协同开发时,首次操作需要克隆一份远程仓库的代码到本地来,只要执行以下命令即可
git clone XXXX # XXXX为远程仓库地址,这样本地就拥有一份远程仓库master分支最新的代码
到这里你已经学会如何创建一个远程仓库,并且知道了如何拉取远程仓库的代码,下面我们就开始多人协作开发了
在前面的内容中,我们都是使用master分支进行操作,git 会将master分支的每一次修改提交穿成一条时间线,HEAD严格来说不是指向分支,而是指向master,master再指向提交,因此可以理解为master指向分支。
-
一开始的时候,master是一条线,git 用master指向分支,再用HEAD指向master,这样就能确定当前的分支,以及当前的提交点
随着每一次提交,master也会向前移动,这样随着提交的次数越多,这条线就越长 -
当创建新的分支dev时,git 会创建一个指针dev指向当前master的位置,再将HEAD指向dev,这样就表示在dev分支上了
git checkout -b dev # 创建一个新的分支,并切换到该分支上
# 或者使用下面两条命令,先创建一个新的分支,再切换到新分支上去
git branch dev
git checkout dev
# 查看已有分支,以及当前分支
git branch
因此我们可以理解:git 创建分支只是增加了一个指针,修改HEAD的指向,文件并不会发生变化
- 当我们在dev上进行修改并提交时,dev指针就会向前移动,而master分支保持不动
- 当我们在dev上的完成开发,需要将dev分支合并到master上时,也很简单,只需要将master分支的指针移动到dev分支即可
毫无疑问,git 合并分支的速度也是很快的,因为它只是将指针进行了修改
# 合并dev分支到master,先切换到master分支
git checkout master
# 合并dev分支
git merge dev
# 这时你甚至可以删除dev分支
git branch -d dev
到这里我们知道了,如何提交代码到远程仓库,如何合并代码。需要注意的是,我们可以从dev分支拉取master分支的代码,但是不能将dev分支的代码提交到master,这是我之前疑惑的地方
如果master分支需要获取dev分支的代码,可以按照如下操作
# 切换到dev分支,并提交dev分支的代码
git chaeckout dev
git add .
git commmit -m "";
git push # 将代码推送到远程仓库的dev分支
# 切换到master分支,并合并dev分支代码
git checkout master
git merge dev
git push origin master
截至目前,我们已经学会了基本的协同开发中提交代码、切换分支、合并代码、拉取代码、推送代码等工作。
开发中我们常常会遇到一些以外的情况,比如:代码冲突、bug修改登等问题,我们会在后面的内容中继续介绍这些问题的处理场景。