Git是当前最先进、最主流的分布式版本控制系统,免费、开源!核心能力就是版本控制。再具体一点,就是面向代码文件的版本控制,代码的任何修改历史都会被记录管理起来,意味着可以恢复到到以前的任意时刻状态。支持跨区域多人协作编辑,是团队项目开发的必备基础,所以Git也就成了程序员的必备技能。
主要特点:
Git是Linux之父被迫开发的,为了解决Linux混乱的代码管理而开发的。Linux和Git之父 李纳斯·托沃兹(Linus Benedic Torvalds),来自1969年的芬兰。
02、Git是干什么的?—基础概念
先了解下Git的基本概念,及基本框架、工作流程。
2.1、Git概念汇总
概念名称
描述
工作区(Workspace)
就是在电脑里能看到的代码库目录,是我们搬砖的地方,新增、修改的文件会提交到暂存区
暂存区(stage 或 index)
用于临时存放文件的修改,实际上上它只是一个文件(.git/index),保存待提交的文件列表信息。
版本库/仓库(Repository)
Git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录(版本)都在这里。
服务端/远程仓库(origin 或 remote)
服务端的版本库,专用的Git服务器,为多人共享提供服务,承担中心服务器的角色。本地版本库通过push指令把代码推送到服务端版本库。
本地仓库
用户机器上直接使用的的的版本库
分支(Branch)
分支是从主线分离出去的“副本”,可以独立操作而互不干扰,仓库初始化就有一个默认主分支master。
头(HEAD)
HEAD类似一个“指针”,指向当前活动 分支 的 最新版本。
提交(Commit)
把暂存区的所有变更的内容提交到当前仓库的活动分支。
推送(Push)
将本地仓库的版本推送到服务端(远程)仓库,与他人共享。
拉取(Pull)
从服务端(远程)仓库获取更新到本地仓库,获取他人共享的更新。
获取(Fetch)
从服务端(远程)仓库更新,作用同拉取(Pull),区别是不会自动合并。
冲突(Conflict)
多人对同一文件的工作副本进行更改,并将这些更改合并到仓库时就会面临冲突,需要人工合并处理。
合并(Merge)
对有冲突的文件进行合并操作,Git会自动合并变更内容,无法自动处理的冲突内容会提示人工处理。
标签(Tags)
标签指的是某个分支某个特定时间点的状态,可以理解为提交记录的别名,常用来标记版本。
master(或main)
仓库的“master”分支git登录,默认的主分支,初始化仓库就有了。Github上创建的仓库默认名字为“main”
origin/master
表示远程仓库(origin)的“master”分支
origin/HEAD
表示远程仓库(origin)的最新提交的位置,一般情况等于“origin/master”
2.2、工作区/暂存区/仓库
工作区、暂存区、版本库是Git最基本的概念,关系如下图:
工作区(Workspace)就是在电脑里能看到的代码库目录,是我们搬砖的地方,新增、修改的文件会提交到暂存区。
暂存区(stage或index) 用于临时存放文件的修改,实际上上它只是一个文件(.git/index),保存待提交的文件列表信息。
版本库/仓库(Repository /rɪˈpɑːzətɔːri/ 仓库)Git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录(版本)都在这里。就是工作区目录下的隐藏文件夹.git,包含暂存区、分支、历史记录等信息。
如上图,为对应本地仓库目录的结构关系。
2.3、Git基本流程(图)
Git的工作流程核心就下面几个步骤,掌握了就可以开始写Bug了。
2.4、Git状态(图)
Git在执行提交的时候,不是直接将工作区的修改保存到仓库,而是将暂存区域的修改保存到仓库。要提交文件,首先需要把文件加入到暂存区域中。因此,Git管理的文件有三(+2)种状态:
03、起步:Git安装配置
Git官网: 下载安装包进行安装。Git的使用有两种方式:
指令git –version查看安装版本号
$ git --version
git version 2.33.0.windows.2
复制代码
本文是在Windows 平台上完成的,不过这个对学习Git没什么影响。
3.1、Git的配置文件
Git有三个主要的配置文件:三个配置文件的优先级是① < ② < ③
#查看git配置
git config --list
git config -l
#查看系统配置
git config --system --list
#查看当前用户(global)全局配置
git config --list --global
#查看当前仓库配置信息
git config --local --list
复制代码
仓库的配置是上面多个配置的集合:
$ git config --list
$ git config -l
diff.astextplain.textconv=astextplain
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.name=Kanding
user.email=123anding@163.com
复制代码
3.2、配置-初始化用户
当安装Git后首先要做的事情是配置你的用户信息—— 告诉Git你是谁?配置 用户名、邮箱地址,每次提交文件时都会带上这个用户信息,查看历史记录时就知道是谁干的了。
配置用户信息:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 配置完后,看看用户配置文件:
$ cat 'C:UsersKwongad.gitconfig'
[user]
name = Kanding
email = 123anding@163.com
复制代码
3.3、配置-忽略.gitignore
工作目录中的文件并不是全都需要纳入版本管理,如日志、临时文件、私有配置文件等不需要也不能纳入版本管理,那该怎么办呢?
在工作区根目录下创建“.gitignore”文件,文件中配置不需要进行版本管理的文件、文件夹。“.gitignore”文件本身是被纳入版本管理的,可以共享。有如下规则:
#为注释
*.txt #忽略所有“.txt”结尾的文件
!lib.txt #lib.txt除外
/temp #仅忽略项目根目录下的temp文件,不包括其它目录下的temp,如不包括“src/temp”
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
复制代码
各种语言项目的常用.gitignore文件配置:github.com/github/giti…
04、Git的GUI工具们
如果不想用命令行工具,完全可以安装一个Git的GUI工具,用的更简单、更舒服。不用记那么多命令了,极易上手,不过Git基础还是需要学习了解一下的。
❓对于Git,建议用命令行,这样你才能真的理解Git的思想? ✔️其实都只是工具而已,适合自己的就是最好的git登录,没必要纠结,多写点Bug更重要!
4.1、SourceTree
SourceTree的官网 下载安装包,支持Window、Mac系统,按照提示完成安装。
4.2、TortoiseGit
TortoiseGit 官网下载安装包,及中文语言包,按照提示完成安装。小乌龟的Git是集成到操作系统里的,直接右键文件夹就可以进行Git操作了。
4.3、VSCode中的Git
VSCode自带的Git工具基本已经可以满足日常使用了,既有可视化功能,也能敲命令,习惯了不就不用安装其他GUI工具了。不过还是可以再安装一些VSCode插件,来增强Git功能。
05、Git使用入门5.1、创建仓库
创建本地仓库的方法有两种:
# 准备一个文件夹“KwebNote”作为仓库目录,命令行进入该文件夹
Kwongad@Kwongad-T14 MINGW64 ~
$ cd d:
Kwongad@Kwongad-T14 MINGW64 /d
$ cd Project_Files
Kwongad@Kwongad-T14 MINGW64 /d/Project_Files
# 多次cd指令进入到仓库目录KwebNote:“cd ”指令进入目录,“cd ..”返回上级目录(有空格)
Kwongad@Kwongad-T14 MINGW64 /d/Project_Files/github.kwong/KwebNote
# 开始初始化项目,也可指定目录:git init [文件目录]
$ git init
Initialized empty Git repository in D:/Project_Files/github.Kwong/KwebNote/.git/
复制代码
注意:Git指令的执行,都需在仓库目录下。
创建完多出了一个被隐藏的.git目录,这就是本地仓库Git的工作场所。
克隆远程仓库,如在github上创建的仓库“”
$ git clone 'https://github.com/kwonganding/KWebNote.git'
Cloning into 'KWebNote'...
remote: Enumerating objects: 108, done.
remote: Counting objects: 100% (108/108), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 108 (delta 48), reused 88 (delta 34), pack-reused 0
Receiving objects: 100% (108/108), 9.36 KiB | 736.00 KiB/s, done.
Resolving deltas: 100% (48/48), done.
复制代码
会在当前目录下创建“KWebNote”项目目录。
5.2、暂存区add
可以简单理解为,git add命令就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到仓库。
指令
描述
git add [file1] [file2]
添加文件到暂存区,包括修改的文件、新增的文件
git add [dir]
同上,添加目录到暂存区,包括子目录
git add .
同上,添加所有修改、新增文件(未跟踪)到暂存区
git rm [file]
删除工作区文件,并且将这次删除放入暂存区
# 添加指定文件到暂存区,包括被修改的文件
$ git add [file1] [file2] ...
# 添加当前目录的所有文件到暂存区
$ git add .
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
复制代码
修改文件“R.md”,未暂存:
执行git add .暂存:
5.3、提交commit-记录
git commit提交是以时间顺序排列被保存到数据库中的,就如游戏关卡一样,每一次提交(commit)就会产生一条记录:id + 描述 + 快照内容。
SHA1 是一种哈希算法,可以用来生成数据摘要 Git不适合大的非文本文件,会影响计算摘要、快照的性能。
多个提交就形成了一条时间线,每次提交完,会移动当前分支master、HEAD的“指针”位置。
Sourcetree上的历史记录:
一般情况,每完成一个小功能、一个Bu就可以提交一次,这样会形成比较清晰的历史记录。
指令:
指令
描述
git commit -m '说明'
提交变更,参数-m设置提交的描述信息,应该正确提交,不带该参数会进入说明编辑模式
git commit -a
参数-a,表示直接从工作区提交到版本库,略过了git add步骤,不包括新增的文件
git commit [file]
提交暂存区的指定文件到仓库区
git commit –amend -m
使用一次新的commit,替代上一次提交,会修改commit的hash值(id)
git log -n20
查看日志(最近20条),不带参数-n则显示所有日志
git log -n20 –oneline
参数“–oneline”可以让日志输出更简洁(一行)
git log -n20 –graph
参数“–graph”可视化显示分支关系
git log –follow [file]
显示某个文件的版本历史
git blame [file]
以列表形式显示指定文件的修改记录
git reflog
查看所有可用的历史版本记录(实际是HEAD变更记录),包含被回退的记录(重要)
git status
查看本地仓库状态,比较常用的指令,加参数-s简洁模式
通过git log指令可以查看提交记录日志,可以很方便的查看每次提交修改了哪些文件,改了哪些内容,从而进行恢复等操作。
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交所有修改到仓库
$ git commit -a -m'修改README的版权信息'
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
$ git log -n2
commit 412b56448568ff362ef312507e78797befcf2846 (HEAD -> main)
Author: Kanding
Date: Thu Dec 1 19:02:22 2022 +0800
commit c0ef58e3738f7d54545d8c13d603cddeee328fcb
Author: Kanding
Date: Thu Dec 1 16:52:56 2022 +0800
# 用参数“--oneline”可以让日志输出更简洁(一行)
$ git log -n2 --oneline
5444126 (HEAD -> main, origin/main, origin/HEAD) Update README.md
228362e Merge branch 'main' of github.com:kwonganding/KWebNote
复制代码
5.4、Git的“指针”引用们
Git中最重要的就是提交记录了,其他如标签、分支、HEAD 都对提交记录的“指针”引用,指向这些提交记录,理解这一点很重要。
上图中:
打开这些文件内容看看,就更容易理解这些“指针”的真面目了。
# tag
$ git tag -a 'v1' -m'v1版本'
$ cat .git/refs/tags/v1
a2e2c9caea35e176cf61e96ad9d5a929cfb82461
# main分支指向最新的提交
$ cat .git/refs/heads/main
8f4244550c2b6c23a543b741c362b13768442090
# HEAD指向当前活动分支
$ cat .git/HEAD
ref: refs/heads/main
# 切换到dev分支,HEAD指向了dev
$ git switch dev
Switched to branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev
复制代码
这里的主分支名字为“main”,是因为该仓库是从Github上克隆的,Github上创建的仓库默认主分支名字就是“main”,本地创建的仓库默认主分支名字为“master”。
“指针”引用:之所以用引号的“指针”,是为了便于统一和理解。和指针原理类似,都是一个指向,只是实际上可能更复杂一点,且不同的“指针”引用会有区别。
5.5、提交的唯一标识id,HEAD~n是什么意思?
每一个提交都有一个唯一标识,主要就是提交的hash值commit id,在很多指令中会用到,如版本回退、拣选提交等,需要指定一个提交。那标识唯一提交有两种方式:
通过git log、git reflog可以查看历史日志,可以看每次提交的唯一编号(hash)。区别是git reflog可以查看所有操作的记录(实际是HEAD变更记录),包括被撤销回退的提交记录。
$ git reflog -n10
5acc914 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~
738748b (dev) HEAD@{1}: reset: moving to HEAD~
9312c3e HEAD@{2}: reset: moving to HEAD~
db03fcb HEAD@{3}: reset: moving to HEAD~
1b81fb3 HEAD@{4}: reset: moving to HEAD~
41ea423 HEAD@{5}: reset: moving to HEAD~
d3e15f9 HEAD@{6}: reset: moving to d3e15f9
1b81fb3 HEAD@{7}: reset: moving to HEAD~1
41ea423 HEAD@{8}: reset: moving to HEAD~
d3e15f9 HEAD@{9}: reset: moving to HEAD~
复制代码
5.6、比较diff
git diff用来比较不同文件版本之间的差异。
指令
描述
git diff
查看暂存区和工作区的差异
git diff [file]
同上,指定文件
git diff –cached
查看已暂存的改动,就是暂存区与新版本HEAD进行比较
git diff –staged
同上
git diff –cached [file]
同上,指定文件
git diff HEAD
查看已暂存的+未暂存的所有改动,就是与最新版本HEAD进行比较
git diff HEAD~
同上,与上一个版本比较。HEAD~表示上一个版本,HEAD~10为最近第10个版本
git diff [id] [id]
查看两次提交之间的差异
git diff [branch]
查看工作区和分支直接的差异
☘️画个图更清晰些:
# 查看文件的修改
$ git diff README.md
# 查看两次提交的差异
$ git diff 8f4244 1da22
# 显示今天你写了多少行代码:工作区+暂存区
$ git diff --shortstat "@{0 day ago}"
复制代码
06、远程仓库
Git作为分布式的版本管理系统,每个终端都有自己的Git仓库。但团队协作还需一个中间仓库,作为中心,同步各个仓库。于是服务端(远程)仓库就来承担这个职责,服务端不仅有仓库,还配套相关管理功能。
可以用公共的Git服务器,也可以自己搭建一套Git服务器。
6.1、远程用户登录
Git服务器一般提供两种登录验证方式:
#查看当前远程仓库使用的那种协议连接:
$ git remote -v
origin git@github.com:kwonganding/KWebNote.git (fetch)
origin https://github.com/kwonganding/KWebNote.git (push)
# 更改为https地址,即可切换连接模式。还需要禁用掉SSL, 才能正常使用https管理git
git config --global http.sslVerify false
复制代码
远程用户登录:HTTS
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688