# GIT指北 **Published by:** [Vico](https://paragraph.com/@vico/) **Published on:** 2022-05-25 **URL:** https://paragraph.com/@vico/git ## Content 很多做开发的小伙伴之前都是用svn,并不是说svn不好,只是在版本控制方面确实弱很多,怎么选各位自行决定。废话不多说,开整!一,理解概念svn只有本地、远端仓库两个存储区域。git的话则有4个存储区域,本地、stage、本地仓库、远端仓库。 1,本地:对文件的直接修改,最原始的文件存储。 2,stage:临时缓存区,修改的内容要进本地仓库的话必须先放进这里,没进本地仓库之前可以随时取消。当更改被提交进入本地仓库后,这个缓存区就会被清空。 3,本地仓库:进入这里的修改都会被记录下来,相当于游戏的存档,随时可以读档回档。 4,远端仓库:类似github的地方,也可以自己建,相当于多一个备份空间,团队协作必备。二,基础操作1,下载安装,https://git-scm.com/ 2,配置用户名、邮箱 git config --global user.name "test" git config --global user.email "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 其中的origin是远端仓库的名字 8,提交到远端仓库:git push origin master 其中master是分支的名字。也可在命令最后加上-u,输入一次以后,之后只要执行git push就可以默认推送到origin master上去了。执行这一步的时候第一次会要求输入用户名密码,按照提示执行一遍即可。 9,如果其他小伙伴要参与你的项目开发,可以拉取你的远端仓库: git clone https://github.com/test/GitTest.git projectFolder projectFolder是他本地的目录 10,然后当你对项目做了新的修改,并且把修改push到了远端仓库,其他小伙伴可以通过以下命令来获取你的更新:git pull三,进阶操作1,创建分支:git branch branch_1 2,查看分支状态:git branch星号表示当前所在分支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分支一样的内容。 ## Publication Information - [Vico](https://paragraph.com/@vico/): Publication homepage - [All Posts](https://paragraph.com/@vico/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@vico): Subscribe to updates