# GIT指北

By [Vico](https://paragraph.com/@vico) · 2022-05-25

---

很多做开发的小伙伴之前都是用svn，并不是说svn不好，只是在版本控制方面确实弱很多，怎么选各位自行决定。废话不多说，开整！

一，理解概念
------

svn只有本地、远端仓库两个存储区域。git的话则有4个存储区域，本地、stage、本地仓库、远端仓库。

1，本地：对文件的直接修改，最原始的文件存储。

2，stage：临时缓存区，修改的内容要进本地仓库的话必须先放进这里，没进本地仓库之前可以随时取消。当更改被提交进入本地仓库后，这个缓存区就会被清空。

3，本地仓库：进入这里的修改都会被记录下来，相当于游戏的存档，随时可以读档回档。

4，远端仓库：类似github的地方，也可以自己建，相当于多一个备份空间，团队协作必备。

二，基础操作
------

1，下载安装，[https://git-scm.com/](https://git-scm.com/)

2，配置用户名、邮箱

git config --global [user.name](http://user.name) "test"

git config --global user.email "[test@gmail.com](mailto:test@gmail.com)"

配置完可以查看当前配置，cat ~/.gitconfig

3，初始化git仓库：_git init_

此时随便添加几个文本文件到目录下面，比如test.txt

4，将改动提交到stage中：git add test.txt（指定文件）或者git add -A（所有文件）

恢复改动状态（还原）：git rm --cached test.txt（指定文件）或者git reset(所有文件)

5，查看状态：git status

6，提交到本地仓库：git commit -m "update description"

7，连接远端仓库：git remote add origin [https://github.com/test/GitTest.git](https://github.com/test/GitTest.git)

其中的origin是远端仓库的名字

8，提交到远端仓库：git push origin master

其中master是分支的名字。也可在命令最后加上-u，输入一次以后，之后只要执行git push就可以默认推送到origin master上去了。执行这一步的时候第一次会要求输入用户名密码，按照提示执行一遍即可。

9，如果其他小伙伴要参与你的项目开发，可以拉取你的远端仓库：

git clone [https://github.com/test/GitTest.git](https://github.com/test/GitTest.git) projectFolder

projectFolder是他本地的目录

10，然后当你对项目做了新的修改，并且把修改push到了远端仓库，其他小伙伴可以通过以下命令来获取你的更新：git pull

三，进阶操作
------

1，创建分支：git branch branch\_1

2，查看分支状态：git branch

![星号表示当前所在分支](https://storage.googleapis.com/papyrus_images/9272fe9480e28d8b98ce1b58012584cafb00878d5d33b6f8a2f51da9502f4b19.webp)

星号表示当前所在分支

3，切换分支：git checkout branch\_1

4，合并分支：git merge branch\_1 --no-ff

合并可能会出现比较复杂的情况，在没有冲突的情况下先简单了解一下即可

5，删除本地分支：git branch -d branch\_1

如果本地有改动，可以将-d替换成-D来强行删除

6，删除远端分支：git push origin :branch\_1

注意这个操作只会删除远端仓库的分支，并不会影响本地仓库的分支。

四，时间穿梭
------

reset这个命令可以让你在各个版本里自由跳转，不能单纯的认为是回退。

git reset branch\_1^

git reset branch\_1~2

git reset 5d3190e

1，reset：分支名后接^表示回退一档，^^或~2回退两档，^^^或~3回退三档，如果接具体的版本号就会直接跳转。

2，接--mixed：默认参数，保留所有改动，但清空stage缓冲区

3，接--soft：保留所有改动，并保留stage缓冲区。

4，接--hard：所有文件会还原到对应版本。我比较常用的模式！

了解了reset之后，再引入一个新的命令revert，revert和reset的区别在于，revert不是直接跳转，而是在不影响之前的版本的情况下新建一个commit，把要跳转的版本内容还原过来，但这时候比较容易出现冲突，解决完冲突再重新commit即可。

五，再谈谈合并
-------

合并有两种方案，merge与rebase。在没有冲突的情况下，两者功能类似。但在有冲突时会有比较大的分别，下面我分别解释一下。

假设有A，B两个分支，当前分支是B，要将A的内容合并到B。

merge：有记录可溯源。碰到冲突的话，会将所有冲突点写入冲突的文件中，手动或通过工具修改完成后，再重新commit即可。

rebase：无记录，直接合并。遇到冲突时会开一个临时分支C，将需要修改的文件放在里面，在修改完成后，通过rebase --continue合并到B分支，并删除临时分支C。如果使用rebase --abort可以舍弃本次合并，B还是原来的B。如果使用rebase --skip则会舍弃B分支的所有改动，变成和A分支一样的内容。

---

*Originally published on [Vico](https://paragraph.com/@vico/git)*
