天天看点

Git学习笔记Git学习笔记

Git学习笔记

文章目录

  • Git学习笔记
    • 前言
    • Git简介
    • Git安装
    • 创建版本库
    • 时光机穿梭
      • 查看、上传修改的文件
      • 版本回退
      • 工作区和缓存区
      • 管理修改
      • 撤销修改
      • 删除文件
    • 远程仓库
    • 分支管理
      • 创建与合并分支
      • 解决冲突
      • 分支管理策略
      • BUG分支
    • 参考文档

前言

Git的强大早就有所耳闻,现在很多企业公司都用到了git做版本的控制,目前在云歌实习,云歌提交项目的方式是用git指令向coding提交自己负责的部分,目前已经提交过两个实习培训实操:数据的加密解密、模拟微信抢红包,由于之前没有用过git,都是锦荣帮我操作的,现在我需要开始学习git的基本指令,了解企业中是如何开发的,这次的笔记也是第一次使用typora工具记录markdown格式的笔记,以前都是用word去写笔记的,现在就踏出面向工作面向好的学习状态的第一步。这次看的教程是黄胤推给我的廖雪峰老师的教程。

Git简介

Git是目前世界上最先进的分布式版本控制系统,Git可以记录每次版本的改动,出现问题可以退回到原来的版本。

Git安装

这次是在windows下安装Git,之前在学习mmall的时候有在自己的电脑上安装过,安装还挺简单的,就是下载安装程序,然后安装一下,在自己电脑上右键弄出gitbash,在弹窗里面设置一些参数,比如你的git账户的名字呀、git使用的邮箱啊之类的。

其中有用到指令:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
           

注意使用了 –global 之后,电脑上所有的Git仓库都会会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址,不加global就可以。

创建版本库

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

windows下的操作方法:

  1. 创建一个专门用来存放仓库(文件)的文件夹;
  2. 在这个文件夹内点右键,点击Gitbash;
  3. 在客户端中输入git init,会在这个文件夹内自动生成一个.git的文件;
  4. 我们将我们要上传的文件放在这个目录下;
  5. 使用

    git add .

    或者

    git add 文件名字.拓展名

    ,将需要上传的文件添加进git的本地仓库中;
  6. 使用

    git commit -m 提交描述

    将git本地仓库的文件提交进版本仓库中;

为什么Git添加文件需要

add

commit

一共两步呢?因为

commit

可以一次提交很多文件,所以你可以多次

add

不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
           

时光机穿梭

查看、上传修改的文件

我们会经常修改库中的文件,如何向版本仓库更新我们的文件呢?

  1. 先修改文件;
  2. 运行

    git status

    查看当前工作库的状态,并且会显示哪些文件被修改过了,一般这个时候会显示Changes not staged for commit:xxx,是因为文件没有用

    git add

    保存进本地仓库;
  3. 如果我们要查看文件的修改内容,可以使用

    git diff 文件名.拓展名

    指令来查看;
  4. 我们确认了修改内容后,使用

    git add

    将修改的文件添加到本地仓库中;
  5. 再执行

    git status

    查看一下当前本地仓库的状态,此时显示Changes to be committed:xxx,这里和步骤2不同的点在于步骤4已经使用了

    git add

    ;
  6. 使用

    git commit

    将本地仓库的文件提交到版本仓库;
  7. 再使用

    git status

    查看当前仓库的状态,如果显示nothing to commit, working tree clean就说明现在已经没有什么需要提交了;

版本回退

当我们不断的进行文件的更新、上传之后,git会自动保存每一次更改的版本记录,所以我们可能会用到以下指令:

  • git log

    来打印目前所有的版本信息,包括版本号、作者、时间;
  • $ git reset --hard HEAD^

    指令来回到上一个版本,HEAD后面每一个代表往前的一个版本如HEAD^代表回到往前的两个版本;
  • $ git reset --hard 1094a

    指令来回到对应的版本号,1094a是版本号
  • git reflog

    可以找到所有操作,操作里面可以看到你曾经对哪些版本做过操作,就不怕从1版本回到2版本后,由于

    git log

    打印不出1版本的版本号,而无法再回到1版本了;

工作区和缓存区

工作区:我们创建的文件夹就是工作区

缓存区:缓存区是我们

git init

后**.git**文件里面的东西,用来存放变化

所以流程大概就是:

Created with Raphaël 2.2.0

开始

向工作区添加文件或者修改文件

用git add .将文件添加到缓存区中

用git commit -m将缓存区的文件上传至版本库中

End

管理修改

当我们修改文件上传时,会遇见这样的情况,我们第一次修改了文件,并且将它提交到缓存区,但是没有commit,这个时候,我们对文件做了第二次修改,第二次修改完之后,我们没有进行add操作,而是直接commit,我们会发现commit上去的只有第一次的修改,第二次是没有被修改的,这是缓存机制导致的,git管理的是修改,我们修改后一定要add进缓存区,再commit。

撤销修改

  1. 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令

    git checkout -- file

    ,这里分两种情况:
    1. 一种是自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    2. 一种是已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
  2. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令

    git reset HEAD <file>

    ,就回到了场景1,第二步按场景1操作。
  3. 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

我们有时候会将工作区的文件删除,删除后我们用

git status

指令去查看,会提示删除了文件,我们可能会有两种操作:

  1. 将版本库里的文件也一起删了,那就用命令

    git rm

    删掉,并且

    git commit -m

    提交一下;
  2. 我们是误删,那么我们要将版本库里的文件恢复到工作区,我们用

    git checkout

    指令就好了;

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

远程仓库

现在已经了解到,我是有自己的本地仓库的,我猜测缓存区和本地仓库都保存在我的**.git**文件中,那么如何将本地仓库和远程仓库连接起来呢?

本地仓库和远程仓库进行铺路:

  1. 我们先创建自己的github账号,要记住注册用的用户名和邮箱;
  2. 在本地打开gitbash,输入

    $ ssh-keygen -t rsa -C "[email protected]"

    ,创建对应邮箱的ssh公钥私钥,它默认位置保存在我的电脑->用户->.ssh文件中;
  3. 我们将公钥复制,粘贴到github个人设置里的ssh属性中,注意不能将私钥填进去,私钥只能自己知道;

完成上面的操作,我们已经将本地仓库和远程仓库铺好路了!

将本地仓库的文件传到远程仓库上去:

  1. 先在github上创建一个项目,会生成项目的ssh链接地址;
  2. 在我们本地仓库运行gitbash;
  3. 输入

    $ git remote add origin [email protected]:michaelliao/learngit.git

    ,注意origin后面的链接地址是我们项目的,而origin是可以改的,只是远程仓库的名字,这一步就是将我们的本地仓库和远程仓库连接起来;
  4. 使用

    $ git push -u origin master

    指令,把本地库的内容推送到远程,用

    git push

    命令,实际上是把当前分支

    master

    推送到远程。

由于这是我们第一次推送,远程库是空的,我们第一次推送

master

分支时,加上了

-u

参数,Git不但会把本地的

master

分支内容推送的远程新的

master

分支,还会把本地的

master

分支和远程的

master

分支关联起来,在以后的推送或者拉取时就可以简化命令。

以后我们要再做推送,就直接输入

$ git push origin master

从远程仓库克隆文件到本地仓库

  1. 首先先在github上面创建一个有初始README文件的项目;
  2. 在电脑中创建一个文件夹用来做存储;
  3. 在这个文件夹内输入指令

    $ git clone [email protected]:715220395/gitskill.git

注意:在github上我们创建一个没有自带README文件的项目时,它的ssh链接会直接显示在上面,当我们创建有初始文件的项目或者去已经有文件的项目clone时,需要点击一下Clone or download按钮,Git支持多种协议,包括

https

,但通过

ssh

支持的原生

git

协议速度最快。

分支管理

啥是分支啊?我的理解,分支就是属于我自己的一条路,我走我自己的路,我走完了我的路程,我就可以合并到主路上去。

创建与合并分支

注意:由于这里分支非常重要,而廖老师的讲解非常详细,这里就直接搬过来了,一定要全部理解!

一开始的时候,

master

分支是一条线,Git用

master

指向最新的提交,再用

HEAD

指向

master

,就能确定当前分支,以及当前分支的提交点:

Git学习笔记Git学习笔记

每次提交,

master

分支都会向前移动一步,这样,随着你不断提交,

master

分支的线也越来越长。

当我们创建新的分支,例如

dev

时,Git新建了一个指针叫

dev

,指向

master

相同的提交,再把

HEAD

指向

dev

,就表示当前分支在

dev

上:

Git学习笔记Git学习笔记

你看,Git创建一个分支很快,因为除了增加一个

dev

指针,改改

HEAD

的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对

dev

分支了,比如新提交一次后,

dev

指针往前移动一步,而

master

指针不变:

Git学习笔记Git学习笔记

假如我们在

dev

上的工作完成了,就可以把

dev

合并到

master

上。Git怎么合并呢?最简单的方法,就是直接把

master

指向

dev

的当前提交,就完成了合并:

Git学习笔记Git学习笔记

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除

dev

分支。删除

dev

分支就是把

dev

指针给删掉,删掉后,我们就剩下了一条

master

分支:

Git学习笔记Git学习笔记

步骤如下:

  1. 创建新分支dev

    $ git checkout -b dev

  2. 然后,用

    git branch

    命令查看当前分支,

    git branch

    命令会列出所有分支,当前分支前面会标一个

    *

    号。;
  3. 我们再dev分支上进行修改,add,commit操作;
  4. 切换回master分支,

    $ git checkout master

  5. 把dev分支的工作成果合并到master分支上,

    $ git merge dev

  6. 合并完成后,就可以放心地删除

    dev

    分支了,

    $ git branch -d dev

  7. 再重新查看一下分支,

    git branch

这里创建、切换分支的时候可以使用:

创建分支:

$ git switch -c dev    
           

切换分支:

$ git switch master
           

解决冲突

冲突是这么发生的:

当我们创建新分支dev,在dev分支下对文件进行更改、add、提交后,切换回master分支,这时我们不着急将master分支与dev分支合并,而是在master分支下也对文件进行更改、add、提交,之后我们再将master分支与dev分支合并,会出现如图这种情况:

Git学习笔记Git学习笔记

master分支和dev分支都有提交,并不是master分支落后于dev分支,这时就出现冲突了,因为两个分支都有改变,那么到底要用谁的呢?所以这时我们需要手动处理冲突,就是打开被修改的文件,根据git的提示去删除一些东西,保留我们需要的东西,这个时候再将文件add、commit;

分支管理策略

当我们合并分支时,一般默认是用Fast forward模式,这种模式很快,但是如果我们删除了分支,那么会丢失分支信息,所以我们要换一种模式进行合并——

--no-ff

,我们使用这种模式,Git会在merge的时候生成一个新的commit,这种模式的指令是:

$ git merge --no-ff -m "merge with no-ff" dev

,dev是分支名字,我们将master分支与dev分支合并,由于这种模式生成了一个新的commit,所以我们使用了-m “提交信息”,接下来我们可以使用指令

git log --graph --pretty=oneline --abbrev-commit

来查看分支历史。

BUG分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当我在分支上工作,忽然接到一个修复bug的请求,那么我要放下手中的工作,去创建分支并且修复bug,使用

git stash

可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。

bug修复完成后,使用

git stash list

命令查看原来存储的工作现场,恢复工作现场有两个办法:

  1. git stash apply

    恢复,但是恢复后,stash内容并不删除,你需要用

    git stash drop

    来删除;
  2. git stash pop

    ,恢复的同时把stash内容也删了

在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。那怎么在dev分支上修复同样的bug?

在master分支上修复的bug,想要合并到当前dev分支,可以用

git cherry-pick <commit>

命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

参考文档

廖雪峰的Git教程