分布式版本控制工具-git
为了方便友好的维护linux系统,Linus Torvalds花了两周时间用c写了一个分布式的版本控制系统,这就是Git,2008年Github网站上线了,它为开源项目免费提供Git存储。
关于git
所有关于项目历史信息的文件,都是用一个40位的字符串来命名的,称为对象名,对象名是通过SHA1(一种密码学散列函数)计算得来的。使用散列作为git的对象名,有以下几个好处
git只要比较“对象名”,就可以很快的判断两个对象是否相同。
git还可以通过校验对象内容的SHA1和“对象名”是否相同,来判断对象内容是否正确。
查看git仓库信息的命令
git show命令查看blob中的内容git ls-tree可以查看tree中的内容git log查看commitgit cat-file查看标签中的信息
创建一个git仓库
从远程仓库clone
使用git clone [url]克隆一个git仓库到本地,url可能以ssh://, http(s)://, git:// 开头。
在本地初始化仓库
使用git init或git --bare init可以初始化一个仓库
git init和git –bare init区别:
使用git init会直接创建一个.git文件夹,使用git --bare init时,不会创建.git文件夹,而是生成.git目录下的文件。
博主流风雨情总结为以下两点我觉得可以借鉴
git --bare init只有历史版本库文件,裸(bare)仓库里只存储历史和元信息,不会维护工作目录。
git init有项目源文件,还有历史版本库文件,历史版本库文件放在.git目录下。
一般来说,一个裸库往往被创建用于作为大家一起工作的共享库,每一个人都可以往里面push自己的本地修改。因为如果直接使用git init创建仓库的话,从本地push到该仓库的master分支会出现错误(由于远程仓库当前所在分支与本地仓库相同而不能正常push)。
一般有两种方法解决
使用
git init --bare命令初始化仓库
使用
git init初始化仓库后,手动创建一个分支,然后切换到这个分支,这样从别的仓库push到该仓库的master分支就不会出错了
这两种方法似乎都不是太好。远程仓库初始化的时候,使用git init --bare会影响到git工作流(远程仓库目录下没有代码文件)。而使用git init创建之后再手动创建一个分支同样也会影响到git工作流。我们知道由于远程仓库当前所在分支与本地仓库相同而不能正常push,因此在远程仓库添加以下配置,让git接受与本地仓库相同分支的push。git config receive.denyCurrentBranch updateInstead
一般的工作流程
在git仓库修改之后,使用git add [filename]保存到暂存区,也就是索引区(Git索引是一个在工作目录和项目仓库间的暂存区,如果创建了一个提交, 那么提交的是当前索引里的内容, 而不是工作目录中的内容。使用git status查看当前索引的内容。),add之后git就能track到文件的改变了,然后使用git commit完成提交,最后push到远程仓库。
分支与合并
git branch查看本地分支,git branch -a查看远程仓库所有分支。git branch [branchname]可以创建一个分支,使用。git checkout [branchname]切换到特定分支,在新创建的分支中作出的更改,不会影响到原来的分支,具体可自己尝试。git merge [targetbranch]可以合并目标分支到当前工作分支,如果这个两个分支间的修改没有冲突(conflict), 那么合并就完成了。如有有冲突,输入命令git diff就可以查看冲突,进行修改。


