一、git简介
1.1、git概述
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种类型的仓库:本地仓库和远程仓库。 下载地址:https://git-scm.com/download
-
本地仓库:是在开发人员自己电脑上的Git仓库
-
远程仓库:是在远程服务器上的Git仓库
1.2、git工作流程
- 从远程仓库中克隆代码到本地仓库(git clone)
- 从本地仓库中checkout代码然后进行代码修改(checkout)
- 在提交前先将代码提交到暂存区(add)
- 提交到本地仓库。本地仓库中保存修改的各个历史版本(commit)
- 修改完成后,需要和团队成员共享代码时,将代码push到远程仓库(push)
1.3、Git常用的代码托管平台
我们的远程仓库就建立在代码托管平台上,常见的有GitHub,GitLab,还有码云等
- itHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub
- 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
- GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
二、Git常用命令
2.1、环境配置
-
设置用户信息
git config --global user.name "name" # 设置git用户名 git config --global user.name "email"# 设置git邮箱
-
查看用户的配置信息
git config --list # 查看git的配置 git config user.name # 查看git的用户名 git config user.email #查看邮箱
通过上面的命令设置的信息会保存在C盘用户目录下的.gitconfig文件中
2.2、获取Git仓库
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库
-
可以通过clone命令从远程仓库克隆一个到本地
-
可以通过init命令在本地初始化一个Git仓库
通过以上两种方式都可以在本地撞见一个仓库,它会生成一个.git的文件,有这个文件代表着是一个git本地仓库
2.3、工作目录、暂存区和版本库
- 前面看到的.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
- 包含.git文件夹的目录就是工作目录,主要用于存放开发的代码
- .git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
Git工作目录下的文件存在两种状态:
- untracked未跟踪状态(未被纳入版本控制)
- tracked已跟踪(被纳入版本控制)
- unmodified 未修改状态
- modified 已修改状态
- staged已暂存状态
2.4、本地仓库操作
- git status 查看文件状态
我们新建了一个.gitignore文件(可以在这个文件里面配置哪些文件不必纳入版本控制),此时查看文件状态发现.gitignore是未被跟踪状态,也可以使用git status -s 命令简介的显示文件状态
2. git add 将文件添加到暂存区
此时查看再次查看文件状态
- git reset 将暂存区的文件取消暂存
我们添加到暂存取得文件并没有提交到本地的仓库,可以通过git reset命令取消暂存,再次查看文件,文件又处于未被跟踪状态.
- git commit 将暂存区文件提交到仓库
参数-m的意思是记录提交的日志,想要commit必需要经过add
-
git rm 删除文件
此时显示.gitignore文件已经被删除,但是这只是删除了工作区的文件并没有删除本地仓库的文件。
将删除操作提交到本地仓库
注意:使用git rm 删除后默认进入暂存区可以直接commit,但是如果在windows中删除则需要add
-
.gitignore忽略文件
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件
7.git log 查看日志记录
2.5、远程仓库操作
-
git remote 查看远程仓库
如果本地仓库是直接从远程仓库clone的,我们可以看到一个origin 。这是Git克隆的仓库服务器的默认名字。
如果没有指定远程仓库,则啥也没有
-
添加和断开远程仓库
git remote add
添加一个新的远程 Git 仓库,同时指定一个可以引用的简写 如果想要断开与远程仓库的连接可以使用git remote remove [仓库(origin)]注意:此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库
远程仓库可以添加多个
-
从远程仓库克隆
如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
命令形式:git clone [url]
-
从远程仓库fetch
git fetch 是从远程仓库获取最新版本到本地仓库,它会将数据放在git文件的object文件里面,我们找不到,它不会自动merge,fetch过后需要使用merge命令将本地仓库的数据和fetch来的数据合并。
命令形式:git fetch[remote-name] [branch-name]
git merge[remote-name]/ [branch-name]
注意:如果本地仓库不是从远程仓库克隆而来而是init初始化而来。则第一次合并或者提交的时候会出现fatal:refusing to merge unrelated histories,我们需要在命令后面加上--allow-unrelated-histories,表示允许不相关的历史
-
从远程仓库pull
命令形式:git push [remote-name] [branch-name]
如果第一次出现出现fatal:refusing to merge unrelated histories,也需要加上--allow-unrelated-histories
-
将本地仓库代码推送到远程仓库
当你想分享你的代码时,可以将其推送到远程仓库。 命令形式:git push [remote-name] [branch-name]
2.6、Git分支
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。master分支是git仓库的默认分支。
-
查看分支
列出所有本地分支:git branch
列出所有远程的分支:git branch -r
列出所有本地分支和远程分支:git branch -a
-
创建分支
命令格式:git branch [branch_name]
-
切换分支
使用git checkout [branch_name]可以切换分支,前面的*和绿色就表示当前分支
在当前分支下创建一个文件master2.txt并push到远程仓库maste2分支,此时master分支没有master2.txt文件。
当我们切换到master分支没有master2.txt文件
当我们切换到master2分支,发现master2.txt文件
-
git合并分支
命令格式:git merge [branch_name]
注意:如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没办法合并它们,同时会提示文件冲突。此时需要我们打开冲突的文件并修复冲突内容,最后执行git add命令来标识冲突已解决
-
删除分支
git branch -d [branch_name]
如果要删除的分支中进行了一些开发动作,此时执行上面的删除命令并不会删除分支,如果坚持要删除此分支,可以将命令中的-d参数改为-D
git branch -D [branch_name]
如果要删除远程仓库中的分支,可以使用命令git push origin –d [branch_name]
此时远程仓库只剩下master分支,没有master2分支
2.7、Git标签
Git 可以给历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.2等)。标签指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。
-
创建标签
git tag [tag_name]创建一个新的标签
-
列出标签
git tag查看有哪些标签
git show [tag_name] 查看标签的详细信息
-
将标签推送到仓库
git push [remote] [brance] [tag_name]
可以看到远程仓库多了一个v1.0标签
-
新建一个分支,指向某个标签
命令格式:git checkout -b [branch] [tag]
-
删除标签
git tag -d [tag_name] 删除本地标签
git push [remote] [branch] :refs/taags/[tag_name] 删除远程标签
三、Git时光机
3.1、reset和checkout
在工作中,一旦误删了文件或者是把文件弄乱了,我们可以从最近的一个commit版本恢复。git log命令 显示从最近到最远的提交日志,可以见看到我们各个版本的日志每个版本都有一个commit id,其HEAD表示当前版本,HEAD表示上一个版本,HEAD表示上上一个版本,往上100个版本可以写成HEAD加连续100个,也可以写成:HEAD~100。
git log :显示从最近到最远的提交日志
git log --pretty=oneline:将只会显示提交的commit id号和对应的注释。
回退到上一个版本
git reset --hard HEAD^
已经成功回退到上一个版本,此时执行以此git log,已经没有第三个版本的信息
此时我们如果想要恢复到第三个版本,我们需要使用 git reflog来查看过的你使用过的每一条命令
执行命令 git reset --hard [commitId]
已经回到第三个版本!
git reset --soft [id] :最近一次提交节点的提交记录回退到暂存区。此时a.txt已经添加到暂存区但是未被提交
git reset --mixed HEAD^ :将最近一次提交节点的提交记录回退到工作区
如果想要将暂存区的内容回退到工作区直接使用git reset 命令。
如果想要清除工作区某个文件的修改可以使用 git checkout -- [file_name]命令,git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
3.2、revert
git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。