1.git 介绍
git 是一个分布式的版本控制系统, 版本控制系统一般分为集中式控制系统和分布式控制系统,如下所示:
集中式版本控制系统存在单点故障问题,也就是server
坏了,就会导致其他客户端无法访问或者工作
分布式版本控制系统不会存在单点故障问题,因为么个客户端都存了一份完整的版本备份,如下所示:
2.git的安装和初始化设置
2.1 git的安装
查看git官网,安装完后通过
git --version #查看git版本信息
2.2 git的使用方式
2.3 git 配置命令
# --global 全局配置,所有仓库生效 常用
# --system 系统配置, 对所有用户生效
git config --global user.name 'liam' # 如果后面有空格需要加引号
git config --global user.email 'pingfang_dlut@163.com'
git config --global credential.helper store #可以不用保存输入的用户名和密码
git config --global --list # 查看设置的配置信息
3.新建仓库
3.1 方式1:
git init # 在某个文件夹下创建仓库,在该文件夹下会有一个.git文件夹 如果删除.git 会导致版本管理失败
git init my-repo #后可以加文件夹的名称
3.2 方式2:
通过git clone
方式,下载远程的代码文件
4. 工作区域和文件状态
git的工作区域分为工作区、暂存区、本地仓库,如下所示:
工作区就是实际操作的目录,暂存区就是一个中间区域,用于临时存放即将提交的内容,本地仓库是git
存储代码和版本信息的主要位置
5. 添加和提交文件
5.1 git status
命令
用于查看当前分支有哪些文件以及这些文件当前处在怎样的状态,例如新建一个文件file1.txt,查看当前分支的状态,如下所示:
5.2 git add 命令
通过git add
命令使得文件被添加到暂存区
git add *.txt # 可以将以txt为结尾的文件添加到暂存区
git add . # 可将当前文件夹下所有文件添加到暂存区
5.3 git commit 命令
可通过git commit
将暂存区中的文件添加到本地仓库,不会将没有添加到暂存区中的文件添加到本地仓库, 例如在当前的情况下,暂存区中只有一个file1.txt
,新建一个file2.txt
,则file2.txt
是未被跟踪的,使用git commit
不会将file2.txt
提交到本地仓库,如下所示:
5.4 git log 命令
查看仓库提交历史信息,可以使用–oneline 参数来查看简介的提交记录
6. git reset 命令
git reset的三种模式,具体如下所示:
举例说明各种模式的场景,新建三个文件file1.txt,file2.txt,file3.txt,每个文件按顺序做如下操作
复制3份该文件夹,具体如下所示:
6.1 验证soft参数
首先先进入repo-soft文件夹里面,执行
git reset --soft 30fabce # 回退到第二次提交的版本
30fabce (HEAD -> master) commit2
4c47b1b commit1
(END)
6.2 验证hard参数
执行如下的命令行:
git reset --hard HEAD^ # HEAD^ 代表当前分支的前一个版本
ls # 查看到了file3.txt已经不见了
git ls-files # 可查看暂存区中的文件 ,暂存区中的文件不存在了
6.3 验证mixed参数
git reset HEAD^ # HEAD^ 代表当前分支的前一个版本
ls # file3.txt仍然存在
git ls-files # 可查看暂存区中的文件, 暂存区中的文件不存在
git 中所有的命令都是可以回溯的,可以通过
git reflog # 查看操作的历史记录
git reset --hard 版本号 # 回退到指定版本
7.git diff 查看差异
7.1 工作区之间的差异比较
7.1.1 git diff(工作区和暂存区之间的比较)
git diff 默认显示的是工作区和暂存区之间的差别,如下图所示:
使用git diff 查看工作区和暂存区之间的差别
7.1.2 git diff 提交的commit版本号(工作区和版本库之间的比较)
HEAD 表示最新的版本号, 由于还没有做提交的动作,因此工作区和版本库之间的区别和工作区与暂存区之间的区别一致
7.1.3 git diff —cached(暂存区和版本库之间的比较)
使用命令
git add . # 将工作区的file3.txt文件加入暂存区
git diff # 查看下工作区和暂存区之间的差异,会发现没有任何输出,因为提交到暂存区了
git diff HEAD # 可以看到有输出内容,因为工作区和版本库还是不一致
git commit -m 'commit4' # 提交暂存区的内容到版本库
git diff HEAD # 发现不会有任何输出
git diff --cached # 也不会有任何的输出
7.2 版本之间的差别
git diff 版本号1 版本号2 文件名 # 查看版本之间文件之间的区别
git diff HEAD~2 HEAD # 查看当前版本和当前版本回退两次的版本之间的差异区别
7.3 分支之间的差异
git diff 分支1 分支2 #查看分支之间的差异
8. git rm 删除文件
8.1 直接删除文件
使用rm 命令
rm -rf file3.txt # 删除file3.txt文件
git status # 查看文件的状态,显示已删除
git add . # 将删除记录更新到暂存区
git status # 查看文件的状态 显示已经更新到暂存区,提示要加入本地版本库
git commit -m 'commit5' # 将删除记录更新到本地版本库
git status # 提示无需任何提交
8.2 git rm 命令
#使用git rm 命令将文件删除,会删除工作区的文件,也会删除暂存区中的文件,版本库中还存在,因此需要提交一下
git rm file2.txt
git status # 查看文件的状态,显示是待提交的状态
git commit -m 'commit6' # 提交文件
总结
9. .gitignore文件
一般要忽略哪些文件呢,具体如下所示:
9.1 普通文件的忽略
新建两个文件,将其中一个文件名加入到.gitignore中,查看两次文件的状态,具体如下所示:
可以看到access.log没有加入到版本库中
9.2 通配符文件的忽略
可以利用通配符*.log
匹配以.log
结尾的文件,如下所示
9.3 文件夹的忽略
git默认对空的文件夹是不会接管的,在文件夹中新建文件,然后查看文件的状态,然后再将文件名temp/
加入到.gitignore
中,查看文件的状态,具体如下所示:
执行commit
命令,可以看到暂存区是没有temp/
及相关的文件的
9.4 .ignore文件的匹配规则
具体的例子
github
上提供了很多gitignore
文件的忽略模版,传送门
10.SSH配置和克隆仓库
首先在github上创建仓库,新建仓库后,可以根据提示把本地的仓库和远程的仓库关联起来,如下所示:
注意到上面有HTTPS和SSH方式,HTTPS方式需要验证用户名和密码,而SSH方式不需要验证用户名和密码,但需要github或其他托管平台配置SSH公钥,注意HTTPS方式在github
上在2021年8月份就禁止使用了。
10.1 生成秘钥
cd ~
cd .ssh
ssh-keygen -t rsa -b 4096 ### 直接回车(之前没有生成过秘钥)可在.ssh目录下生成id_rsa 和 id_rsa.pub文件
打开id_rsa.pub
文件,将文件内容复制到
添加成功如下所示
2.3 章节设置的用户名和邮箱无需和github登录的用户名和邮箱一致
注意如果之前生成过秘钥的话,在执行
ssh-keygen -t rsa -b 4096 # 不要点击回车,需要输入一个名字,例如test,然后再输入密码,此时在.ssh文件夹中不止会有id_rsa、id_rsa.pub文件,也会有test 和test.pub文件
在.ssh
文件夹下的config
文件中添加如下内容
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/test
在执行git clone命令时,可能会输入密码,这是输入在生成秘钥时的密码即可。
11.关联本地仓库和远程仓库
首先在github上创建一个仓库,然后选择一个本地仓库和远程仓库进行关联,具体如下所示:
git push
命令是将本地仓库中的分支推送到远程仓库的分支
git pull
命令是将远程仓库中的数据拉取下来并且合并到当前分支,有冲突需要解决冲突,git fetch
命令则不会合并远程拉取的分支到本地分支。在远程分支main
上,添加一个README.md文件,通过git pull
拉取数据,具体如下所示:
总结
# 添加远程仓库
git remote add 远程仓库别名 远程仓库地址
# 将数据推送到远程仓库
git push -u 远程仓库别名 分支名
# 查看远程仓库
git remote -v
# 拉取远程仓库内容
git pull 远程仓库名 远程分支名:本地分支名 #若两个分支名称相同可省略
12. Gitee的使用
首先将前面章节创建的公钥id_rsa.pub
文件中的内容添加到远程仓库的配置中,在gitee
创建一个仓库,将一个现有的项目和远程仓库关联起来,具体操作如下:
这里需要注意一个命令
git remote add 远程仓库别名 远程仓库地址 # 这里的别名一般是origin ,如果是其他的,在上传文件至远程仓库的时候需要指定远程仓库别名
13. git图形化工具
进入git
官网,可以看到GUI clients
,这里是git
锁支持的GUI
工具,如下图所示:
14. 在vscode 中使用git
略
15.分支简介和基本操作
使用gitKraken GUI工具
git branch # 查看本地分支情况,当前分支会用*表示
git branch dev # 创建一个dev分支,但不会切换到dev分支
git checkout dev # 切换到dev分支
git checkout -b stag # 创建一个stag分支并且切换到stag分支
git switch -c prod # 创建一个prod分支并且切换到prod分支
# 在GUI工具中的命令行执行下列命令
Ξ learn/learn-branch git:(main) ▶ echo main1 > main1.txt
Ξ learn/learn-branch git:(main) ▶ git add .
Ξ learn/learn-branch git:(main) ▶ git commit -m 'main1'
[main f3efd16] main1
1 file changed, 1 insertion(+)
create mode 100644 main1.txt
Ξ learn/learn-branch git:(main) ▶ echo main2 > main2.txt
Ξ learn/learn-branch git:(main) ▶ git add .
Ξ learn/learn-branch git:(main) ▶ git commit -m 'main2'
[main 0fec883] main2
1 file changed, 1 insertion(+)
create mode 100644 main2.txt
Ξ learn/learn-branch git:(main) ▶ echo main3 > main3.txt
Ξ learn/learn-branch git:(main) ▶ git add .
Ξ learn/learn-branch git:(main) ▶ git commit -m 'main3'
[main c27a5c2] main3
1 file changed, 1 insertion(+)
create mode 100644 main3.txt
Ξ learn/learn-branch git:(main) ▶ git branch
Ξ learn/learn-branch git:(main) ▶ git branch dev
Ξ learn/learn-branch git:(main) ▶ git switch dev
Switched to branch 'dev'
Ξ learn/learn-branch git:(dev) ▶ echo dev1 > dev1.txt
Ξ learn/learn-branch git:(dev) ▶ git add .
Ξ learn/learn-branch git:(dev) ▶ git commit -m 'dev1'
会出现如下界面:
在main分支上再新增两个文件,具体如下所示:
Ξ learn/learn-branch git:(main) ▶ echo main4 > mian4.txt
Ξ learn/learn-branch git:(main) ▶ git add .
Ξ learn/learn-branch git:(main) ▶ git commit -m 'main4'
[main 5deafda] main4
1 file changed, 1 insertion(+)
create mode 100644 mian4.txt
Ξ learn/learn-branch git:(main) ▶ echo main5 > main5.txt
Ξ learn/learn-branch git:(main) ▶ git add .
Ξ learn/learn-branch git:(main) ▶ git commit -m 'main5'
界面如下所示:
现在需要将dev分支合并到main分支中,具体操作如下:
# 在main分支下执行
git merge dev
操作结果如下所示:
# 命令行界面展示分支情况
git log --graph --oneline --decorate --all
git branch -d 分支名称 # 删除已经合并的分支
git branch -D 分支名称 # 强制删除分支
16.解决合并冲突
当两个分支中都对同一个文件中的同一处地方进行了修改,而这时,如果将两个分支合并,则会产生冲突,具体如下所示:
Ξ learn/learn-branch git:(main) ▶ git branch feat # 创建分支feat
Ξ learn/learn-branch git:(main) ▶ vim main1.txt # 打开main1.txt 修改第二行内容
Ξ learn/learn-branch git:(main) ▶ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main1.txt
no changes added to commit (use "git add" and/or "git commit -a")
Ξ learn/learn-branch git:(main) ▶ git commit -am 'feat1' # 提交本次修改到本地仓库
[main 28e2e7d] feat1
1 file changed, 1 insertion(+)
Ξ learn/learn-branch git:(main) ▶ git checkout main
Already on 'main'
Ξ learn/learn-branch git:(main) ▶ git checkout feat # 切换到feat分支
Switched to branch 'feat'
Ξ learn/learn-branch git:(feat) ▶ vim main1.txt # 打开main1.txt 也修改第二行内容
↑1 learn/learn-branch git:(feat) ▶ git commit -am 'feat1' # 提交本次修改到本地仓库
[feat 8c3ee39] feat1
1 file changed, 1 insertion(+)
Ξ learn/learn-branch git:(feat) ▶ git checkout main
Switched to branch 'main'
Ξ learn/learn-branch git:(main) ▶ git commit --amend # 重新提交一次记录,会覆盖之前的记录信息
[main 7172ea3] main1
Date: Wed Apr 24 23:34:57 2024 +0800
1 file changed, 1 insertion(+)
Ξ learn/learn-branch git:(main) ▶ git merge feat # 合并分支
Auto-merging main1.txt
CONFLICT (content): Merge conflict in main1.txt
Automatic merge failed; fix conflicts and then commit the result.
↑1 learn/learn-branch (git)-[main|merge] ▶ git diff
Ξ learn/learn-branch (git)-[main|merge] ▶ vim main1.txt # 解决冲突
Ξ learn/learn-branch (git)-[main|merge] ▶ git add .
Ξ learn/learn-branch (git)-[main|merge] ▶ git commit -m 'resolve conflict'
[main 681fa39] resolve conflict
Ξ learn/learn-branch git:(main) ▶
17.回退和rebase
rebase 俗称变基,主要功能是将某个分支合并到另一个分支上,和merge不同的是,会使得分支的提交记录变为一条直线;该种方式首先会找到两个分支的共同祖先节点main3,然后将共同祖先后至当前分支后的所有提交记录都rebase到目标分支上。
首先进行如下的操作,得到两份一样的仓库
分别执行
git switch dev
git rebase main
git switch main
git rebase dev
git merge 和git rebase 的比较
git merge : 优点 不会破坏原分支的提交历史,方便回溯和查看;缺点会产生额外的提交节点,分支图会比较复杂。
git rebase: 优点 不会新增额外的提交记录,形成线性历史,比较直观和干净; 缺点会改变提交历史,改变了当前分支的branch out 节点,避免在共享分支上使用。
其他有用的命令
# 可以切换到某个版本号,即使dev分支被删除了
git checkout -b dev 版本号
文章评论