02 GIT

本文详细介绍了Git的基本操作,包括安装、配置、创建仓库、仓库操作、版本穿越、撤销修改等内容。Git是一个分布式版本控制系统,最初由Linux创始人Linus Torvalds为解决Linux内核开发中的版本管理问题而创建。文章强调了Git的优势,如不受限于网络环境,方便进行版本控制。
摘要由CSDN通过智能技术生成

1 GIT简介

GIT(傻瓜内容追踪器),如果要想清楚GIT优势,那么必须首先认清楚CVS或SVN(弥补了CVS的不足)的劣势。SVN最大的好处是解决了冲突,而最大的缺点在于必须采用网络进行操作。
在整个SVN过程之中,如果需要将开发者的代码保存到服务器上,必须保证SVN的服务器已经正常可以使用。在软件开发的过程之中可能出现这样一种情况:
(1)在进行软件修改的时候有可能出现修改错误的情况,那么需要及时的进行恢复,但是如果只是依靠手工进行管理,那么实在是过于麻烦。那么现在就特别希望可以有一种软件版本控制工具,即不受限于网络环境,同时又可以保证开发中存在有多个版本。
而GIT工具所具备的最大优势都是SVN所带来的劣势。

实际上如果公司资金充裕,就可以使用功能强大的收费的软件版本控制工具。所以所有免费的工具,GIT是最方便使用的。

CVS最早是在Linux下发展起来的,而后来的SVN也是在Linux下发展起来的,而GIT也是在Linux下发展起来的。Linux操作系统最大的特征是可以由全世界的技术爱好者进行各自的开发,但是在最早的时候这样的开发为Linux带来了很大的困扰,代码混乱不堪。这个时候Linux的创始人linus使用了BitKeeper版本控制工具(收费软件,但是开发公司给了免费使用权),但是后来许多开发者为了能将免费进行到底,于是开始试图破解BitKeeper,这样BitKeeper就禁止Linux使用。后来在没有办法的情况下,linus才编写了GIT工具,从而也造就了一个现在最为流行的版本控制工具,它解决了所有之前一切的使用不方便。

2 安装GIT软件

GIT是一个免费工具,用户可以直接登录https://www.git-scm.com/上进行下载。
选择适合你自己操作系统的GIT软件包。

在进行下步的安装时一定要将git的可用命令设置到环境属性之中。

如果一切都正常,那么不需要进行任何的额外配置就可以直接操作GIT了。

3 配置全局属性

如果要想进行软件的开发,那么一定需要存在有软件的开发者的人员信息。所以在使用Git之前必须要配置一些公共的环境属性。
范例:设置开发者的用户名

git config --global user.name 'luokaisheng'

范例:设置开发者的邮箱信息

git config --global user.email '2753734956@qq.com'

如果需要知道当前的Git环境下有哪些全局信息可以使用如下的命令完成。
范例:取得全部的全局信息

git config --list
git config -l

此时会返回如下的信息。

4 创建仓库

如果使用SVN需要初始化一个仓库目录,而后将此目录作为项目的提交路径,而在使用Maven也需要有一个读取仓库,所以来讲在任何的软件版本控制工具里面,仓库都是一个最为重要的概念。
1、假设说在D:\gitproject的目录,这个目录要将其设置为仓库目录;

md e:\gitproject

2、如果要想将此目录变为仓库目录,则可以进入到此目录之中配置:

cd gitproject

3、初始化仓库,对于仓库的初始化方式有两种:
(1)第一种:创建一个包含有配置信息目录的仓库文件夹;

git init
//信息提示
Initialized empty Git repository in D:/gitproject/.git/

它会在当前所在目录中自动生成一个*.git隐藏文件夹。这个文件夹将包含有全部的GIT相关的版本信息。
(2)第二种:直接将当前目录设置为GIT仓库;

git init --bare
//信息提示
Initialized empty Git repository in D:/gitproject/

可以发现在此目录中不再生成.git的隐藏目录,而同时D:\gitproject将保存所有的配置信息。

5 仓库的基本操作

在GIT之中,可以监控的范围就是仓库信息(D:\gitproject就是一个仓库),那么只需要将一些文件保存在这个仓库里面就可以进行监控了。
范例:在D:\gitproject目录下建立一个Hello.java文件

public class Hello{
    public static void main(String[] args){
        System.out.println("Hello, GIT!!!");
    }
}

一定要记住,在编写代码的时候请使用UTF-8编码。
范例:观察当前仓库的状态

git status

如果此时GIT发现仓库之中增加了新的文件或者是修改了文件,那么都会提示给用户。

现在假设Hello.java文件为整个项目最终所需要的文件,所以必须要将其进行提交,提交给GIT的文件管理系统。
范例:将文件添加到GIT暂存区中

git add 文件名称
git add Hello.java

随后再次查询当前仓库的状态。
这个时候实际上GIT就知道了在当前目录中有一个需要使用的新文件:Hello.java。
范例:将文件提交到版本库中

git commit -m "提交的注释信息"
git commit -m "Create New File Hello.java"


现在才表示将新的文件提交到了GIT之中进行管理(这个代码才能够被项目真正使用)。

但是如果说现在同创建了好几个新文件呢?例如创建了Demo.java、Employee.java,很明显,当使用了git status之后会立刻告诉用户此时出现了两个新的文件。
如果说现在要想让这两个文件可以使用,传统的做法是:先使用git add将新文件增加到暂存区之中,而后再使用git commit提交到版本库之中。但是文件一多,这样就很麻烦了,为此在GIT里面提供了一个批量添加新文件的操作。
范例:批量添加新文件到暂存库中

git add .

此时所有在仓库目录中创建的新文件都将自动的保存到仓库的暂存区之中,随后查询一下当前的状态。

范例:进行版本库的提交

git commit -m "Add Two Files"


但是有人会觉得很麻烦,既然所有的代码最终都要提交到版本库里面才可以运行,那么完全没有必要先添加到暂存库,应该直接添加会比较好。
范例:自动增加并提交修改到版本库中
(1)修改Employee.java程序文件

public class Employee{
    private Integer eid;
}

(2)查询当前状态:git status
(3)直接将修改后的文件增加到版本库中;

git commit -a -m "Change Employee.java File"

6 修改仓库文件

如果说现在要是针对于仓库中的文件进行修改的话,在查询状态时会进行及时的体现。
范例:修改Hello.java文件

public class Hello{
    public static void main(String[] args){
        System.out.println("Hello, GIT!!!");
        System.out.println("I Love hhy!!!");
        System.out.println("hhy big fool!!!");
    }
}

此时在Hello.java文件里面增加了两行的代码。如果说此时要是查询状态。
如果要想知道此时的文件与已经发布的代码哪块发生了改变,则可以使用如下的命令完。
范例:比较文件

git diff 文件
git diff Hello.java

如果出现的修改文件比较多,那么会采用换行的方式进行显示,如果最后不需要了使用Q字母退出。

在命令行的方式下,如果使用了+表示增加的代码,如果使用了-号表示删除的代码。所以这个工具可以非常清楚的帮助用户进行代码修改前后的区分。但是修改完的代码最终依然还是需要将其提交。
范例:进行提交

git commit -a -m "In Hello.java File Add Two Statement";

那么到此时为止已经出现了许多次的提交,那么现在如果要想知道提交的历史,则可以使用如下命令查看。

git log Hello.java

每一次提交的时候都会自动的生成一个Commit ID(在日后进行项目版本恢复的时候使用)。

7 工作区、暂存区、版本库

在整个的GIT之中,对于文件的操作一共提供有三个区域:
(1)工作区(用户所编写的代码文件夹):所有的文件操作都以工作区为主;
(2)GIT仓库:
|————暂存库:只是将工作区中的未保存文件保存到暂存区中,此部分由GIT维护;
|————版本库:真正进行项目的发布的代码。
1、首先用户要在工作区之中编写所需要的程序文件,但是此时的文件并不能够真正的保存在GIT仓库之中,并且在这一个区域中所进行的文件的创建、修改、删除等操作都不会影响到最终的软件版本发布;就好比是一个临时区域。如果现在需要将这个临时区域中的内容保存到最终发布的软件版本里面需要将其首先增加到暂存区(此时没有发布到版本库中,表示可以撤销),使用git add .进行增加。

使用git add之后工作区中的新文件状态进行了删除,而后将所有的新文件保存在了暂存区里面。
2、保存在暂存区里面的内容只能说是暂时需要的,那么也可以从暂存区之中将内容删除掉,而后真正要想能够发布的项目必须将其设置在Master分支上(版本库),这样只有进行提交后才可以将暂存区中的内容保存在版本库中,才能够真正被其他人所使用。

由于一个项目可能会被发布多次,所以在GIT里面进行了保存之后,都会自动的生成一个提交的版本编号(Commit ID)用于为开发者提供版本回退的处理机制。

(1)修改Hello.java文件

public class Hello{
    public static void main(String[] args){
        //System.out.println("Hello, GIT!!!");
        System.out.println("I Love hhy!!!");
        System.out.println("hhy big fool!!!");
        System.out.println("hhy big big super fool!!!");
    }
}

现在的文件内容在工作区里面修改,这个文件不能被真正的项目所使用,现在在整个工作区的状态就发生了变化。
(2)当使用git status操作的时候就会进行提示,提示工作区有变化;
(3)进行暂存区的保存,保存完成后继续观察状态;

实际上保存到暂存区的内容只是给了用户一个临时保存暂时不改代码的空间,如果用户现在发现修改错误了,则可以进行恢复。
(4)如果现在继续修改Hello.java文件

public class Hello{
    public static void main(String[] args){
        //System.out.println("Hello, GIT!!!");
        System.out.println("I Love hhy!!!");
        System.out.println("hhy big fool!!!");
        System.out.println("hhy big big super fool!!!");
        System.out.println(new java.util.Date());
    }
}

此时的修改实在工作区里面,与暂存区没有任何的关系,没有使用git add命令。当查看状态的时候,显示如下:
5、如果此时提交项目到版本库中(Master分支),工作区中的修改不应该被提交。

git commit -m "Commit Work Dir File"

此时提交的只是在暂存区中的内容,而工作区的内容不会受到影响。

8 版本穿越

GIT中最强大的操作就在于可以进行版本的回退以及前进的状态下切换。在任何的开发之中,对于软件的操作代码,都很难保证其不恢复到原始状态。因为新增加的程序可能会由于某些原因从而导致失败,而此时必须要能够进行快速的版本恢复。

GIT进行版本穿越的核心概念在于每一个Commit ID
范例:查看当前的日志信息

git log

git log --pretty=oneline

可以发现整个的日志记录采用的是栈的形式,最早的提交保存在最后。
实际上在Master分支上存在有一个HEAD指针,这个HEAD指的是当前正在使用的版本。而HEAD指针在默认情况下一定指向的是最新的提交点。
如果说现在要是改变了HEAD的指针,那么就相当于可以任意的修改软件的使用版本。
范例:回退到上一个版本

git reset --hard HEAD~1

实际上此时就实现了版本的回退操作,每当回退一次都回到了上一次的保存点(Commit ID)。

但是如果发现回过了,则需要回滚回去,这个时候就需要知道提交点的信息。但是依靠传统的日志是不行了,必须依靠一个删除的提交点日志信息。
范例:查看所有删除的提交点

git reflog

发现所有针对于版本的操作,reflog都可以记录好,那么这就可以实现恢复了。
范例:恢复到最后一次提交点(79bfdb8)

git reset --hard 79bfdb8


现在只要是有了正常的提交,所有的提交点就可以作为恢复点存在。

9 撤销修改

在任何的开发过程之中,都很难保证不会发生“无用修改”的操作。而在GIT里面针对于此类的操作也是有所支持的,实际上就是指修改撤销功能,可是这里面需要考虑两种情况:
(1)情况一:在工作区中发生了改变,但是此时没有提交到暂存区(未add&commit);
(2)情况二:已经添加到了暂存区,但是没有提交到Master分支(已add未commit)。

1、在工作区进行开发(未add&commit)
这个时候如果要想恢复原本的代码,可以使用checkout操作。
(1)首先使用git status查看当前状态。

(2)如果现在需要重新检出已有的代码,则使用git checkout完成。
|————直接使用会告诉哪些文件发生了变化;

git checkout


|————恢复Hello.java文件以及Employee.java文件。

2、工作区已修改,暂存区已保存,马上就要提交了。
(1)首先修改Hello.java与Employee.java文件;
(2)将文件保存到暂存区中;

git add .

随后查询当前状态(git status)。

(3)将保存在暂存区中的Hello.java文件恢复到工作区中;

git reset HEAD Hello.java


恢复完成之后查看当前状态(git status)。

随后还需要恢复已有的内容:git checkout Hello.java。随后查询状态:
在这里插入图片描述
对于几个区域的操作:
(1)工作区→暂存区:git add
(1)暂存区→Master:git commit
(1)暂存区→工作区:git reset

10 文件删除

一定在开发之中出现过文件误删的情况,那么现在如果要想进行文件的删除实际上只需要删除掉工作区中的内容即可。
范例:删除Hello.java文件

del Hello.java

随后查询一下当前的状态;

此时已经检查到了Hello.java文件已经被删除了。但是需要注意的是,此时只是在工作区中被删除了,而真正的Master分支上的代码依然存在有Hello.java文件,所以必须进行更新提交。

git commit -a -m "Delete Hello.java File"

只要此时更新一提交,那么就表示Hello.java文件彻底消失了。

但是如果说此时开发者认为Hello.java文件不应该被删除,也就是说删除错了。那么可以进行恢复。
范例:恢复文件

git reset --hard 79bfdb8


以上的操作指的是删除已经被提交的情况下,那么还有一种可能是删除发生在工作区里面。这个时候由于没有提交,所以Master分支上依然存在有Hello.java文件,那么可以直接利用Master分支上的Hello.java文件进行恢复。

git checkout --Hello.java

工作区的删除可以利用checkout重新检出,而Master分支上的删除就必须利用版本穿越的方式完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值