整理 Git 的基本知识,本文适合了解git部分知识但是不太熟练的童鞋
1、git简介及安装
git
是目前常用的一个版本控制系统
,由Linus
创始人Linus Torvalds
发明,github
和gitee
等都是基于git
的远程仓库。
安装很简单:Git下载,下载后一路点击确定即可。安装完Git
后通常需要配置用户名和邮箱:
git --global user.name "用户名"
git --global user.email "email地址"
如果要查看git
的配置:
git config --list
git
的配置其实分为3个,分别是全局配置、用户配置和本地配置,查询时的优先级是本地配置 > 用户配置 > 全局配置。
- 全局配置:通过命令
git config --system --list
查看,保存在git安装目录下的/etc/gitconfig
文件中。 - 用户配置:通过命令
git config --global --list
查看,保存在C盘
的用户文件夹下的个人账户文件夹中的gitconfig
文件中。例如C:\Users\ccattempt\gitconfig
。 - 本地配置:通过命令
git config --local --list
查看,保存在本地git
仓库(即.git文件夹
)的config
文件中。
如果要查看某个特定的值,例如user.name
:
git config user.name // 可以指定配置,例如:git config --global user.name
如果要设置某个特定的值,例如user.name
:
git config user.name yourname // 可以指定配置,例如:git config --global user.name yourname
注意:由于 Git 会从多个文件中读取同一配置变量的不同值,因此你可能会在其中看到意料之外的值而不知道为什么。 此时,你可以查询 Git 中该变量的 原始 值,它会告诉你哪一个配置文件最后设置了该值:
git config --show-origin user.name
2、git基本命令
以下介绍常用的git命令
:
1、初始化git仓库
通常我们会遇到两种情况:
- 新建一个项目,需要使用
git
进行版本控制 - 已有通过
git
控制的项目,需要从远程仓库拉取下来
第一种情况需要使用init
命令,运行下面的命令后将会在当前文件夹下创建.git文件夹
,因为这个文件夹是隐藏的,因此可能需要打开隐藏项目才可以查看到。
git init
如果是第二种情况,需要使用clone
命令:
git clone 远程仓库地址
这同样会在当前文件夹下创建一个.git文件夹
,并下载远程仓库的文件。
2、查看状态、修改、提交、撤回、查询日志
我们在初始化或者克隆一个文件后,可以通过git status
查看当前状态:
git status
因为目前没有文件的修改和新增,所以提示工作树是干净的,没什么需要提交的。我们新增一个a.txt
文件,再查看状态:
此时提示a.txt
没有被git
捕捉到,需要使用git add
命令添加到暂存区:
git add 文件或文件夹路径 // 使用 git add . 或者 git add --all 可以一次提交所有修改到暂存区
这时的状态是已经提交到暂存区,但是还没有提交到本地仓库
,需要使用git commit -m "描述信息"
命令,并且提示说可以使用git restore --staged 文件路径
撤销这次提交,我们先尝试commit
:
commit
以后这次新增文件的信息就算提交成功了,可以发现工作树又是干净的了。这时这个文件就已经提交到本地仓库了。我们在本地的操作就算完成了。
然而,有时候我们难免手抖,不小心提交了多余的东西到暂存区,这时可以使用git restore --staged 文件路径
撤销提交,例如,再新增两个文件b.txt
和c.txt
,我们本意是分别提交,但是却使用git add .
一次性提交到暂存区了:
从暂存区撤销c.txt
的提交:
git restore --staged c.txt
此时c.txt
又是未追踪状态了。但是如果已经把文件commit
了怎么办呢?我们可以使用git reset
回退版本,但在之前需要先知道怎么查看提交日志,使用git log
可以查看所有提交日志:
git log
使用git log -n
可以查看最近的n
条日志,例如查看最近一条数据:
git log -1
使用git log --pretty=oneline
可以查看日志的简短信息:
git log --pretty=oneline
使用git log --patch
可以查看每次提交时的修改,这里我们先修改a.txt
,然后查看:
3、分支
可以通过git branch
查看当前所有本地分支:
git branch
默认存在一个master
分支,也就是主分支。可以通过git branch 分支名
新建分支:
git branch 分支名
前面有*
号的就是当前分支,可以发现新建了一个dev
分支。可以通过git checkout 分支名
切换分支:
git checkout dev
当我们在分支上修改了代码之后,需要再把代码合并到主分支,此时需要使用git merge
命令:
git merge 需要被合并的分支
我们在dev
分支新建dev.txt
文件,提交后合并,注意合并前先切换到master
分支:
这样dev
分支的东西就被合并到master
分支了,在master
分支可以发现多了dev.txt
文件:
如果合并后不需要分支了,可以删除,使用git branch -D 分支名
:
git branch -D 分支名
注意合并的过程中可能出现冲突,这时需要先解决冲突,再次新建dev
分支,可以通过git checkout -b dev
的命令一次性创建并切换到dev
分支:
git checkout -b dev
在dev
分支的dev.txt
添加内容我是dev分支
,提交后再切换回master
给dev.txt
添加内容我是master分支
并提交,再合并dev
分支:
git merge dev
解决掉冲突再提交即可。
4、远程仓库
通常情况下我们会将代码上传到远程仓库,例如github
,可以通过git remote
查看当前的远程仓库地址。注意通过git clone
下来的项目默认会绑定远程仓库,并给这个地址一个叫origin
的别名:
git remote
我们在gitee
添加一个远程仓库,然后复制仓库地址,通过git remote add 别名 仓库地址
来创建一个远程仓库别名,此后就可以利用这个别名来推送代码到gitee
,这里别名设置为firststore
:
`git remote add 别名 仓库地址`
远程仓库目前是空的,我们清空本地仓库文件,然后新建README.md
文件,提交到本地仓库。此时我们可以先推送到远程仓库,但是如果远程仓库已经有内容了则需要先从远程仓库拉取代码,这里我们先使用git push 远程仓库地址或者别名 本地分支名:远程分支名
,如果远程和本地分支名相同也可以简写为:git push 远程仓库地址或者别名 分支名
:
git push 远程仓库地址或者别名 本地分支名:远程分支名
这样我们就完成了推送。如果新建的远程仓库已经有内容,则需要先使用git fetch 远程仓库别名
先获取远程分支代码:
git fetch 远程仓库别名
这样会发现多了一个远程分支。此时再使用git merge
合并:
提示拒绝合并没有被发布的历史,这时需要加上--allow-unrelated-histories
,表示允许合并未发布的内容:
合并成功了,但是提示发生了冲突,这是因为远程仓库和本地仓库都有README.md
文件,先解决冲突,在vscode上可以清晰的看到冲突内容:
这里我们选择将两个文件内容都保留,重新提交到本地仓库后可以选择推送到远程仓库:
查看远程仓库,可以发现推送成功了:
3、总结
前面说了一大堆,实际日常工作用到的无非是克隆仓库、拉取代码、合并分支、推送分支。流程如下:
1、克隆仓库
首先我们一般有一个远程仓库的分支,例如名字叫dev
:
克隆dev
分支代码:
修改README.md
文件,然后推送到dev
分支:
注意origin/dev
是远程分支名,可以通过git branch --remotes
查看所有远程分支。origin
是远程仓库别名。在个人分支上完成自己的任务后,我们需要合并到主分支,这时需要先拉取主分支代码到本地分支,为了模拟多人开发环境,我在远程仓库的master
分支也修改了README.md
文件。拉取主分支代码需要先fetch
再merge
:
注意fetch
的命令是git fetch 远程仓库别名 远程分支名
,不要和git merge 分支名
记混了:
已经合并到本地仓库,但是提示冲突,先解决冲突:
解决完冲突后再提交然后推送到远程的dev
分支:
然后再发起合并dev
到master
的请求等待审核通过即可。
4、常用git命令汇总
初始化仓库:
git init
克隆仓库:
git clone 仓库地址
提交代码到暂存区
git add 文件路径
提交代码到本地仓库
git commit -m "描述文字"
查看日志
git log
查看简短日志
git log --pretty=oneline
查看最近n条日志
git log -n
撤销提交到暂存区的文件
git restore --staged 文件名
修改commit
的描述文字
git commit --amend
删除暂存区的文件
git rm --cached 文件名
回退版本
git reset --hard 版本号
查看本地分支
git branch
查看远程分支
git branch -r
查看所有分支
git branch -a
新建分支
git branch 分支名
删除分支
git branch -d 分支名
切换分支
git checkout 分支名
新建并切换到新建分支
git checkout -b 分支名
合并本地分支
git merge 分支名
新建远程仓库地址别名
git remote add 别名 远程仓库地址
查看远程仓库别名
git remote
查看远程仓库地址
git remote -v
拉取远程仓库代码
git fetch 远程仓库别名 分支名
合并远程仓库分支
git merge 远程仓库别名/分支名
拉取并合并远程仓库代码
git pull 远程仓库别名 本地分支:远程分支
如果分支名相同也可简写:
git pull 远程仓库别名 分支名
合并未发布的(unrelease)的远程仓库代码
git merge 远程仓库别名/分支名 --allow-unrelated-histories
推送代码到远程仓库
git push 远程仓库别名 本地分支名:远程分支名
如果本地和远程分支名相同可以简写为:
git push 远程仓库别名 分支名
删除远程分支
git push 远程仓库别名 -d 分支名