Git
经典的 Git 代码托管平台:
- Github:全球最大的代码托管平台
- Gitlab:全球最大的开源代码托管平台,项目的所有代码都是开源的,便于在自己的服务器上完成 Gitlab 的搭建。
- Gerrit:由 Google 开发的一个代码托管平台,Android 这个开源项目就托管在 Gerrit 上。
Git 区域
用户在工作区修改之后,输入命令
git add .
将修改的内容提交到缓存区(staging area),再输入命令
git commit -m "some description"
将修改的命令提交到本地仓库。
Git 目录
创建初始 git 项目:
git init
查看初始 git 项目目录:
git add 之后,会在 .git 中生成一个 object :
git commit 之后,会在 .git 中再生成两个 object :
Objects:
在 Git 中,object 是指 Git 存储的一些数据对象,包括 blob、tree、commit 和 tag 四种类型。它们分别用于存储文件内容、目录结构、提交信息和标签信息等。
- blob: 存储文件内容,每个文件对应一个唯一的 blob 对象。
- tree: 存储目录结构,包含多个 blob 和 tree 对象,可以形成树形结构。
- commit: 存储一次代码提交的信息,包括作者、提交时间、变更说明等,可以形成提交历史链。
- tag: 存储标签信息,可以用于标识某个特定的提交,例如版本发布或里程碑等。
这四种类型的数据对象,相互联系。
可以通过 commit 找到 tree 再找到 blob ,在 blob 中包含了文件内容。
Tag 标签一般表示的是一个稳定版本。
通过 git tag 命令生成 tag .
通过 git tag -a 命令生成附注标签的创建:
修改历史版本
-
git commit --ament修改最近一次的commit message.这种方法通过新建一个新的 object 的方式实现,但是没有删除旧的 object ,所以会导致产生无用的 object 的。
通过
git log可以看到两次--amend操作修改了 commit 块:查看未使用的 Object (悬空的 Object):
git fsck --lost-found
当然也可以通过 `Git GC` 来清理不用的 Object.
-
rebase
通过
git rebase -i HEAD~3可以最近三个commit message进行修改。 -
filter - branch
该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作。
代码合并
Fast-Forward
不会产生一个 merge 节点,合并后保持一个线性历史,如果 target 分支有了更新,则需要通过 rebase 操作更新 source branch 后才可以合并。
Three-Way Merge
三方合并,会生成一个新的 merge 节点。
主干分支尽量保持整洁,使用 fast-forward 合入方式,合入前进行 rebase。