这篇博客是从扔物线大神的Git掘金小册上小结下来的,想了解更多内容请去掘金购买
版本控制系统的核心
版本控制/主动提交/中央仓库
分布式版本控制系统和中央式的区别
中央式的版本控制系统:保存版本信息/同步团队代码
分布式:通过本地仓库来保存版本信息,中央仓库用来同步代码,不过依然会保存版本信息,但这份历史版本更多的是作为团队间的同步中转站。
分布式版本控制系统(VCS)的优缺点
优点
- 大多数操作是在本地进行,速度更快,且不用联网。
- 可以分布提交代码,可以把代码提交做得更细,而不是一个提交包含很多代码。导致难以回溯(review)
缺点
- 由于每个机器都有完整的本地仓库,所以初次获取(
Git
:clone
)会比较耗时。 - 由于每个机器都有完整的本地仓库,所以本地存储会比中央式要高。
Git最基本的工作模型
- 从GitHub/Gitee把中央仓库clone到本地(
git clone
) - 把写完的代码提交
git add 文件
把文件添加到缓存区git commit
提交到本地仓库- 在此过程中使用
git status
来查看工作目录的状态 - 每个文件有“change/unstaged”(已修改)/“staged”(已修改并暂存)/“commited”(已提交)/“untracked”(未追踪)
- 提交一次或多次后,把本地提交
push
到中央仓库(git push
)
Git中的引用
- HEAD:当前commit的引用
- branch 分支
- master默认的branch
branch
- 创建
branch
(git branch branch1xx
) - 切换
branch
(git checkout branch1xx
) - 创建并切换到
branch
(git checkout -b branch1xx
) - 删除
branch
(git branch -d branch1xx
)
扔物线大神的小结:
1. HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新的 commit 。
2. branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。…
3. master 是 Git 中的默认 branch,它和其它 branch 的区别在于
- 新建的仓库中的第一个 commit 会被 master 自动指向;
- 在 git clone 时,会自动 checkout 出 master。
4. branch 的创建、切换和删除:
- 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称(创建后自动切换);
- 切换的方式是 git checkout 名称;
- 删除的方式是 git branch -d 名称。
merge: 合并commits
- 适用场景
- 合并分支
pull
的内部操作
- 放弃解决冲突,取消
merge
(git merge --abort
)
扔物线大神的小结
1. merge 的含义:从两个 commit「分叉」的位置起,把目标 commit 的内容应用到当前 commit(HEAD 所指向的 commit),并生成一个新的 commit;
2. merge 的适用场景:
- 单独开发的 branch 用完了以后,合并回原先的 branch;
- git pull 的内部自动操作。
3. merge 的三种特殊情况:
- 冲突
原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;
应对方法:解决冲突后手动 commit。
- HEAD 领先于目标 commit:Git 什么也不做,空操作;
- HEAD 落后于目标 commit:fast-forward。…
Feature Branching:最流行的工作流
- 核心内容:
- 任何新功能或者bug修复都创建新的
branch
来写/ branch
写完后,合并到master
,然后删掉这个branch
。
- 任何新功能或者bug修复都创建新的
git add . 直接将工作目录下的所有改动全部放进暂存区。
git log 查看历史记录
参数配置:
- git log -p
查看详细历史
- git log --stat
查看简要统计
- git show
查看具体的commit
- git diff
查看未提交的内容
git rebase 改变commit序列的基础点
git rebase 目标基础点
rebase是站在需要被rebase的commit上进行操作的,这点和merge不同
commit –amend 对最新的一条commit进行修正
注意:commit --amend
不是直接修改原commit
内容,而是生成一条新的commit
rebase -i 交互式rebase
使用方式是 git rebase -i 目标commit;
在编辑界面中指定需要操作的 commits 以及操作类型;
操作完成之后用 git rebase –continue 来继续 rebase 过程。
撤销最新的提交
git reset --hard 目标commit
撤销不是最新的请求
- 用
git rebase -i
在编辑界面中删除想撤销的 commits - 用
git rebase --onto
在 rebase 命令中直接剔除想撤销的 commits
方法有两种,理念是一样的:在 rebase 的过程中去掉想撤销的 commit,让他它消失在历史中。