在五一的时间抽空学习学习git,看了一下午,想记录记录一些基础的东西出来。
git是一个分布式的版本控制工具,工作起来相当于,远程是一份仓库,本地也是一份仓库。大家都是仓库。与SVN比起来,具有更强的容灾性,性能也更高,不会受到太多网络的限制(单机版本的git也照样用,只是没法用远程仓库而已,这样来对网络带宽也节省多了。)
(题外话,GFS和MapReduce也是跟git差不多时候出来的,那时候刚04年左右。。。那时候的分布式就已经开始这么广泛的应用了吗)
使用时,先用git add,将想要上传到仓库的文件放本地在缓存;然后使用git commit,将缓存中的文件全部上传到本地仓库A。
如果你想要上传到远程仓库B,那么需要使用命令:git push <远程仓库名> <远程仓库分支>方可。
如果出现上传到仓库B失败,那么多半是你当前的代码版本不是最新的了。需要先进行合并,解决冲突后,再上传。使用git pull <远程仓库名> <远程仓库分支>即可。
举例:
- 我在本地创建了一个叫做test02.txt的文件,并将其内容写为test02
- 然后一次使用git add . --->git commit -m "测试,初代版本" --->git push origin dev-01 这三个命令,来将其提交到远程仓库B中
然后在远程仓库B中,我们将改动该文件的内容为:
- 当改动完并提交成后,我本地仓库A的文件和远程仓库B的文件就不一致了。换句话说,远程仓库B的文件比我本地仓库A的文件改动时间在后边一点,是最新的版本。
- 那么我此时便没有办法对它进行进行push。git正是使用此机制,来确保你提交的代码,不会覆盖掉他人的更新。在上述的例子中,在提交前,你需要先pull一下他人的代码。pull这个命令是两个命令的结合---fetch和merge。fetch,即将文件取到本地仓库;merge,即将仓库代文件和你自己在编写的文件合并起来。pull的使用如下:
- 这样就是一切顺利了,那么此时你只需要再次使用push,即可提交成功。当然这此成功的原因是,我并没有在本地仓库A对test02文件进行修改。我只在远程仓库B中对它进行了添加几个数字,所以并没有冲突的部分。
- 而文件的冲突会发生在什么情况?很简单,比如我们改动了同一个文件,如下:
我先将本地的test02改成这样:
再将远程的test02改成这样:
如此以来,我对同一个文件进行了修改,导致了线上仓库和本地仓库的代码不一致。现在准备开始测试,但在测试之前,需要先将代码commit才可以:git add . ---> git commit -m "test"
- Ok , 让我们来试试拉取,但是,现在进行pull就会这样:
出问题了,我们很明显的看见了一个CONFLICT--->冲突。现在打开test02,我们会看见这样:
其中,HEAD是我们当前的版本。而d3768317e7b056a1782f684806f7c0e900c9fd0a这一串,是远程仓库的版本号。
出现这个问题后,必须解决冲突,然后再add,commit,才能push。
git又是如何解决版本回退。
首先用git log查看提交日志,看看过去的版本号
然后使用git reset hard <版本号>
来进行回退。当然这个log会随着你的pull被一起更新。
切换分支--- git checkout <分支名>
创建分支--- git branch <分支名>。不加分支名会查看本地仓库中的所有分支。
git branch -a会查看所有的分支
git stash,月光宝盒 , 似乎类似于Java序列化,会将当前的git所有代码存储在本地,也就是备份到了磁盘。然后你可以对你的代码改动n多次,随便pull。当你想“回到过去”时,使用git stash list,查看你当前的所有git备份。然后使用git stash apply <备份下标>即可穿越时空
文末赞叹一下贝尔实验室里的神 , git是unix团队两周时间写出来的 , 距今20年了还是经久不衰