Git基本使用
目录
序言
Git是什么
Git: 世界上最先进的 分布式版本控制系统
什么是版本控制系统
什么是版本控制
版本控制是在日常开发过程中用来对代码或文件进行规范的整合和管理,可实现备份、查看或更改历史记录,以及在需要时
恢复到之前的某一个版本。
版本控制的种类
版本控制分为集中式版本控制和分布式版本控制。
集中式版本控制:
所有的版本数据都存在中央服务器上,用户的本地只有自己以前所同步的版本,当需要修改时需从中央服务器获取最新版本,修改完再提交给中央服务器。
缺点:容易出现单点故障问题,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。
代表产品:SVN、CVS、VSS
分布式版本控制:
每一个用户电脑上都有完整的版本库,所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据。
代表产品:GitHub(基于Git的代码管理平台)、Gitee(基于Git的代码管理平台)、gitlab(代码托管工具,可以自己搭建代码托管仓库)
Git安装
官网链接 Git
安装流程可参考 Git - 安装 Git
Git使用
1.用户信息配置
配置用户名
git config --global user.name "User name"
配置用户邮箱
git config --global user.email "User Email"
存储配置
git config --global cretential.helper store
查看配置
git config --list
2.创建仓库(两种方式)
进入要管理的文件夹, 鼠标右键选择`Git Bash Here`, 在命令框输入 初始化命令 进行初始化, 会在当前路径下创建`.git`隐藏文件夹, 该文件夹存储所有的该文件夹的版本信息及配置
-
将尚未进行版本控制的本地目录转换为 Git 仓库(加上
,则会在当前目录下创建一个新的文件夹转换为仓库) git init <project name>
-
克隆一个远程仓库(从github等远程服务器克隆一个远程仓库)
git clone <url> #url--**URL(统一资源定位符)是指网络地址,**它用于在互联网上定位和访问资源。URL的组成部分包括资源类型、主机名、端口号、路径、参数和查询信息。它在浏览器的地址栏中显示,用户可以通过点击超链接或直接输入URL来访问网页。
3.工作区域和文件状态
四个区域
工作区(Working Directory)——在电脑上实际看到的目录
暂存区(Stage/Index)——暂存区也叫索引,用来临时存放准备提交的内容,一般在.git目录下的index中
本地仓库(Repository)——本地的Git版本库,仓库信息存储在.git这个隐藏目录中
远程仓库(Remote Repository)——托管在远程服务器上的仓库。常用的有GitHub、Gitee
文件状态
未跟踪(Untrack)——新创建还未被Git管理起来的文件
未修改(Unmodified)——已经被Git管理起来内容未变化的文件
已修改(Modified)——已修改的文件,还未添加到暂存区的文件
已暂存(Staged)——修改后,添加到暂存区的文件
main/master #默认主分支
origin #默认远程仓库
HEAD #指向当前分支的最新提交
HEAD~ #指向上一次提交
HEAD^ #指向上一次提交
HEAD~{n} #指向上n个提交,如HEAD~{3}表示上3个提交
特殊文件
.gitignore #忽略文件,不需要提交到仓库的文件
4.添加和提交文件
添加文件到暂存区
git add <file> #添加一个文件到暂存区
git add . #添加所有文件到暂存区
提交所有暂存区的文件到本地仓库
git commit -m "message" #"message"用来指定提交到本地仓库的信息(名称)
# 不指定 -m "message" 会进入交互界面编辑提交信息
提交所有已修改的文件到本地仓库
git commit -am "message" #"message"用来指定提交到本地仓库的信息(名称)
# 等同于:
git commit -a -m "message"
5.查看状态或差异
状态
查看仓库状态, 列出还未提交的新的或修改的文件
git status
显示 Git 仓库中已跟踪文件的列表,包括已暂存和已修改的文件
git ls-files
查看提交历史记录(--oneline表示简介模式)
git log --oneline
查看操作历史记录
git reflog
查看当前仓库对应的远程仓库的别名
git remote -v
查看配置
git config --list
查看分支图
git log --graph --oneline --decorate --all
差异
比较工作区和暂存区的差异
git diff
比较工作区和最新提交的差异
git diff HEAD
比较暂存区和最新提交的差异
git diff --cached
比较两个版本的差异
git diff <commit-id> <commit-id>
#<commit-id>(版本号)可以使用HEAD(当前最新提交)、HEAD~/HEAD^(上一个版本)、HEAD~{n}(上<n>个版本)来代替
6.撤销和恢复
恢复
重置当前分支的HEAD为之前的某个提交, 并且删除所有之后的提交
git reset --soft <commit-id> #重置当前分支的HEAD为之前的某个提交, 并且删除所有之后的提交(--soft参数表示重置暂存区)
git reset --hard <commit-id> #重置当前分支的HEAD为之前的某个提交, 并且删除所有之后的提交(--hard参数表示重置工作区和暂存区) (需谨慎使用)
git reset --mixed <commit-id> #重置当前分支的HEAD为之前的某个提交, 并且删除所有之后的提交(--mixed参数表示重置工作区)
如果误操作可进行回溯:
1.首先使用git reflog
查看一下操作的历史记录,找到误操作之前的版本号
2.然后使用git reset --hard <commit-id>
回退到需要恢复的版本号即可
删除
注意点:删除后还需使用git commit -m "message"
或git commit -am "message"
命令更新一下版本库
git rm <file> #从工作区和暂存区删除一个文件, 并且将这次删除放入暂存区
git rm --cached <file> #从暂存区中删除文件, 但是本地工作区文件还在, 只是不希望这个文件被版本控制
7.远程仓库(GitHub)
GitHub是代码托管平台, 公共开发的免费, 私有的协同的需要租赁
远程仓库的基本使用
注册GitHub账号
官网链接 GitHub
注册按流程就行,可参考 10.注册GitHub账号_哔哩哔哩_bilibili
SSH配置
生成公钥和私钥
ssh keygen -t rsa -b 4096
# -t rsa |指定密钥类型为RSA|
# -b 4096 |指定密钥长度为4096位|
# 第一次使用此命令,一路回车使用默认值即可(如果使用过,则需输入新文件名以免将之前创建的密钥覆盖掉)(密码无需设置)
# 默认放在 ~/.ssh目录下,第一次使用,如未输入新文件名,则默认为 id_rsa.pub (公钥)、id_rsa (私钥)
将公钥( id_rsa.pub 文件下的内容)复制到远程主机:
“settings” > “SSH and GPG Keys” > “new SSH Key” > 填上Title(如ubuntu_acer) > 在Key文本框里粘贴pub
文件的内容 > “Add Key”
Note: GitHub允许添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以通过ssh在每台电脑上往GitHub推送了
关联本地仓库和远程仓库
GitHub官网创建一个新的repository后出现的提示:
在创建本地仓库后执行:
git remote add origin 远程仓库地址 # git remote add <remote-name> <remote-url>
# 添加一个远程仓库
# Git默认<remote-name>为origin,也可以改为其他别名
git branch -M main #指定分支的名称为main,可省略
git push -u origin mian:mian # git push -u <remote-name> <branch-name>:<remote-name>
# -u (upstream) 把本地仓库和别名为origin的仓库关联起来
# main:main 把本地仓库的main分支推送给远程仓库的main分支,两者名称相同,可省略为 main
远程仓库命令
克隆一个远程仓库
git clone <remote-url> #从指定地址克隆一个远程仓库
git clone <remote-url> --depth <number> #当需要克隆的仓库文件很大时,可以使用 --depth <number> 指定想要克隆的最新number次提交
添加远程仓库
git remote add <remote-name> <remote-url> # Git默认<remote-name>为origin,也可以改为其他别名
查看远程仓库
git remote -v
远程仓库的拉取
git pull <远程仓库名> <远程分支名>:<本地分支名>
# 从远程仓库拉取代码。仓库名和分支名省略,则默认拉取远程仓库名origin的master或者main分支。
# git pull 是 git fetch 和 git merge 的组合。它不仅会下载远程仓库的更新,还会自动尝试将这些更新合并到当前分支。如果有冲突,则需要手动解决
git fetch <remote> #从远程仓库获取最新代码和分支信息,但不会自动合并到本地分支
远程仓库的推送
git push <远程仓库名> <远程分支名>:<本地分支名>
# 推送代码到远程仓库。
8.分支
分支命令
查看所有本地分支, 当前分支前面会有一个星号*, -r查看远程分支, -a查看所有分支
git branch
创建一个新的分支
git branch <branch name>
切换当前所在分支(两种)
git switch <branch name> #推荐使用,防止出现歧义
git checkout <branch name> #(checkout命令还可用于恢复文件或目录到之前的某一个状态)(出现歧义时默认切换分支)
切换到指定分支,并更新工作区,将指定分支恢复到某一次提交的状态
git checkout -b <branch name> <commit-id>
合并分支(将分支交叉处之后的所以当前所在分支的提交内容变基(移动)到指定分支的最新提交内容后面
git merge <branch-name> # <branch-name>为想要合并的另一个分支 #不指定 -m "message" 会进入交互界面编辑提交信息
# 1.需切换到想要合并到的分支上(一般是主分支)
# 2.执行命令将指定分支合并到所在分支
# 优点:不会破坏原分支的提交历史,方便回溯和查看
# 缺点:需执行1次额外的提交,分支图比较复杂
线性合并分支
git rebase <branch name> # <branch name> 为想到合并到的另一个分支
# 1.需切换到想要合并的分支
# 2.执行命令将所在分支合并到指定分支
# 优点:无需新增额外的提交记录,形成线性历史,比较直观和干净
# 缺点:会改变提交历史(!需避免在共享分支上进行rabase操作)
删除分支
git branch -d <branch name> #删除一个已经合并的分支
git branch -D <branch name> #删除一个分支, 不管是否合并
中断合并
git merge --abort
合并冲突
两个分支未修改同一个文件的同一个位置:Git自动合并
两个分支修改了同一个文件的同一个位置:产生冲突(Git无法判断保留哪一个分支的修改)
解决方法:
1.手动修改冲突文件,合并冲突内容
2.将文件添加到暂存区
3.提交修改,此时分支自动合并完成
终止合并:当不想继续执行合并操作时可以使用一些命令来终止合并过程:
git merge --abort
9.其他
.gitignore忽略文件
让Git不再管理当前目录下的某些文件
1.在仓库的根目录创建 .gitignore 文件
2.在 .gitignore 文件中依据Git的忽略规则添加对应的规则,(从上到下逐行匹配,每一行表示一个忽略模式)
*.a # 忽略所有的 .a 文件
!lib.a # 在第一条规则的基础上,仍跟踪所有的 lib.a 文件,即使在前面已经忽略了 .a 文件
/TODO # 只忽略当前目录下的 TODO 文件
build/ # 忽略任何目录下的名为 build 文件夹
doc/*.txt # 仅忽略 doc 目录下的所有 .txt 文件,但不忽略它的子目录下的 .txt 文件
doc/**/*.txt # 忽略 doc 目录及其所有子目录下的 .txt 文件
忽略以前提交的文件
由于Git 只能忽略尚未提交到仓库的未被追踪的文件,如果在使用.gitignore文件添加忽略某个文件的规则之前已经提交了这个文件,此时再添加对应的规则Git将无法忽略此文件,需要执行以下操作:
1.执行git rm --cached <file>
命令从版本控制中移除该文件
2.更新 .gitignore 文件以确保 Git 不会在将来重新跟踪这个文件
3.使用git commit -am "message"
命令提交更改
在VSCode中使用Git
在扩展中搜索GitLens插件并安装(推荐使用),安装完即可使用Source Control(资源管理器)查看和修改文件
文件状态:
参考链接
什么是版本控制,常用的版本控制系统有哪些? - zero_song - 博客园