Git入门

Git 是一种分布式的版本控制系统。

Note

- 版本控制，顾名思义可以记录历史，并在需要时回退.
- 分布式的概念是多了一个本地仓库，每一个本地仓库都存在所有的版本，过程中无需联网提交（但是到最后还是要把代码提交到中央仓库）。

add

add 的作用是把工作区改变的代码提交到暂存区，以监听文件内部的改变

Copy
git add <文件>

文件状态由 “未跟踪” 变成 “已暂存”

Warning

add 添加的为文件改变而非文件本身！

快速 add

暂存所有文件

Copy
git add .

commit

commit 的作用是将暂存区的代码提交到本地仓库。

Copy
git commit

快速 commit

Copy
git commit -m <提交信息>

push

将本地提交到远程仓库，本质其实是将当前的分支连同它路径上的commit一并提交到远程仓库

Copy
git push <主机名> <分支名>

快速 push

提交本地所有分支。

Copy
git push

log

commit 完成之后你你就成功完成了一次提交，现在查看一下刚刚提交的 commit ，这里记录了 commit 的 SHA-1，提交的作者，提交时间

Copy
git log

查看内容变动的 log

显示详细的文件内容变动。

Copy
git log -p

查看简单的 log

只显示文件变化统计。

Copy
git log --stat

show

只查看当前 commit 信息

Copy
git show

查看某一条 commit 信息

Copy
git show SHA-1

查看某一条 commit 信息中的文件

Copy
git show SHA-1 <文件>

pull

git pull 其实是 git fetch 和 git merge 的集合，
拉取目标 branch 的所有 commit 和当前的 commit 合并生成一个新的 commit。

Copy
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

Copy
git branch <分支名>

切换 branch

Copy
git checkout <分支名>

这样是不是有点麻烦，我们可以把两步合在一起：
创建一个分支并立即切换过去。

Copy
git checkout -b <分支名>

删除 branch

Copy
git branch -d <分支名>

Note

- 删除时要切换到其他 branch 进行删除
- 删除 branch 只是删除对 commit 的引用，所在 branch 的提交并没有删除
- 没有合并过 master 的分支删除失败（出于安全考虑），换成大写-D就可以了

工作流 Branching

市面上最流行的工作流

假如有一个项目需要你开发功能，于是你在项目上新建了一个分支

Copy
git checkout -b zhang

开发完毕之后你可以推送到远程分支上去：

Copy
git add .
git commit -m "开发完成"
git push origin zhang

然后你告诉同事说可以 review 一下你的代码，同事说可以，所以你同事就：

Copy
git pull
git checkout zhang

同事说看了没问题，可以合并到 master。 于是你就把 zhang 合并到 master 上去。 如果同事说有问题，你可以修改代码重复流程2。

Copy
git checkout master
git pull
git merge zhang

最后推送到远程仓库并删除本地 / 远程分支：

Copy
git push
git branch -d zhang
git push origin -d zhang