Git近些年的火爆程度非同一般,这个版本控制系统被广泛地用在大型开源项目(比如Linux),不同规模的团队开发,以及独立开发者,甚至学生之中。
我在初学的时候被git里的各种命令、参数吓得不愿意继续去学习。但实际上刚上手的时候,你并不需要了解所有命令的用途。你可以从掌握一些简单、常用又强大的命令开始,然后逐步去学习。我将我的Git的学习过程整理并写成博客分享出来,方便初学者学习入门,也以便我日后查漏补缺。
Git的内容繁杂庞大,我计划从三个方面整理Git:
本文参考了网上很多资料,难以一一列举,在此对这些资料的作者表示感谢!关于Git相关的资料,请参考文末。
什么是Git?
Git是目前世界上最先进的分布式版本控制系统,所谓版本控制系统是任何能让你了解到一个文件的历史,以及它的发展过程的系统。通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。
很多人Git与Github傻傻分不清Git是一款免费、开源的分布式版本控制系统,而Github是用Git做版本控制的代码托管平台当然也是全球最大的同性交友平台。还搞不懂可以参见:
大白话解释 Git 和 GitHub - 文章 - 伯乐在线blog.jobbole.comCVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统。
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。
Git在很长一段时间内只能在Linux和Unix系统上运行,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
安装Git的方法很简单只需在终端输入:
$ sudo apt-get install git
即可完成安装。
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/home/wang/learngit
第二步,通过git init
命令把这个目录变成Git可以管理的仓库:
$ git init
初始化空的 Git 仓库于 /home/wang/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository)。打开隐藏文件(Ctrl+h)可以看到.git的文件,这个目录是Git来跟踪管理版本库的。
也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。
首先我们编写一个readme.txt
文件并放到learngit
目录下(子目录也行),内容如下:
Git is a version control system.
Git is free software.
编写好readme.txt文件后,使用git add和git commit将该文件添加到仓库中。
$ git add readme.txt
$ git commit -m "wrote a readme file"
[master (根提交) a41ba4d] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
现在修改readme.txt文件,改成如下内容:
Git is a distributed version control system.
Git is free software.
现在,运行git status
命令看看结果:
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
虽然Git告诉我们readme.txt
被修改了,但如果能看看具体修改了什么内容,自然是很好的。通过git diff
这个命令可以查看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
当我们版本更迭次数过多时,我们可以使用git log
命令显示从最近到最远的提交日志信息,可以看到我先后提交了两次readme文件,时间 作者 修改内容 以及一长串的commit id均可以看到。
$ git log
commit 29132fc35cf45df300209994882e00964c509970
Author: 0.618 <[email protected]>
Date: Sun Mar 3 13:02:30 2019 +0800
add a distributed
commit a41ba4ddda178dd235898d7974dba31dd1e056d1
Author: 0.618 <[email protected]>
Date: Sun Mar 3 12:39:55 2019 +0800
wrote a readme file
当我们发现我们代码当前版本不稳定我们如何退回到以前的版本呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
现在,我们要把当前版本回退到上一个版本,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD 现在位于 a41ba4d wrote a readme file
再查看readme.txt
的内容时,内容已经变回上一个版本了。
可否再次回到最新的版本呢?答案是肯定的。
找到最新版本的commit id,使用 git rest --hard
$ git reset --hard a41ba4d
HEAD 现在位于 a41ba4d wrote a readme file
再次查看readme.txt。最新版本又回来了!!!
可是当关闭终端后找不到最新的commit id怎么办?git提供了一个git reflog命令来记录用户的每一次命令。
$ git reflog
a41ba4d HEAD@{0}: reset: moving to HEAD^
29132fc HEAD@{1}: commit: add a distributed
a41ba4d HEAD@{2}: commit (initial): wrote a readme file
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file(没有--,就变成了“切换到另一个分支”的命令)。
命令git checkout 意思就是,把文件在工作区的修改全部撤销,这里有两种情况:
总之,就是让这个文件回到最近一次git commit或git add时的状态。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD
当一个文件被删除时,工作区和版本库就不一致了。现在你有两个选择:
到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了。
为了更好的理解和使用Git进行版本控制,我们介绍两个名词:工作区与暂存区
工作区就是你在电脑里能看到的目录,比如我的learngit
文件夹就是一个工作区:
而是Git的版本库是工作区中的一个隐藏目录.git
。 Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
你的本地仓库由 git 维护的三棵“树”组成。
工作目录
,它持有实际文件;暂存区(Index)
,它像个缓存区域,临时保存你的改动;HEAD
,它指向你最后一次提交的结果。这里要提一点的是Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
sudo apt-get install git
即可。git init
命令。git add
,注意,可反复多次使用,添加多个文件; 使用命令git commit -m
,完成。HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。git log
可以查看提交历史,以便确定要回退到哪个版本。git reflog
查看命令历史,以便确定要回到未来的哪个版本。git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。