Git 是一种分布式的版本控制系统。
Note
- 版本控制,顾名思义可以记录历史,并在需要时回退.
- 分布式的概念是多了一个本地仓库,每一个本地仓库都存在所有的版本,过程中无需联网提交(但是到最后还是要把代码提交到中央仓库)。
add#
add 的作用是把工作区
改变的代码提交到暂存区
,以监听文件内部的改变
git add <文件>
文件状态由 “未跟踪
” 变成 “已暂存
”
Warning
add 添加的为文件改变而非文件本身!
快速 add#
暂存所有文件
git add .
commit#
commit 的作用是将暂存区
的代码提交到本地仓库
。
git commit
快速 commit#
git commit -m <提交信息>
push#
将本地提交到远程仓库,本质其实是将当前的分支连同它路径上的commit
一并提交到远程仓库
git push <主机名> <分支名>
快速 push#
提交本地所有分支。
git push
log#
commit 完成之后你你就成功完成了一次提交,现在查看一下刚刚提交的 commit ,这里记录了 commit 的 SHA-1,提交的作者,提交时间
git log
查看内容变动的 log#
显示详细的文件内容变动。
git log -p
查看简单的 log#
只显示文件变化统计。
git log --stat
show#
只查看当前 commit 信息#
git show
查看某一条 commit 信息#
git show SHA-1
查看某一条 commit 信息中的文件#
git show SHA-1 <文件>
pull#
git pull
其实是 git fetch
和 git merge
的集合,
拉取目标 branch 的所有 commit 和当前的 commit 合并生成一个新的 commit。
git pull <主机名> <分支名>
pull 操作在一定程度上会帮你自动合并:
- 如果一个分支改了 A 文件,另一个分支改了 B 文件,合并之后两个文件都会改。
- 如果一个分支改了 A 文件第一行,另一个分支改了 A 文件第二行,合并之后 A 文件第一行和第二行也都改了。
- 是如果一个分支改了 A 文件第一行,另一个分支也改了 A 文件第一行,这就出问题了,需要手动解决一下冲突。
冲突解决完毕之后需要重新 add、commit,这个时候发现 git 会自动帮我们填好了 log 信息,提交就可以。
branch#
git 和其他版本控制系统的主要区别就是 git 有branch
的概念,意思翻译为分支,实质为 commits 的引用。
引用
相当于 commit 的快捷方式,我们看到每一个commit
都有一个 SHA-1 的加密值,这个值重复率极低,低到我们可以用前几个值来代替,比如我们可以用7800ba
来代表上一次的 commit,后面的HEAD -> master
、github/master
也是指向这个 commit 的引用。
HEAD:当前分支的引用#
当前分支的引用指的是当前工作目录
对应的commit
,当你有提交的时候,HEAD 也会自动指向当前的commit
。总之,当前commit
在哪里,HEAD
就在哪里,你永远可以用HEAD
来操作当前commit
branch:分支#
HEAD
除了可以引用commit
,也可以引用一个branch
,在指向branch
的时候,间接的指向了对应的commit
,当前分支被提交的时候,HEAD
拉着对应的branch
一起移动。
main:默认 branch#
main 分支是项目在被 clone 下来的时候默认创建的。
Note
所有的 branch 都是平等的。
branch 的操作#
创建 branch#
git branch <分支名>
切换 branch#
git checkout <分支名>
这样是不是有点麻烦,我们可以把两步合在一起:
创建一个分支并立即切换过去。
git checkout -b <分支名>
删除 branch#
git branch -d <分支名>
Note
- 删除时要切换到其他 branch 进行删除
- 删除 branch 只是删除对 commit 的引用,所在 branch 的提交并没有删除
- 没有合并过 master 的分支删除失败(出于安全考虑),换成大写-D
就可以了
工作流 Branching#
市面上最流行的工作流
- 假如有一个项目需要你开发功能,于是你在项目上新建了一个分支
git checkout -b zhang
- 开发完毕之后你可以推送到远程分支上去:
git add .
git commit -m "开发完成"
git push origin zhang
- 然后你告诉同事说可以 review 一下你的代码,同事说可以,所以你同事就:
git pull
git checkout zhang
- 同事说看了没问题,可以合并到 master。 于是你就把 zhang 合并到 master 上去。 如果同事说有问题,你可以修改代码重复流程
2
。
git checkout master
git pull
git merge zhang
最后推送到远程仓库并删除本地 / 远程分支:
git push
git branch -d zhang
git push origin -d zhang