Git的初步了解和基本使用

虽然在工作中我们可能用得最多的版本管理工具是svn,但更为优秀的版本管理工具-Git我们也要了解和学习一下,甚至要亲自使用一下,体验其优秀的特性。下面是我个人对Git的一些初步了解和基本命令的使用,比如Git的相对于svn的一些优点,一些日常基本命令的使用等,想学习更全面、更深入的话,可以去看看《Git权威指南》这本书籍,这里也就是记录的不是很深入的知识。

Git与SVN的区别(面试被问到)

写这篇笔记主要是因为之前面试被问到这个问题,而我却没有认真了解过两者的区别,居然答不出来()。羞愧啊。

SVN以及出现较早的CVS都是集中式版本控制工具。CVS这种版本管理工具出现的比较早,当时其被大规模使用,其使用方式也简单,但是有着很多诸如难迁移、合并困难等问题,后来新的版本管理系统-SVN的出现解决CVS存在的一些问题。现在大多数公司用的比较多的应该就是SVN了,所以这里忽略CVS了,只比较SVN和Git的区别。

1、Git是分布式的,而SVN不是

SVN是集中式版本控制,Git是分布式版本控制,其思想是分布式、去中心化。
Git的这个分布式特性是Git与其他如CVS、SVN等版本控制工具最核心的区别了。这个分布式体现在当你从中央代码版本仓库中checkout一个工程下来之后,会在本地克隆一个自己的本地版本库,这样你以后的每次commit代码都是提交到这个本地仓库中,然后可以在合适的时机再“推”到服务器版本库上。所以即使在没网的情况下,你也可以查看版本历史记录和提交自己的修改,或者创建分支,创建项目等等,等有网时在push到服务器上。这样的好处是不会与别人的代码产生太多的冲突,如使用SVN,你需先update,在commit,否则可能会其他成员的代码产生冲突。

这里想到一个问题:虽说不会产生太多冲突,但有时应该可能还是会出现的吧,比如在push时,服务器上的相同文件有人早一步修改push了,我修改同样的位置再push时会不会有冲突??(需要实践一下)
--> 正常应该是会提示请先 git pull 拉起服务器最新代码吧?

  1. 如果有冲突,解决完冲突再commit,然后再push;
  2. 如果没有冲突,直接就可以push。

2、Git按元数据形式存储内容,而SVN按文件

svn、CVS等会把所有文件的元信息隐藏在一个如.svn、.cvs的文件夹中,有时候我们SVN出现问题时,清空下这个文件夹,可能就会解决了。而Git中的.git目录中会保存着中央仓库中的所有的内容,如标签,分支等,是一个克隆的版本库。对比一下.svn和.git目录可以看出它们的大小差距会很大。

3、在分支管理上的不同

使用SVN创建分支,我们一般都会在branches目录来创建一条新的分支,这条分支是在中央版本库上的,所以有所限制,不能随意的操作。我们一般需要checkout下来,进行一些修改后再提交。如果和其他成员共同协作开发,难免会发生一些冲突。
而Git是在本地仓库中创建分支的,我们可以任意创建多条分支,在分支上进行我们的功能开发,最后合并到主分支上,而不会和其他成员发生冲突。

4、Git没有一个全局的版本号,而SVN有

SVN每一次的提交都会产生一个整库的全局版本号,这个版本号是连续的,我们甚至可以预判到下一个版本号。而Git的版本号是通过提交文件的内容和目录进行计算得出一个SHA-1哈希值,用它作为每个人的提交ID,这个版本号是“全球唯一”的,不连续的,所以每个人的提交都不会重复和产生版本号的冲突而且还保证了数据的完整性,也可以依次来判断数据内容是否被篡改,。在提交后,这个版本号现在一般是简化后的7位短版本号,使用从左面开始任意长度的字串作为简化版本号,只要该简化的版本号不产生歧义。

5、内容完整性差异

GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

6、速度上的差异

使用Git克隆一个项目是比使用SVN checkout的速度要快。

Git基础命令的使用

下面是一些日常是使用的基本命令。

1,克隆一个仓库
$ git clone https://xxxx.git 或 git c https://xxxx.git
2,在本地创建一个新的目录,并进入此目录执行如下命令
$ git init

初始化一个repository。会在此目录下生成一个隐藏的.git目录

3,设置用户名和密码(全局)
$ git config --global user.name "your name"
$ git config --global user.email  “your email”

若省略—global,则只设置该仓库的信息。

4,执行如下命令将本地所有文件加入本地暂存区中
$ git add .
5,将暂存区的文件提交到本地历史区中
$ git commit -m “第一次初始化提交”
6,查看文件状态
$ git status
7,将本地仓库与远程库关联起来
 $ git remote add origin [email protected]:yourName/yourRepo.git
8,提交到Git服务器的暂存区中
$ git push -u origin master    //第一次推送时
$ git push  origin master       //第一次推送后

1)如果遇到如下错误1:
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
To github.com:idev/test.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to '[email protected]:idev/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
—> 解决办法同3

2)如果遇到如下错误2:
错误提示:fatal: remote origin already exists.
解决办法,先将关联的远程库地址移除重新关联:

$ git remote rm origin

3)如果遇到如下错误3:
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]:idev/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.

原因是本地目录没有README.md文件,远程仓库上有,使用以下命令:

$ git pull --rebase origin master   
6,执行命令将服务器中的最新内容拉取到本地
$ git pull origin master

也可以使用GitHub Desktop桌面图形化工具管理(Mac)。或者使用git base (windows)。使用Xcode等开发工具的话可以直接使用在工具中Pull拉取最新代码。

7,撤销尚未提交的修改
$ git checkout -- 文件名

更多深入的Git知识可以看书籍《Git权威指南》。

可能由于在工作使用得不多(基本没使用,都是自己玩GitHub时用一下),可能理解得不够深入,所以以后有用到相关的然后有较深的理解再补充吧

参考

Git和SVN的区别
书籍《Git权威指南》

你可能感兴趣的:(Git的初步了解和基本使用)