作为一个码代码的小白,人人都应该使用版本控制工具来管理自己的代码,这样才能有条不紊的
写bug写代码
理论知识部分(嫌麻烦的直接拉到最下面实践部分)
版本控制系统的核心
版本控制/主动提交/中央仓库
分布式版本控制系统和中央式的区别
中央式的版本控制系统:保存版本信息/同步团队代码
分布式:通过本地仓库来保存版本信息,中央仓库用来同步代码,不过依然会保存版本信息,但这份历史版本更多的是作为团队间的同步中转站。
分布式版本控制系统(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
)
扔物线大神的小结:
- HEAD 是指向当前 commit 的引用,它具有唯一性,每个仓库中只有一个 HEAD。在每次提交时它都会自动向前移动到最新的 commit 。
- branch 是一类引用。HEAD 除了直接指向 commit,也可以通过指向某个 branch 来间接指向 commit。当 HEAD 指向一个 branch 时,commit 发生时,HEAD 会带着它所指向的 branch 一起移动。...
- master 是 Git 中的默认 branch,它和其它 branch 的区别在于
- 新建的仓库中的第一个 commit 会被 master 自动指向;
- 在 git clone 时,会自动 checkout 出 master。
- branch 的创建、切换和删除:
- 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称(创建后自动切换);
- 切换的方式是 git checkout 名称;
- 删除的方式是 git branch -d 名称。
merge: 合并commits
- 适用场景
- 合并分支
-
pull
的内部操作
- 放弃解决冲突,取消
merge
(git merge --abort
)
扔物线大神的小结
- merge 的含义:从两个 commit「分叉」的位置起,把目标 commit 的内容应用到当前 commit(HEAD 所指向的 commit),并生成一个新的 commit;
- merge 的适用场景:
- 单独开发的 branch 用完了以后,合并回原先的 branch;
- git pull 的内部自动操作。
- 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,让他它消失在历史中。
实践部分
创建本地仓库
git init
将本地仓库关联到远端仓库
git remote add origin git@github.com:michaelliao/learngit.git
提交本地更新并提交到远端仓库
git add . //提交本地所有
git commit -m 'commit'
git push -u origin master
p.s. 这里可能有同学会问怎么提交所有文件但又忽略某些文件呢?
可以通过修改.gitignore 文件
文件来过滤你不要上传的文件
具体场景分析
本地提交的分支覆盖到远端主分支上 如何回退远端分支呢
- 通过
git log
查看本地提交记录 - 通过
git reset --hard <id>
重设本地的记录为之前某一时刻的记录 - 通过
git push -f origin master
强制覆盖远端分支 - 这时候你想保留之前自己本地的记录可以使用
git relog
查看自己的记录 -
git reset --hard <id>
修改本地记录为之前保存的本地记录即可
参考资料:抛物线大佬的git小册
如果朋友们还是不太理解清楚,可以自己动手实验一下,古语有云:“好记性不如烂笔头”,祝大家都有所收获。
Git在线练习地址