Git & GitHub
Last Update:
Git
Git 官网: https://git-scm.com
Git: 代码版本管理工具
- 版本控制系统
- 管理代码历史
- 跟踪代码变化
通过时间控制和跟踪代码变化1
Git 的工作方式
工作目录: 使用的项目文件都将由 git 管理的目录
- 第一次
commit
: 类似于快照, 将所有的文件保存下来 - 第二次
commit
: 只将有改动的文件内容保存下来, 而不是保存文件本身 - 当工作目录新增文件时
第三次commit
: 新增的文件将被保存
分支:
默认情况下, git 会将你的更改提交至 master
分支(main
分支)
当想要在主分支的基础上开发新的东西, 而不影响主分支的代码, 就需要用到分支
分支可以创建完全独立的工作目录, 是主分支的完整副本
分支可以合并至主分支
工作树:
1 |
|
在 git 管理的目录下会有有个 .git
的隐藏目录, 这个目录被称为 git 仓库
git 仓库包含两个不同的区域:
- 暂存区, 一个索引文件
- 可以将其看作是草稿区, 用于暂存代码的改变
- 对象文件夹, 包含不同的
commit
- 保存实际的文件和跟踪的改变
1 |
|
仓库初始化 和 提交 Commit
如果想要 git 管理工作目录, 需要初始化 git 仓库
1 |
|
将文件加入暂存区
1 |
|
提交至 git 仓库
1 |
|
如果没有为 git 配置用户名和邮箱, commit
会报错
1 |
|
查看提交信息
1 |
|
如果有多个 commit
, 而你想跳转到一个指定的 commit
先查看并复制 commit
的 id
然后:
1 |
|
当跳转到指定的 commit
用 git log
指令将不会看到指定 commit
后的 commit
但这并不意味着后面的 commit
被删除了
1 |
|
分支 Branches
创建的第一个分支, 默认名称为 master
1 |
|
创建分支
1 |
|
切换至指定的分支
1 |
|
在新建的分支 2 下git log
命令会显示与主分支一模一样的 commit
包括 commit
id
合并分支
将分支合并至主分支
1 |
|
新命令
新命令主要是功能与命令相契合, 便于理解和使用
如果使用的 git 版本 >= 2.23
就可以使用这些新命令
1 |
|
切换和创建分支
1 |
|
HEAD
使用 git log
我们会发现
在一些 commit
后面会有一个 (HEAD -> 分支1, 分支2, ...)
最后一次 commit
称之为 head
, 这是一个默认行为
1 |
|
分离 HEAD
HEAD
不关心分支, 只关心 commit
的 id
当一个 commit
不独属于一个分支时checkout
指定的 commit
id, 会引起 HEAD
分离, 即 detached HEAD
状态2
1 |
|
删除与撤销
删除跟踪的文件
从工作目录中删除跟踪的文件
1 |
|
撤消操作
当文件做出更改时, 你想将指定文件回到最后一次 commit
状态
1 |
|
新命令
等价于 git checkout -- <文件名>
:
1 |
|
删除未跟踪的文件
1 |
|
撤销提交到暂存区的文件
在将文件提交到暂存区后, HEAD
会指向暂存区
如果使用 git checkout
命令进行撤销, 将不会起作用
git reset
将文件的最新 commit
存放到暂存区
1 |
|
新命令
git reset
命令等价于:
1 |
|
Git Stash
基础使用
当你想保存当前代码进度而又不想提交或创建新分支时
你可以用到 git stash
git stash
的基本运用:
1 |
|
更多用法
列出多个 stash
:
1 |
|
创建 stash
时还可添加备注
1 |
|
如果想将 stash
中的内容加入到暂存区, 需要将其弹出
1 |
|
删除某个 stash
:
1 |
|
Git Reflog
如果误删一个提交或一个分支, 可使用 git reflog
恢复
需要注意, 恢复的有效期只有 30 天
1 |
|
恢复分支
1 |
|
合并分支
分支合并感觉稍微有点复杂, 使用使用时还需复习下
合并类型:
- 快进合并 (Fast Forward)
- 非快进合并 (Non Fast Forward)
- 递归合并
- . . .
快进合并
主分支不改动(即没有任何新的提交), 分支提交改变.
在这种情况下合并分支就被称为快进合并
1 |
|
这样的合并不会创建新的提交, 也就意味着 HEAD
会同时指向主分支和改变的分支
1 |
|
非快进合并(递归合并)
主分支有额外提交, 同时其他分支也有额外提交,
这个时候会用到非快速合并
使用非快速合并, 两个分支将会被合并为一个分支, 并添加至主分支
1 |
|
Git Rebase
rebase
不是移动提交, 而是创建新的提交
注意: 不要在你的本地仓库外 rebase 提交
1 |
|
rebase
通过检测两个分支的同一个起点, 然后基于同一个起点,
将其他分支的进度创建至主分支
合并冲突
有很多潜在的合并冲突, 最容易想到的是不同分支的同一个文件的同一个位置被同时修改导致的合并冲突
当发生合并冲突时, 发生冲突的文件会显示冲突的细节
如果使用 VS Code, VS Code 会给出四个选项来处理冲突:
- 不接受合并改变 (Accept Current Changes)
- 接受合并后的改变 (Accept Incoming Changes)
- 接受两个改变 (AcceptBoth Changes)
- 比较变化 (Compare Changes)
当然, 也可以手动删除你不想要的冲突, 然后将文件添加到暂存区,然后提交(合并)
1 |
|
要解决冲突, 就是手动删除你不想要的冲突, 然后 add ./
, 然后 commit
合并, Rebase, Cherry Pick 的比较
Cherry Pick
假设这么一种情况, 如果你的主分支出现一些代码上的拼写错误, 而你在分支上修复了它
现在, 你只想将修复了的提交合并至主分支,而不是分支上的所有修改, 这个时候就可以用到 cherry-pick
1 |
|
cherry-pick
复制提交, 并生成一个新的提交 ID
1 |
|
总结
Git 标签 (git tag)
假设我们的 Git 仓库有很多提交, 其中有些提交是一些代码的最终版本(比如版本 1.0, 版本 2.0 …)
我们可以通过添加 Git 标签来快速定位到这些提交
标签类型:
- 轻量标签
- 注释标签 (完整的 tag 对象)
1 |
|
进入标签标记的提交
1 |
|
GitHub
GitHub 官网: https://github.com
GitHub:
- 最大的开发平台
- 云托管与云协作的服务商
- Git 存储库的托管服务商
概念
- 本地仓库 git
- 远程仓库 GitHub
远程仓库可以是 GitHub 或其他代码托管平台(比如 Gitea, Gitlab….)
1 |
|
1 |
|