Git随手记

一、什么是Git

       Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件

二、与SVN有何区别?

1)Git是分布式的,SVN不是:

这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;

2)GIT与SVN版本机制不一样:

Git 只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异。这类系统(如SVN)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,然而Git 并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

3)GIT不需要联网:

SVN 断开网络或者断开VPN就无法commit代码,但是Git 可以先commit到本地仓库。用SVN的话,没有网络或者断开VPN时,你当然也可以继续在本地开发,但是无法commit代码,因为SVN 每次commit都必须联网,长时间不commit代码会丢失大量开发进程的历史纪录。有个比喻是:不能commit就像用word写文档不能save一样危险。而且有网络的情况下每一次commit都会花上数秒甚至更长时间。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,因为是在本地仓库commit所以几乎不需要时间,而且commit一定要频繁,不然无法记录你的改动,如果你一天commit一次,中间的修改你就找不回来,然后等到了有网络的时候再将版本纪录和代码一起上传到远程仓库。

4)Git 的内容完整性要优于SVN:

因为Git 在commit(存储在本地)或者push(上传到远程仓库)之前,通过对文件的内容或目录的结构计算出一个 SHA-1哈希值,作为指纹字符串进行内容的校验,并将此结果作为数据的唯一标识和索引,在远处仓库接受到commit的文件之后,会再计算一遍哈希值然后跟传递过来的哈希值做比较,如果不一致,说明文件在传输时变得不完整,或者磁盘损坏导致文件数据损坏。另外在 Git 数据库中的东西都是用此哈希值来作索引,而不是靠文件名;

三、为什么要用Git?

1) git每台电脑都有一个版本库,可以在本地做版本管理;

2) 速度快。git的速度远超大部分版本管理系统,包括svn

3) 强大的分支管理功能

4) 活跃的开源社区,如最著名的github

四、Git安装、部署和运行

下载 Windows版 git(windows环境默认安装即可)。

下载地址:Git - Downloads

图形化工具SourceTree:Sourcetree | Free Git GUI for Mac and Windows

五、GIT指令模式

1、初始化

安装完git后,在任一一个文件夹(我自己的一个简单项目:D:\work\enjoy-git),右键进入git bash

在命令窗口中输入git init,即就在些目录中创建一个.git的文件夹,如下图

2、管理文件

记得提交前设置下操作者的姓名和email ,不然会报错提交不了。一般会出现下面这样的错误

主要做以下这两个配置

3、提交版本

检查版本状态  命令: git status

如图中所示,表示这些文件还没有被git加以版本控制。

提交到本地时,按照以下两个步骤实施

  • git add . 或git add -A或git add filename (点代表所有新增、修改;  -A 代表新增、修改、删除),加入缓存区(.或者-A表示全部,也可单独文件)
  • git commit -m ‘new project’   提交版本  ‘版本提交描述’

提交到本地时,还可以按照以下一个步骤实施

git commit -a -m   "ew project"   加入缓存区并提交

如果,其中一个类发生改变了,我们可以再次使用git status命令查看,如图

4、删除本地缓存

这个操作,一般情况下不要做,除非你确定需要将代码重新加入版本控制时,可以这样实施

命令:  git rm --cached 文件名

效果如图

5、忽略排除

忽略那些不需要管理的文件夹或文件(比如此项目中.idea文件就需要忽略掉)。可以使用以下命令

命令: touch .gitignore    // 创建一个.gitignore文件

输入一下内容,因为.gitignore本身就需要忽略,所以此文件需要忽略

此时我们再查看一下状态,发现好像这个忽略的操作没有起到什么作用。

看到这种情况,先不要急,这主要是因为先前已经将所有的文件都加入控制中了。我们这里需要做的是,将控制取消掉,如图

可以看到,再次提交时,就会将要忽略的文件自动地的过滤掉。

补充说明:

  • “.gitignore”文件的影响范围是它所在的文件夹和所有的子文件夹
  • 每一个文件夹沟可以创建自己的“.gitignore”文件,如果它上层的文件夹也有“.gitignore”文件,这个文件夹也会受到它的影响。
  • “.gitignore”文件中可以使用“#”字符开头表示注释,文件夹路径是用“/”字符,文件名可以使用通配符“*”,另外还可以使用“!”字符表示排除。

6、分支管理

1、创建分支

命令:     git branch 分支名称

2、查看分支

命令:       git branch

3、切换分支

命令       git checkout 目标分支名称

4、冲突解决

首先切换到dev分支

作如下改动

提交

然后,再切换到master分支

作如下改动

提交

合并两个分支,将dev合并到master上。切换到master分支上

如上图,合并之后,已经提示存在冲突了。

打开代码,会看到如下图

那么这时候,就需要我们开发人员自己决定保留哪一部分了。这里我手动的处理了

将改动后的代码提交

5、删除分支

1) 删除本地分支命令: git branch -d <分支名称>

2) 删除远程分支命令: git push <仓库地址指向> -d <分支名称>

      如  git push origin -d dev

6、查看分支的来源

        git reflog --date=local --all | grep <分支的名称>

7、GIT日志

1)  命令:git log

2) 命令:git log --oneline

简化成一行,如下所示

3) 命令: git log --oneline --graph

简化成一行,同时显示分支

8、提交点

在命令行使用gitk可以展示简单的git界面。

commit的中的这些字母和数字就是commit节点的标识(比如最新的提交点是 446f22d),一般id取这个值的前7位就名够用,当然使用整个id也是没有问题的。这个id值在上面的第5点中截图部分也有显示出来

9、标签

正常情况下,我们在开发的时候,一般都会采用打标签的方式。这种方式使版本在管理起来更加的方便,比如我们遇到问题了,就可以很快地,很清楚地回滚到指定的提交点处。

命令:   git tag -a 标签名称   提交id(一般取整个id的前7位,取完整的id也是可以的)

id的值查看的方法,使用下面这两个日志命令就可以,如下图

打标签的效果如下

10、恢复

       在利用git实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。

       比如,我们修改类,并且已经提交(b4d2653)这个提交点。,如下图

     在Git里,有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)

     git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。(比如需要回到V1.0)

     使用“git reset --hard 目标版本号”命令将版本回退。如下图

        

        

       查看一下日志,如下图

       ”git revert“的作用是通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。

        比如,将代码做一安的更新,重新提交


      如图中所示,提交点已经是ba0c958了,接着,使用“git revert HEAD”撤销前一次的commit,效果如下图

      可以看到,回退后的提交点为3d845f5,即一个新的提交点,但是内容却又和修改代码之前一样的了

11、远程仓库

      首先,需要事先准备一下远程的git仓库,我这里使用码云仓库。使用https方式

      地址为:https://gitee.com/im_a_follower_of_code_cloud/Git_Study.git
      1)本地新建一个远程连接,取名为"Git-Study-Mayun"

            命令为: git remote add Git-Study-Mayun https://gitee.com/im_a_follower_of_code_cloud/Git_Study.git

      2)查看远程连接

           命令为:   git remote

           效果如上图所示

      3)查看远程地址详情

           命令为:   git remote -v

           效果如下图所示

      

      4)上传本地代码至仓库

          命令:  git push --set-upstream Git-Study-Mayun 分支名称   可简化git push -u Git-Study-Mayun 分支名称

          效果如下图。

          如果第一次使用仓库,那么在提交时,会弹出需要填写账号密码的弹窗

          然后,我们查看一下gitee仓库,发现代码已经被提交到仓库中了,如下图所示

       5)从仓库中同步代码

         假如,我们现在仓库中直接修改代码,然后保存

       

         拉取到本地,命令: git fetch

        我们使用上面的这个命令,虽然将代码拉取到本地,但它并没有合并到的分支里面去,所以如果我们想在本地代码里面看到拉取下来的新代码,则需要进行手动的合并。

        命令为:   git merge

        效果如图

            

         

        有时,我们可能会遇到这种情况,对于同一个分支而言,比如以master为例。我们在本地代码中修改并提交到本地git仓库中,但是远端仓库中的代码也发生了更新,这个更新是发生在我们上次拉取远程代码之后,那么这此时,我们想要将本地git仓库推送到远程的话,就发推送不上去,因为存在着代码的冲突。如下图

        本地修改

       

        远程仓库修改

       

        这时,我们推送时,就会出错,如下图

       这个时候,我们应该怎么做呢? 需要将代码同步,那此处,我们使用 另一个命令  git pull

        我们发现,本地代码中,已经发生了改变,如图

            

        从上面两个图中,均可以发现,git已经帮我们做的冲突的解决了。接下来要做的无非就是将代码修改正确并提推送到远程仓库了。

        补充说明一下,刚刚使用的是 git pull 命令,它实际相当于是先 git fetch ,再  git merge。所以在实际开发中,这两种方式,任选其一。

      6)克隆

       大部分情况下,我们作为开发人员刚开发的一个工程的时候,都先从远程仓库去下载代码到本地,那么这个下载的过程我们称之为克隆。

       命令: git clone 远程git地址  名称

       效果如下图

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值