git学习总结

一、git简介

1、git是什么?

git是目前世界上最先进的分布式版本控制系统(没有之一)。

2、分布式vs集中式

集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送到中央服务器。中央服务器就好比是一个图书馆,你要修改一本书,必须先从图书馆把书借出来,然后回家自己改,改完了再放回图书馆。

缺点:必须联网才能工作,如果在局域网还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个文件需要很长的时间。

分布式版本控制系统:分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样你工作的时候就不需要联网了,因为版本库就在你的电脑上。既然每个人电脑上都有一个完整的版本库,那如何进行多人协作呢?比方说你在自己电脑上改写了文件A,你的同事也在他电脑上修改了文件A,这时,你们俩之间只需要把自己的修改推给对方,就可以互相看到对方的修改了。

       和集中式版本控制系统想比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统如果中央服务器坏了,所有人都没办法干活了。

       在实际使用版本控制系统的时候,其实很少在两个人之间的电脑上推送版本库的修改,因为你们俩很可能不在一个局域网内,两台电脑互相访问不了,也可能你同事今天生病了,电脑根本没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家一样可以干活,只是交换修改不方便。

       当然,git的优势不仅仅是不必联网呢么简单,还有极其强大的分支管理。

二、安装git(Mac OS环境下)

       直接从AppStore安装Xcode,Xcode集成了git,不过默认没有安装,你需要运行Xcode,选择菜单"Xcode"--"Preferences",在弹出窗口找到"Downloads",选择“Command Line Tools”,点install就可以完成安装了。

      其他环境安装教程参考文档:安装git

三、创建版本库

      什么是版本库呢?版本库又名仓库,英文名repository,你可以简单的理解为一个目录,这个目录里面所有的文件都被git管理起来,每个文件的修改、删除,git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以还原。

      所以,创建一个版本库非常简单,首先选择一个合适的地方,创建一个空目录:

mkdir learnGit
cd learnGit
pwd

      然后通过git init命令把这个目录编程Git可以管理的目录:

      这样git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),这时会发现当前目录多了一个.git的目录,这个目录是git用来跟踪管理版本库的,没事不要手动修改这个目录里面的文件,不然改乱了就把git仓库给破坏了。

      如果没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见了。

把文件添加到版本库

      所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词"Linux",在第8行删除一个"window"。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100kb变到了120kb,但到底改了啥,版本控制系统不知道,也没法知道。

     不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪word文件的改动的。

实践 

首先编写一个readme.txt文件,如下:

一定要放在learnGit目录下(子目录下也行),因为这是一个git仓库,放到其他地方Git再厉害也找不到这个文件。

第一步:把文件添加到仓库

第二步:用命令git commit告诉Git,把文件提交到仓库

1 file changed:1个文件被改动

2 insertions:插入了两行内容

为什么Git添加文件需要add,commit两步呢?

因为commit一次可以提交很多文件,所以你可以多次add不同的文件。

时光穿梭机

我们已经成功的添加并提交了一个readme.txt文件,现在我们继续修改readme.txt文件如下:

现在运行git status 命令查看结果:

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交这个修改。

虽然git告诉我们readme.txt被修改了,但如果能看到具体修改了什么内容,自然是很好的,这时需要用到git diff命令。

git diff顾名思义就是查看difference,显示的格式正式unix通用的diff格式。

知道了对readme.txt做了什么修改之后,再把它提交到仓库就放心多了,进行如下操作

再次运行git status,查看仓库状态

git status告诉我们,将要被提交的操作包括readme.txt,下一步就可以放心的提交了:

再次查看仓库状态

此时就会发现没有要提交的修改,而且工作目录是干净的(working tree clean)

版本回退

再次将文件readme.txt修改为如下,并提交到仓库.

      像这样,你对文件不断的进行修改,然后不断提交修改到版本库,就好比玩RPG游戏时,没通过一关就会自动把游戏状态存盘,如果某一关没有过去,你可以选择读取前一关的状态。有些时候,在打boss之前,你会手动存盘,以便万一打boss失败,可以从最近的地方重新开始。git也是一样,每当你觉得文件修改到一定程度的时候,就可以保存一个快照,这个快照在git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的commit恢复,然后继续工作,而不是把几个月的工作成果完全丢失。

现在我们查看一下当前仓库的提交日志:git log

git log命令显示从最近到最远的提交日志,我们可以看到三次提交日志。如果嫌输出信息太多,可以加参数:--pretty=online

        现在准备把readme.txt回退到上一个版本。首先,git必须知道自己当前是那个版本,在git中用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,,,,,,当然往上100个版本也数不过来^,所以写出HEAD~100。

回退版本使用命令:git reset

通过查看文件发现文件已经被回退。然后查看现在版本库的状态:

       git的版本回退速度非常快,因为git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,git仅仅是把HEAD指针进行了移动。然后顺便把工作区文件也更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位到哪。

       最新的那个版本已经看不到了!好比你从21世纪坐时光机到了19世纪,想再回去已经回不去了,怎么办?

       通过查找那个commit的commit id还是可以回去的。如果commit id也因为关闭了终端而找不到了又该怎么办?

git提供了一个命令:git reflog 用来记录你的每一次命令:

这样就可以找到commit id,可以乘坐时光机回到未来。

工作区和暂存区

工作区:就是你在电脑里能看到的目录,比如我的learnGit就是一个工作区;

版本库:工作区有一个隐藏目录.git,这个不算工作区,而是git的版本库。git的版本库里存了很多东西,其中最重要的就是被称为stage(或者交index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

前面讲了我们把文件往git版本库里添加的时候,是分两步执行的:

  1. 用git add把文件添加进去,实际上就是把文件的修改添加到暂存区。
  2. 用commit提交修改,实际上就是把暂存区的所有内容提交到当前分支。

      因为我们创建git版本库的时候,git为我们自动创建了一个master分支,所以现在commit就是往master分支提交修改。你可以理解为,需要提交的修改统统放到暂存区,然后一次性提交所有暂存区的修改。

实践:

  • 修改readme.txt文件,并新建LINENSE.txt文件

查看状态:

git很清楚的告诉我们,readme.txt被修改了,而LICENSE.txt还没有被添加过,所以状态是untracked。

现在将两个文件都通过git add添加之后查看状态

现在暂存区的状态如下:

所以,git add的作用实际上就是将要提交的修改放到暂存区,然后commit将所有修改提交到分支。

现在版本库变成了这个样子

管理修改

为什么git比其他版本控制系统设计的优秀,因为git跟踪并管理的是修改,而不是文件。

  • 在readme.txt文件新增一行Git tracks changes
  • 添加readme.txt文件到暂存区
  • 再次修改readme.txt
  • 提交暂存区的修改

会发现第二次修改没有被提交。这是因为第二次修改没有被放入暂存区,只是将暂存区中的第一次修改提交了。

用git diff HEAD -- readme.txt命令可以查到工作区和版本库里最新版本的区别

可见第二次修改并没有被提交。

撤销修改

  • 在文件readme.txt编写了一些错误,如果此时还没有添加到暂存区,可以使用git checkout -- readme.txt.意思就是将readme.txt文件在工作区的所有修改删除掉。让这个文件回到最近一次add或者commit的状态

  • 另一种情况是在文件readme.txt编写了一些错误,并且已经添加到了暂存区,但是在commit之前发生了这个问题。此时可以使用git reset HEAD <file>可以把暂存区的修改撤销掉,重新放回工作区,然后再丢弃工作区的修改即可。

  • 还有一种情况就是将错误的修改add到了暂存区并且已经commit进行了提交,此时只需要进行版本回退即可。

删除文件

  • 先新建一个文件text.txt并提交到暂存区

  • 此时你删除text.txt,查看状态

  • 如果发现是删错了,此时版本库里还有该文件,可以进行恢复:git checkout -- text.txt

  • 如果要继续删除版本库里的文件,使用git rm命令,并进行提交

远程仓库

  • 注册github账号
  • 由于你的本地git仓库和github仓库是通过SSH加密的,所以需要一点设置:

(1)创建SSH key。在用户主目录下,看看有没有.ssh目录,如果有,在看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了可以直接跳到下一步。如果没有,打开shell(windows下打开git bash)创建ssh key

ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换称你自己的邮件地址,然后一路回车,使用默认地址即可,由于这个key也不是用于军事目的,所以也不需要设置密码

      如果一切顺利的话,你可以在用户主目录下看淡.ssh目录,里边有id_rsa和id_rsa.pub两个文件,这就是SSH key的两个密钥对,id_isa是私钥,不能泄露出去,id_isa.pub是公钥,可以放心的告诉别人。

(2)登陆github,进入“setting” 

     进入如下界面,设置ssh key。下图是已经设置好的,设置只需点 add ssh key,填上任意title,在key文本框里粘上id_isa.pub文件的内容即可。

      为什么github需要ssh key呢?因为github需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而git支持ssh协议,所以github只要知道了你的公钥,就可以确定只有你才能推送。

      当然,github允许你添加多个key。假定你有若干个电脑,你一会儿在公司提交,一会儿在家里提交,只要把每个电脑的key都添加到github,就可以在每台电脑上往github推送了。

      在github上免费托管的git仓库,任何人都可以看到,但只有你自己才能修改,所以不要把敏感信息放进去。

添加远程库

      现在的场景是:你已经在本地创建了一个git仓库之后,又想在giyhub上创建一个git仓库,并让这两个仓库进行远程同步。这样github上的仓库可以作为备份,又可以让其他人通过该仓库来协作。

(1)首先登陆github,创建一个仓库

      目前github上的这个仓库还是空的,可以从这个仓库克隆出新的仓库,也可以把已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库。

现在根据github的提示,运行如下命令

git remote add origin git@github.com:FuJia1997/learngit.git

添加后,远程库的名字就是origin,这是git默认的叫法。

(2)把本地内容推送到远程,用git push命令,实际就是把当前master分支推送到远程。

      由于远程库是空的,我们第一次推送master分支时,需要加上-u参数,git不仅会把本地的master分支推送到远程master分支,还会把本地的master分支和远程的master分支关联起来,这样以后推送或者拉取就可以简化命令。

git push -u origin master

推送成功后,就可以看到远程库的内容和本地仓库完全一样了

从现在起,只要本地做了提交,可以通过如下命令把修改推送到远程。

git push origin master

从远程库克隆

(1)现在github建一个gitskill的仓库

(2)克隆远程库到本地

git clone git@github.com:FuJia1997/gitskill.git

分支管理

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值