介绍Git的常用操作,分享学习资料。
文章目录
学习资源
先学习Git的工作流,熟悉Git的操作,即可完成大部分操作。想要深入的同学可以继续学习git的文件内容及原理和Git的官方教材。
b站视频:git基础以及工作流
b站视频:git文件内容及原理
书籍:Git官方教材
练习:练习地址
安装配置
下载
官网下载对应系统的安装包,默认安装即可。
配置信息
使用前需要配置用户信息:
- 配置账号:
git config --global user.email "常用邮箱地址"
- 配置邮箱:
git config --global user.name "用户名"
- 查看配置:
git config --global --l
如果需要使用GitHub或Gitee建议配置一下ssh免密连接:
- 生成密钥对:
ssh-keygen -t rsa
- 将生成的公钥(
C:\User\账户名\.ssh\id_rsa.pub
)添加到GitHub的SSH keys中即可。
如果GitHub访问慢,可以配置代理(注意clone时需要使用HTTPS的链接):
git config --global http.https://github.com.proxy socks5://127.0.0.1:1086
git config --global https.https://github.com.proxy socks5://127.0.0.1:1086
基础操作
创建仓库
通常有两种创建方式:
- 在本地直接创建Git仓库:
git init
,创建后会生成一个.git的隐藏文件保持文件信息(以.开头的文件通常是配置文件,默认不可见)。 - 克隆GitHub上的项目:
git clone 链接
,克隆默认命名的项目。如果需要改变项目名,可以使用git clone 链接 新项目名
保存文件
Git有三个分区:工作区、暂存区和本地库。
- 工作区是当前可见的文件夹
- 暂存区用于暂存提交文件
- 本地库用于保存提交记录
比较难理解的是处于中间态的暂存区,明明只需要将工作区的文件提交到本地库就可以实现版本控制了,为什么需要一个暂存区呢?其主要作用是方便提交。如果没有暂存区,若编码时修改了多处,在提交时需要一次性打上所有文件,容易出错。而暂存区的存在则方便我们多次添加文件,确认无误后再提交。
Git会检测工作区文件的增、删和修改情况,输入git status
可以查看。当代码编写完要保存时,先将需要保存文件添加到暂存区git add filenames
,确认后无误后提交到版本库git commit -m “注释”
,提交后会生成一次记录。若要查看提交记录,可以输入git log
。
.gitignore
Git默认会去监管所有文件,而有些文件我们并不关心(例如日志输出),调用git status
会输出这些我们不关心的文件信息,十分繁琐。可以通过配置.gitignore
文件解决这一问题。
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了.a文件
!lib.a
# / 在最前面表示只对根目录有效
# / 在最后面表示是文件夹
/data/ # 忽略根目录下的data文件夹
data/ # 忽略所有的data文件夹
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
分支
分支相当于一个指针,指向提交记录上的一个节点,方便定位版本库中的提交记录。而在多人开发中,其最大的优势是减少冲突。每个成员在自己的分支上开发,可以暂时忽略其它成员的存在,只有在开发结束需要合并时才需要考虑冲突。
创建分支:git branch 分支名
切换分支:git checkout 分支名
创建并切换分支:git checkout -b 分支名
移动分支:git branch -f 分支名 目标commit
查看分支:git branch
合并分支:git merge 副分支名
,先切换到主分支,再合并副分支
删除分支:git branch -d 分支名
远程仓库
首先需要绑定上远程仓库git remote add 仓库别名 链接
,绑定后可以查看远程仓库信息git remote -v
。常用操作是拉取git fetch
和推送git push
。
拉去并合并:git pull
推送并绑定分支: git push -u 仓库别名 分支名
,绑定后可用git push
推送。
标签
给比较重要的commit打上标签,方便检索:git tag -a 标签名 -m 注释
删除标签:git tag -d 标签名
列出标签:git tag
推送标签:git tag origin 标签名
推送所有标签:git push --tags
进阶操作
修改操作
用版本库恢复文件:git restore 文件名
错误add文件后,取消添加:git restore --staged 文件名
将分支移动到对应版本:git reset --soft 版本号
,用于修改提交
用版本库覆盖暂存区:git reset 版本号
,用于修改提交
用版本库覆盖工作区:git reset --hard 版本号
,用于丢弃修改
修改上一次提交:将暂存区设置成需要的提交,再输入git comit --amend
,相当于git reset --soft HEAD~
和git commit
用于版本回退(复制老节点):git revert 版本号
修改提交记录
变基:通过嫁接的方式,使得合并记录保持线性。(只能在本地使用,不能变基以提交到远端的记录)
- 将副分支接到主分支:
git rebase 主分支 副分支
- 压缩提交:
git rebase -i HEAD~4
,修改最新的4个分支(可以将其压缩成一个)
挑选:可以挑选指定需要的节点,适合多种分支合并,保留最关键的节点。
- 挑选需要的记录:
git cherry-pick 版本号1 版本号2 ...
分离头指针
当HEAD直接指向commit时,称为分离头指针的状态:git checkout 版本号
描述头指针的位置信息:git describe
,默认当前的HEAD位置
相对引用
横向相对引用:^
表示上一层的横向第一个(爸爸),^2
上一层的横向第二个(妈妈)
纵向相对引用:~
表示上一层的第一个(爸爸),~2
上2层的第一个(爷爷)
可以叠加:bugFix ~^2
bugFix分支的奶奶
临时保存
checkout到其它分支时,要求当前工作区干净。可以使用commit
提交也可以使用stash
临时保存
保存:git stash push
恢复:git stash pop
帮助:git stash -h
工作流
- 在本地创建库
- 在远端创建库
- 完成绑定,并做第一次提交
- 两个常在分支:main、dev
- 开发新特性:由dev创建出feature,在feature上开发(推荐开发完一个部分就提交,全部完成后做变基保持简洁)
- 开发完后切换到dev分支,先做拉取,再做合并,再提交
- 如果5的开发过程中遇到bug,就先暂存一下当前工作区,再切到main上创建bugFix,修复完bug再回到feature继续工作
练习解答
基础篇
# 1. 连续提交2次
git commit
git commit
# 2. 创建分支
git branch bugFix
git checkout bugFix
# 合并 git checkout -b bugFix
# 3. 合并分支
git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix
# 4. 变基
git checkout -b bugFix
git commit
git checkout main
git commit
git rebase main bugFix
高级篇
# 1. 分离HEAD
git checkout c4
# 2. 相对位置
git checkout bugFix^
# 3. 移动分支
git branch -f main c6
git checkout HEAD~
git branch -f bugFix HEAD~
# 4. 撤销提交
git reset main
git checkout pushed
git revert pushed
自由修改提交树
# 1. 采取
git cherry-pick c3 c4 c7
# 2. 当链条变基
git rebase -i overHere
杂项
# 1. 挑选提交
git checkout main
git cherry-pick bugFix
# 2. 修改提交
git rebase -i main
git commit --amend
git rebase -i main
git branch -f main caption
# 3. 修改提交
git checkout main
git cherry-pick newImage
git commit --amend
git cherry-pick caption
# 4. 打标签
git checkout HEAD~
git tag v0 HEAD~
git tag v1 HEAD
# 5. 位置描述
# git describe 可以查看当前的位置
git commit
多次rebase
# 1. 多次rebase
git rebase bugFix
git rebase main side
git rebase side another
git branch -f main another
# 2. 连续相对定位
git branch -f bugWork main~^2~
# 3. 挑选(好像只有cherry-pick可以复制)
git checkout one
git cherry-pick c4 c3 c2
git checkout two
git cherry-pick c5 c4 c3 c2
git branch -f three c2
远程仓库
# 1. 克隆
git clone
# 2. 提交
git commit
git checkout o/main
git commit
# 3. 拉取
git fetch
# 4. 拉取&合并
git pull
# 5. 综合
git clone
git comit
git fakeTeamwork 2
git pull
# 6. 提交
git commit
git commit
git push
# 7. 拉取&合并&提交
git clone
git commit
git fakeTeamwork
git pull --rebase
git push
# 8.创建分支&提交
git checkout -b feature
git push
git branch -f main HEAD~
困难提交
# 1. 提交
git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main # 这个比git bracn -f 快
git push
# 2. 拉取&合并&提交(这题只要合并,不需要和图一模一样)
git checkout main
git pull
git merge side1
git merge side2
git merge side3
git push
# 3. 不同名字的对应(不推荐)
git chckout -b side o/main
git commit
git pull -rebase
git push
# 4. 直接提交
git push origin main
git push origin foo
# 5. 不对应分支名推送(不推荐)
git push origin foo:main
git push origin main~:foo
# 6. 拉取不按名称(不推荐)
git fetch origin foo:main
git fetch origin main~:foo
git checkout foo
git merge main
# 7.删除和创建分支
git push origin :foo
git fetch origin :bar
# 8. 拉取合并
git pull origin bar:foo
git pull origin main:side