一小时git教程
https://www.bilibili.com/video/BV1HM411377j
安装和配置
下载地址:https://git-scm.com/
- 查看一下版本,确保安装成功
1 | git -v |
- 配置一下用户名和邮箱
1 | git config --global user.name "Dongyun Xue" |
- 用下面这个命令来保存用户名和密码,就不用每次都输入了
1 | git config --global credential.helper store |
- 查看git的所有信息
1 | git config --global --list |
省略(Local):只对本地仓库有效
–global:全局配置,所有仓库生效
–system:系统配置,对所有用户生效
新建仓库
- 创建一个仓库
1 | # 当前文件夹创建仓库 |
工作区域和文件状态
工作区域:
- 工作区:电脑上实际的文件
- 暂存区:一种临时存储区域,保存即将提交到仓库的修改内容
- 本地仓库:包含完整的项目历史和元数据
文件状态:
- 未跟踪:没被git管理
- 未修改:已被git管理,但是没有变动
- 已修改:已被git管理,发生变动了,还没提交到暂存中
- 已暂存:已被git管理,发生变动了,提交到暂存中
添加和提交文件
命令 | 说明 |
---|---|
git status | 查看仓库状态 |
git add | 添加到暂存区 可以使用通配符,例如: git add *.txt 也可以使用目录,例如: git add . |
git commit | 提交 只提交暂存区中的内容,不会提交工作区中的内容 |
git log | 查看提交记录 可以使用**–oneline**参数来查看简洁的提交记录 |
git reset回退版本
git reset三种模式:
git reset –soft
git reset –hard
git reset –mixed(默认参数)
1 | git log |
soft和mixed:当我们提交了多个版本,但是觉得没什么意义,就可以用soft或者mixed将之前的所有提交精简为一个版本。唯一的区别的就是mixed要先git add一下
hard:谨慎操作,不过如果出问题了也可以回退
先查看一下操作记录,找到误操作前的版本号:
1
2
3
4
5 $ git reflog
2de4fd4 (HEAD -> master) HEAD@{0}: reset: moving to 2de4
50fac56 HEAD@{1}: commit: commit 3
2de4fd4 (HEAD -> master) HEAD@{2}: commit: file2.txt
fd474d1 HEAD@{3}: commit (initial): commit1回退到之前的版本:
1 $ git reset 50fac
git diff查看文件差异
- 什么参数都不加,默认查看工作区和暂存区之间的差异
1 | $ git diff |
- 工作区与版本库之间的差异
1 | git diff HEAD |
- 暂存区与版本库之间的差异
1 | git diff --cached |
- 两个版本之间的差异
1 | git diff 833ff b291a |
HEAD~
表示HEAD的上一个父亲提交,HEAD~~
表示HEAD的上两个父提交,依次类推
HEAD^
只能表示HEAD的上一个父亲提交,如果上一次有很多父提交(比如合并操作),HEAD^1
代表第一个,HEAD^2
代表第二个,以此类推
使用git rm删除文件
方法一:直接删除文件,再提交
1 | rm file1.txt |
方法二:使用git rm命令
1 | git rm file1.txt # 工作区和暂存区,同时删除 |
gitignore忽略文件
1 | # .gitignore |
注意:已经被添加到版本库中的文件,会继续被追踪。假如之前已经提交过other.log
,后面它将无法被忽略
解决方法:使用git rm
从暂存库中删除它
1 | git rm --cached other.log # 从暂存区删除,工作区不删除 |
1 | # 忽略.a文件,除了lib.a |
SSH配置和克隆
我们在github上建立一个仓库后,使用SSH的方式clone,会发现没有权限
- 使用SSH的方式,必须先配置SSH的密钥
1 | $ git clone git@github.com:pigeon-dove/learngit.git |
回到用户根目录,进入.ssh目录,使用ssh-keygen -t rsa -b 4096
命令来生成SSH密钥
1 | $ cd ~/.ssh |
如果像上面那样改了名字的话,在~/.ssh/config
文件中加上如下配置即可
- 意思:当访问github.com的时候,指定使用以下文件的密钥
1 | # github |
复制公钥文件id_rsa_2.pub
中的值,到github的个人设置中
现在可以正常clone了
1 | git clone git@github.com:pigeon-dove/learngit.git |
关联本地仓库和远程仓库
在github上创建一个空仓库,将它和本地已有的仓库关联起来
使用git remote add <shortname> <url>
添加远程仓库
1 | git remote add origin git@github.com:pigeon-dove/firsti-repo.git |
现在,我们在github上创建一个README.md,模拟远程仓库改动的情况。我们现在可以拉取远程仓库
1 | git pull # 拉取远端服务器 |
注意:
- 执行git pull,会自动帮我们执行一次合并操作,没有冲突则合并成功。有冲突需要手动处理。
- git fetch命令,只是获取远程仓库修改,并不会自动合并到本地仓库中
分支简介和基本操作
- 创建一个新的分支
1 | git branch dev |
- 查看所有分支,*表示当前所在分支
1 | git branch |
- 切换到别的分支
1 | # git checkout命令还可以用来恢复文件或目录,到之前的一个状态。如果文件和分支名称一样,会默认切换分支,出现歧义 |
- 在dev分支进行修改并提交,切回main分支。切换分支的时候,工作区也会发生变化。
1 | git switch main # 工作区会变,之前在dev分支上的修改不见了 |
- 合并指定分支,到当前分支中(git会帮我们进行一次提交)
1 | git merge dev |
- 查看分支情况
1 | $ git log --oneline --decorate --all --graph |
- 删除一个分支(如果这个分支,已经被合并到别的分支)
1 | $ git branch -d dev |
- 强制删除一个分支(如果这个分支,还没有被合并到别的分支)
1 | $ git branch -D dev |
解决合并冲突
- 如图,创建feat分支后,main分支和feat分支对同一个文件进行了修改
1 | $ git log --graph --oneline --all |
- 尝试合并分支,提示冲突
1 | $ git merge feat |
- git status查看冲突的文件列表
1 | $ git status |
- git diff查看冲突的具体内容
1 | $ git diff |
- 手工编辑冲突的文件,然后提交即可
1 | git commit -a -m "merge conflit" |
- 如果不想合并分支,也可以终止合并
1 | git merge --abort |
回退和rebase
- 使用merge:在main分支上合并两个分支
- 使用rebase:当前分支上的提交,嫁接到指定分支后面,变成一条直线
实战如下:
- 之前dev分支已经被我们删除了,我们要先恢复dev分支
1 | * 02a6da7 Merge branch 'dev' |
- 恢复dev分支,到某一个状态(并进入dev分支中)
1 | git checkout -b dev 739daae |
- 将main分支回退到
main:5
的时间点
1 | git reset --hard 0a463e2 |
1 | * 0a463e2 (HEAD -> main) main:5 |
- 进行变基操作,dev分支的修改嫁接在main分支上了(反之亦然)
1 | $ git switch dev |
优缺点:
Merge
- 优点:不会破坏原分支的提交历史,方便回溯查看
- 缺点:会产生额外提交节点,分支图会比较复杂
Rebase
- 优点:不会新增额外的提交记录;线性历史,比较直观
- 缺点:会改变提交历史(请避免在共享分支时,使用变基)
分支管理和工作流程
GitFlow模型
main和dev分支长期存在,其他分支合并后可以删除
主线/基线分支:main
- 会被部署到生产环境
- 不允许直接修改,只能通过合并分支的方式来修改
- 每次合并都生成一个新的版本号
问题修复分支:hotfix
- 用于修复线上的问题
- 修复完成后合并会主分支
- 命名规则:hotfix-#issueid-desc
- 更新一个小版本号
开发分支:develop
- 长期存在
功能分支:feature
从dev分支分离出来,最后合并回开发分支
用于开发新的分支
命名例子:feature-login-page
预发布分支:release
- 发布前的测试和验证
- 从dev分支中分离出来
- 稳定后,合并回main分支和dev分支
GitHubFlow模型
分支命名:
- 版本发布分支/Tag示例:v1.0.0
- 功能分支实例:feature-login-page
- 修复分支示例:hotfix-#issueid-desc
分支管理:
- 定期合并已经成功验证的分支,及时删除已经合并的分支
- 保持合适的分支数量
- 为分支设置合适的管理权限
- 标题: 一小时git教程
- 作者: 布鸽不鸽
- 创建于 : 2024-04-10 20:34:10
- 更新于 : 2024-01-10 14:54:10
- 链接: https://xuedongyun.cn//post/24535/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。