文章目录
git三剑客
概要
本篇文章基于极客时间中苏玲老师的《玩转git三剑客》完成
课程资料:https://gitee.com/geekbang-courseware/Git-Learning
一、Git基础
安装Git
**官方下载网址:**https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
-
Windows:
开 https://git-scm.com/download/win,下载会自动开始
-
Linux:
centos等RPM发行版:sudo yum install git-all
Ubuntu等Debian发行版:sudo apt install git-all
-
MacOS
下载网址 https://git-scm.com/download/mac
下载后解压安装包,双击bkg文件即可安装
验证安装
git --version
配置信息
配置user.name和user.email
git config --global user.name ‘your_name’
git config --global user.email ‘your_email’
注意:这里的email是为了可以联系到你,当代码出现问题可以直接发邮件通知你
config三个作用域
-
配置config
git config --local 只对当前仓库有效
git config --global 对当前用户的所有仓库有效
git config --system 对系统所有用户有效(极少用)
-
显示config信息
git config --list --local 如果当前位置没有创建git仓库,则会报错
git config --list --global
git config --list --system
创建仓库&&local信息
-
创建仓库
mkdir git_project && git init git_project && cd git_project 创建一个新文件,用来学习git相关命令
-
配置local信息
git config --local user.name ‘owl’
git config --local user.email ‘owl@163.com’
-
对比local和global信息是否一致(结果明显不一致)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2b55fgKL-1670468434100)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211100914631.png)]
-
创建一个文件,将文件提交到根部
echo ‘hello git’>> README.txt 创建README.txt文件,然后将hello git内容写入
git add README.txt 将文件写入到暂存区
git commit -m"add README.txt" 提交commit -m是描述信息
-
**git log:**查看log日志
git log
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PCzfUKT-1670468434101)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211100943859.png)]
footer{
right: 0;
bottom: 0;
position: relative;
padding: 10px 1rem 10px 0;
margin-top: 50px;
font-size: 0.7em;
text-align: right;
}
footer p{
margin-bottom:0;
}
简单认识工作区、暂存区
该部分用到相关资料,在资料链接中可以获取。通过四次提交代码来不断完善一个静态页面,从而理解工作区暂存区
- 加入index.html和git-log
- 加入style.css
- 加入script.js
- 修改index.html和style.css
1.生成git文件
-
创建git文件&& 初始化git文件
mkdir git_learning && git init git_learning && cd git_learning
-
拷贝index.html和image文件到该目录下
cp …/data_git/index.html.01 index.html
cp …/data_git/images . -r
浏览器打开:file:///home/user/git_learning/index.html 显示一下效果即为成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2tNwTGJ-1670468434102)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101432337.png)]
-
将文件提交到暂存区&& 提交代码到仓库
git add index.html
git add image/
git commit -m “add index.html&&image”
-
查看状态 && 查看log日志
git status
git log
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LrDfROwe-1670468434102)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101437479.png)]
-
2.加入style.css
-
拷贝文件到路径下
mkdir styles
cp …/data_git/styles/style.css.01 styles/style.css
-
刷新界面即可看到页面变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5F8YaVX-1670468434103)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101441231.png)]
-
-
将代码添加到暂存区&& 提交到仓库 && 查看日志
git add styles/
git ci -m “add styles”
git log
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8tpYgE0-1670468434104)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101444168.png)]
3.加入js文件
-
拷贝文件 && 查看效果
cp …/data_git/js -r .
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muOJ5p0z-1670468434105)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101448276.png)]
-
提交文件到暂存区&& 提交到仓库 && 查看日志
git add js/
git ci -m"add js"
git log
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNzn82z8-1670468434106)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101450824.png)]
4.修改文件
-
修改index.html文件,打开该文件,最后加入一下代码
<footer> <p> <a href="https://github.com/TTN-js/unforGITtable">参考项目01</a> </p> </footer>
-
修改style.css文件,最后加入一下代码
footer{ right: 0; bottom: 0; position: relative; padding: 10px 1rem 10px 0; margin-top: 50px; font-size: 0.7em; text-align: right; } footer p{ margin-bottom:0; }
-
提交代码(这里就不截图了,实现的效果是添加了参考文献,显示在页面右下角位置,自行测试吧)
git add -u
git ci -m"update code"
重命名
-
git mv命令
git mv README.txt README.md
git ci -m"changh name" 改完名字记得提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNNX6gd8-1670468434107)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101510593.png)]
log-版本演进
-
基本命令
git log 查看当前分支提交日志
git log --all 查看所有分支提交日志
git log --online 查看简介的提交日志
git log --n4 查看近四条日志
git log --all --graph 查看所有分支提交日志,并且显示分支详情
-
分支基本命令
git branch -av 查看有哪些分支
git checkout -b branch_name version_id 创建新分支:branch_name为分支名字,xxx为版本号,从哪个地方创建分支
git branch -b branch_name realy_branch_name 这里-b后面跟着创建的分支名,以及基于哪个已存在的分支创建分支
git branch -d branch_name 删除分支
git checkout branche_name 切换分支
-
部分演示
[user@localhost git_learning]$ git log --oneline 61c5e33 (HEAD -> temp) checkout index.html e956d0b add js 391fdd0 add styles c39af74 add index.html && image
[user@localhost git_learning]$ git log --all --graph * commit 61c5e33d112e54759ff51dee9eb1fc744b5c5d50 (HEAD -> temp) | Author: ronghaili <ronghaili.work.com> | Date: Fri Nov 11 10:22:56 2022 +0800 | | checkout index.html | | * commit dddb933a4d1a6f3ea483d406b203ce5e7434677f (master) | | Author: ronghaili <ronghaili.work.com> | | Date: Thu Nov 10 15:09:40 2022 +0800 | | | | changh name | | | * commit 5ab7e21666d123e7ff63ea81eb18d8b650af0c81 |/ Author: ronghaili <ronghaili.work.com> | Date: Thu Nov 10 15:08:16 2022 +0800 | | add readmi | * commit e956d0b4a585ef13255cdedd9b2a0199264b7e00 | Author: ronghaili <ronghaili.work.com> | Date: Thu Nov 10 14:49:51 2022 +0800 | | add js | * commit 391fdd0c1acc576f32fd12459ade35e5b89875ac | Author: ronghaili <ronghaili.work.com> | Date: Thu Nov 10 14:43:36 2022 +0800 | | add styles | * commit c39af74c4a4e764da490f5070eaaddc3fffb14af Author: ronghaili <ronghaili.work.com> Date: Thu Nov 10 14:36:45 2022 +0800
.git文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmFGcNR9-1670468434108)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211111221046.png)]
重点文件
-
config
记录的是local的配置信息,可用于修改相关配置
-
HEAD
记录的是指向当前分支的引用,具体内容在.git/refs文件加中
-
refs
存放的是分支信息,分支中保存最新的commit对象
-
objects
存放的是git对象信息
查看命令
git cat-file -t object_id 查看对象类型
git cat-file -p object_id 查看对象内容
git三大对象
Git对象
Git有三大对象:commit(提交对象)、tree(树对象)、blob(数据对象);所有对象都保存在.git/objects文件夹中
-
commit:是提交时的一个快照,记录着提交时的所有文件快照
-
tree:可以理解为一个文件夹,包含tree和blob对象
-
blob:一个具体文件,包含文件的内容
注意:
blob和自身文件名没有任何关系,只与文件内容相关,即文件相同在git中只有一份blob;
在文件被存放在缓存区,就会自动生成一个blob对象。当进行commit提交,就会生成tree(如果提交存在目录的话)和commit对象
分离头指针
-
进入分离头指针
git checkout version_id 使用版本号进入分离头指针
[user@localhost git_learning]$ git checkout e956d0b 注意:正在切换到 'e956d0b'。 您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换 回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。 如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令 中添加参数 -c 来实现(现在或稍后)。例如: git switch -c <新分支名> 或者撤销此操作: git switch - 通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议 HEAD 目前位于 e956d0b add js
-
含义
分离头指针状态就是 当前处于没有分支的状态;在这种状态下可以继续commit操作,对其他分支没有影响
-
缺点
在分离头指针状态下做的一些提交,当切换到新的分支后,有可能git会默认为垃圾清理掉
-
应用场景
想做一些尝试性的变更,这样可以随时丢弃掉,无需做其他操作,直接切换到新分支就可以
-
进入分离状态,HEAD值指向commit引用
[user@localhost git_learning]$ git cat-file -t 59daf57784 commit
-
离开分离头指针,同时保存提交记录,可以根据提示创建分支
[user@localhost git_learning]$ git checkout master 警告:您正丢下 1 个提交,未和任何分支关联: 59daf57 Backgroud to green 如果您想要通过创建新分支保存它,这可能是一个好时候。 如下操作: git branch <新分支名> 59daf57 切换到分支 'master' [user@localhost git_learning]$ gitk --all [user@localhost git_learning]$ git branch fix_css 59daf57 [user@localhost git_learning]$ git branch -av fix_css 59daf57 Backgroud to green * master dddb933 changh name temp 61c5e33 checkout index.html
HEAD && branch
branch
-
创建分支
git branch -b branch_name realy_branch_name 这里-b后面跟着创建的分支名,以及基于哪个已存在的分支创建分支
diff
-
查看不同
git diff version_id version_id
git diff HEAD HEAD^ 这里的HEAD表示当前提交的信息,HEAD^表示他的上一次提交
HEAD
-
指向问题
当处于分离头指针状态,HEAD指向一个commit对象
当处于某个分支,HEAD指向某个分支,分支本质也是指向某个commit对象
错误演示
-
添加文件后直接commit
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6nrHHH76-1670468434110)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211100931640.png)]
二、git应用场景
删除分支
-
普通删除
git branch -d branch_name
-
强制删除
git branch -D branch_name
commit–修改
- 修改最近的commit
git commit --amend
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3VGV40G-1670468434111)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211151431784.png)]
-
修改旧的commit
使用的到的命令
git rebase -i branch_id
-
首先查看log日志确认修改哪一个分支的commit
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHsCpedL-1670468434112)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190911747.png)] -
使用命令
[owl@owl learning_git]$ git rebase -i 324c28046bdae
执行命令会弹出一下窗口个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRlbHzdm-1670468434112)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190914236.png)]
这里我们将之前的commit信息:a update index.html 改为 update index.html,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vc23geEA-1670468434113)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190916085.png)]
退出该窗口后,会弹出另一个页面,同样修改第一行commit的信息为最新的commit信息,然后退出就完成了commit的修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0bq40WD-1670468434114)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190918870.png)] -
修改commit后,除了commit信息发生了改变,其修改commit的分支到最新的分支的分支id也会变化,对比如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pEu55GH-1670468434114)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190923938.png)]
commit–整合
-
连续多个合并为一个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XuR7mN9a-1670468434115)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190933279.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RsiIf1T-1670468434115)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190935030.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ai50bUUf-1670468434116)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190938860.png)]
修改完输入 wq!退出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lC4A6BS-1670468434116)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211190954824.png)]
-
把间隔的几个commit整合到一起
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTBdQedc-1670468434117)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191006089.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTsqDHEP-1670468434117)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191005229.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwS5deXZ-1670468434118)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191008189.png)]
文件比较
-
暂存区 VS HEAD
git diff --cached
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2xwaw1WE-1670468434118)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191021811.png)]
-
暂存区 VS 工作区
git diff
-
比较某个文件的区别
git diff – file_name --cached
-
比较几个commit的差异
git diff branch1_name branch2_name – file_name 比较两个分支中某个文件的差异
git diff branch_id branch_i --file_name
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9NYy3CA-1670468434119)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211641920.png)]
文件恢复
- 暂存区恢复与HEAD一致
git reset HEAD
git reset HEAD – file_name
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Or6S5R7o-1670468434120)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191728675.png)]
- 工作区恢复与暂存区一致
git checkout file_name
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8CEGSdr-1670468434120)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211191734669.png)]
消除最近几次提交
git reset --hard 慎用
正确删除文件
-
方式一
rm -rf file_name
git rm file_name
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UC6AztY-1670468434121)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211646973.png)]
-
方式二
git rm file_name
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CfK8aD1-1670468434122)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211649581.png)]
处理紧急任务
临时保存修改中的git,处理完紧急任务恢复
git stash 将临时修改隐藏起来
git stash list 查看stash 中的记录
git stash pop 将隐藏的文件取出来 同时删除该记录
git stash apply 将隐藏的文件取出来 保留记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2q89QVp-1670468434122)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211658411.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f4hJYdFh-1670468434123)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211211658586.png)]
无需提交文件
创建文件.gitignore
注意,如果是过滤文件夹的话,文件夹名后面需要夹/
备份
其他
-
git reset --hard
比如我们想将暂存区的文件全部清理掉,可以使用该命令
git reset --hard
git ci -am"描述" 添加到暂存区&&提交到仓库
特别注意,这命令是会清理掉暂存区所有文件,谨慎使用
-
效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKoynwF0-1670468434124)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211101525002.png)]
-
三、Git与GitHub
注册GitHub
配置公私钥
- centos端
检查是否存在.ssh文件
cd ~/.ssh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCqX0jKL-1670468434124)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221939817.png)]
生成一个新的公私钥
ssh-keygen -t 4096 -C “you email”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v03uuPWJ-1670468434125)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221942872.png)]
查看公私钥
ls -la
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qZerzHjP-1670468434125)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221943633.png)]
获取公钥
cat id_rsa.pub
-
github 端
找到ssh添加key
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mL0FYCBP-1670468434126)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211221945502.png)]
github创建个人仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WATG1FFs-1670468434127)(https://gitee.com/owl_eye/image-bed/raw/master/img/202211222033371.png)]
本地仓库同步到GitHUb
- 添加远程版本库
git remote add [name] [url] 添加远程版本库
git remote -v 显示所有远程仓库
git remote rm [name] 删除远程仓库
name:自定义远程仓库名
URL:远程ssh地址
[owl@owl learning_git]$ git remote add origin git@github.com:PyGriffin/learning_git.git
[owl@owl learning_git]$ git remote -v
github git@github.com:PyGriffin/learning_git.git (fetch)
github git@github.com:PyGriffin/learning_git.git (push)
2.远端存在本地不存在的文件,首先要拉取远端的数据
git pull origin
git branch -av 显示线上线下所有分支
git merge origin/master 合并master分支
git push origin
[owl@owl learning_git]$ git merge origin/master
自动合并 README.md
冲突(添加/添加):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。
[owl@owl learning_git]$ vi README.md