Git工具学习(一)

#要点
GIT介绍
GIT安装
GIT创建版本库
GIT工作区和暂存区
GIT版本处理
GIT文件处理

GIT介绍

  Git迅速成为最流行的***分布式版本控制系统***,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
注意:
  这边需要对集中式版本控制系统和分布式控制系统进行一下区分。
(1)集中式版本控制系统
  集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后对内容进行处理,再把自己所处理的内容推送给中央服务器;
  同时,集中式版本控制系统需要进行联网才能处理,受网络影响较大。
在这里插入图片描述
(2)分布式版本控制系统
  分布式版本控制系统从根本上看,就没有“中央服务器”,每个人电脑上都是一个完整的版本库,因此不需要联网操作;
  同时,由于每个人手上都是一套完整的版本库,在多人协作上,如果都修改了同一个文件,只要各自的修改的推送给对方,是可以看到对方的修改内容,并根据修改内容进行选择;
  其次,分布式版本控制系统的安全性要高,也正是因为每个人手上都有一个完整的版本库,即便其他人的版本库错误,也可以从其他用户那边复制一份;而对于集中式,如果中央服务器挂掉之后,就都可以休息啦。
  最后,也是最重要的是,GIT属于开源免费的分布式版本控制系统。
在这里插入图片描述

GIT安装

  • 在Linux上进行程序包安装
    sudo apt-get install git
    通过上面的命令可直接进行安装,相对比较简单。

  • 源码编译安装
    先从Git官网下载源码;
    然后解压;
    ./config,make,sudo make install安装即可,在这里因为不是重点,不做演示。

GIT创建版本库

  版本库也叫GIT仓库,在Linux中可以理解为一个目录,这个目录中所有文件会被GIT所管理,包括文件的修改、删除以及对某一时刻的文件还原与恢复等。对于开发人员而言,也是项目的根目录。注意:GIT仓库可以把一个已有项目的文件夹作为仓库;也可以重新创建文件夹,并作为GIT仓库。创建命令如下:
(1)创建空文件夹:

  • mkdir learngit
  • cd learngit
  • pwd(查询当前的文件路径是为了保证在文件夹内)
    (2)通过git init命令把这个目录变成Git可以管理的仓库:
  • git init
  • ls -ah(通过此命令,会发现当前目录下有一个.git目录,此目录是GIT追踪管理版本库的,尽量不要去修改,相当于暂存区)

GIT工作区和暂存区

  • 工作区
    工作区就相当于我们系统上的项目目录;
  • 版本库
    工作区存在的隐藏目录.git文件夹,并非工作区内容,二货思GIT版本库;
    在GIT版本库中,其最重要的就包含了所谓的stage暂存区,其次还有GIT会自动创建的主分支master,并且包含指向master的一个指针HEAD。
    在这里插入图片描述
  • 文件提交至master步骤
    (1)git add 将文件修改添加只暂存区;
    (2)git commit 把暂存区的所有内容提交至当前分支。
  • 示例
    (1)先对readme.txt做个修改,比如加上一行内容:
	Git is a distributed version control system.
	Git is free software distributed under the GPL.
	Git has a mutable index called stage.

(2)在工作区新增一个LICENSE文本文件;
(3)通过git status查看状态;

	$ git status
	On branch master
	Changes not staged for commit:
	  (use "git add <file>..." to update what will be committed)
	  (use "git checkout -- <file>..." to discard changes in working directory)
	
		modified:   readme.txt
	
	Untracked files:
	  (use "git add <file>..." to include in what will be committed)
	
		LICENSE
	
	no changes added to commit (use "git add" and/or "git commit -a")

  此时,可以看到readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。
(4)通过git add命令操作后,再用git status再去查看:

	$ git status
	On branch master
	Changes to be committed:
	  (use "git reset HEAD <file>..." to unstage)
	
		new file:   LICENSE
		modified:   readme.txt

  而此时,暂存区的状态被添加之后,就会如下显示:
在这里插入图片描述
(5)执行git commit之后就可以把暂存区中的所有修改提交至分支。

	$ git commit -m "understand how stage works"
	[master e43a48b] understand how stage works
	 2 files changed, 2 insertions(+)
	 create mode 100644 LICENSE

  注意,一旦提交之后,如果对工作区没有做任何修改,因此工作区是干净的。如图:

	$ git status
	On branch master
	nothing to commit, working tree clean

  此时,版本库就会变成如下,而暂存区中就不再有内容啦。
在这里插入图片描述

GIT版本处理

  当遇到对工作区的文件进行多次修改并提交至GIT仓库时,就会出现多个版本信息。如下示例:
版本1:wrote a readme file

	Git is a version control system.
	Git is free software.

版本2:add distributed

	Git is a distributed version control system.
	Git is free software.

版本3:append GPL

	Git is a distributed version control system.
	Git is free software distributed under the GPL.

  而对于不同的版本,都可以通过***git log***命令进行查看;该命令会显示提交日志,并对每次提交的信息进行追踪。最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。
  当修改版本较多时,可通过参数–pretty=oneline进行简化,需要注意的是,GIT提供的版本号是用16进制生成的;而SVN的话,采用的是递增版本号处理,容易引起冲突。

  • 版本回退(都在在没有提交在远程之前)

  如果需要回退到某一版本,先通过git log 查看至哪一版本。然后再选择***git reset --hard***命令进行回退。
注意:
  HEAD表示当前版本,也就是最新版本;上一个版本为HEAD^;再 往上一个版本为HEAD ^ ^;如下操作:

	$ git reset --hard HEAD^
	HEAD is now at e475afc add distributed

  倘若还原出错,想再次返回去时,只要上面的命令窗口没有关闭(方法1),可根据之前的版本号指定回去,如下操作:

	$ git log --pretty=oneline
	1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
	e475afc93c209a690c39c13a46716e8fa000c366 add distributed
	eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

	$ git reset --hard 1094a
	HEAD is now at 83b0afe append GPL

补充
  版本回退之所以速度快,其原理就是在于GIT内部有个指向当前版本的HEAD指针,当回退时,GIT内部仅仅将指向版本的指向进行修改即可。并且,也会把工作区中的文件进行更新,也就是说,HEAD指向哪个版本,当前工作区中就是哪个版本内容。

  但是,当命令窗口已经关闭(方法2),此时想恢复新版本时,没办法找到提交版本号,可通过***git reflog***来记录每一次命令;(常用)

	$ git reflog
	e475afc HEAD@{1}: reset: moving to HEAD^
	1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
	e475afc HEAD@{3}: commit: add distributed
	eaadf4e HEAD@{4}: commit (initial): wrote a readme file

GIT文件处理

  • 修改文件

  在这里可以用一句话概括,多次修改,可以多次添加至暂存区,一并提交至分支,也可以分别提交至分支。

  • 撤销修改

  当在提交错误文件前,可通过***git checkout --file***来丢弃工作区的修改。
在这里需要注意:工作区的修改文件撤销操作分为两种情况:
(1)文件修改后并没有放入暂存区,如果同名命令,可撤销修改至与版本库一致;
(2)如果已添加至暂存区,此时做了修改,如果撤销修改,就相当于回到添加暂存区之后的状态。

  • 总结
      让文件回到最近一次***git commit***或者***git add***时的状态。

  • 补充
      ***git reset***命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
       用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区:

  • 删除文件

  在提交文件之后,如果通过rm命令,将文件删除后,GIT会检测到工作区和版本库中的文件不一致,通过git status可查看哪些文件删除。

	$ git add test.txt
	
	$ git commit -m "add test.txt"
	[master b84166e] add test.txt
	 1 file changed, 1 insertion(+)
	 create mode 100644 test.txt
	
	$ rm test.txt
	
	$ git status
	On branch master
	Changes not staged for commit:
	  (use "git add/rm <file>..." to update what will be committed)
	  (use "git checkout -- <file>..." to discard changes in working directory)
	
		deleted:    test.txt
	
	no changes added to commit (use "git add" and/or "git commit -a")

注意
  此时,有两个选择以供选择:
(1)确实从版本库中删除该文件,可通过git rm进行删除,并且git commit再次进行提交,如此文件就从版本库中彻底删除了;

	$ git rm test.txt
	rm 'test.txt'
	
	$ git commit -m "remove test.txt"
	[master d46f35e] remove test.txt
	 1 file changed, 1 deletion(-)
	 delete mode 100644 test.txt

(2)如果删除错啦,还想恢复,也可通过git checkout – file将误删的文件恢复至最新版本;git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

	$ git checkout -- test.txt

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值