Git实现版本管理
什么是Git?
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆,在本地机器上拷贝一个完整的Git仓库。
Git的意义
就像每个程序员都会遇到的问题,在编写代码时,常常需要不断地进行修改,但是你一不小心修改错了,那怎么才能找到以前的版本呢。git就起到了一个良好的作用。它通过建立一个版本库,从而保存每个你发行过的版本,并能通过特定的命令行对版本进行回溯,也能通过日志访问,仔细看到每一个修改的详细日志。
怎么使用
1.下载git软件,注意安装路径最好不要有中文。
具体安装详解看官网内容。
下载完成后,在桌面即可通过右键打开git bash(windows版本)
2.绑定个人信息
修改命令:
git config --global user.name "用户名"
git config --global user.email "邮箱"
将自己常用邮箱和用户名填入,在git bash运行。
3.创建本地git项目仓库
第一种:git clone 别人的仓库到你的本地文件系统。
第二种:新建立自己的项目文件夹到你的文件系统。
两种选其一即可,然后进入对应的文件目录,通过git init
命令将目录变成Git仓库
git init
此时一个普通目录就变成了了Git仓库,可以发现目录下多了一个.git
文件夹,这个目录是Git来跟踪管理版本库的。(内部的内容别动),他一般是自动隐藏的
4.添加文件到版本库
现在向test
目录或其子目录下创建一个 readme.txt 文件,因为这是一个Git仓库,放到其他地方Git找不到这个文件。内容如下:
git i4 great!
第一步,用命令git add
把文件添加到Git仓库:
git add readme.txt
此时,文件就被提交到git的暂存区。
第二步,用命令git commit
把文件提交到Git仓库(-m
后面输入的是本次提交的说明)
git commit -m "wrote a readme file"
执行
git commit
命令后会告诉你,1 file changed
:1个文件被改动(新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files."
5.版本管理
现在已经成功添加并提交了一个 readme.txt 文件,接着继续修改 readme.txt,修改内容如下:
fuck off
运行git status
命令查看状态:
git status
git status
命令可以查看仓库当前的状态,通过输出得知 readme.txt 被修改过了,但还没有准备提交的修改。
假如你休假两周之后继续上班,但已经记不清上次怎么修改的 readme.txt,这时可以用git diff
这个命令看看:
git diff
git diff
即查看difference,显示的格式是Unix通用的diff格式,通过输出就知道了上一次对 readme.txt 做了什么修改,现在对文件进行提交。
git add readme.txt
执行git commit
之前,再查看一下当前仓库的状态
git status
告诉我们,将要被提交的修改包括 readme.txt,下一步提交
git commit -m "change"
提交后,再用git status
命令查看仓库的当前状态:
git status
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,工作目录是干净的。
6.版本回退
现在继续修改 readme.txt,内容如下:
life is a fucking movie
然后提交
git add ....
git commit....
可以把Git中的commit
理解成“快照”,每当觉得文件修改到一定程度的时候,就可以保存一个快照,当你把文件改乱或者误删,还可以从最近的一个commit
恢复。
在实际工作中,我们怎么知道 readme.txt 文件一共有几个版本被提交到Git仓库里了呢?这时就用到git log
命令了。
git log
git log
命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是last vision,
上一次是change,最早的一次是
wrote a readme file`。
如果嫌输出信息太多,可以加上--pretty=oneline
参数:
git log --pretty=oneline
上面一大串类似1094adb...
的是commit id
(版本号),它是一个SHA1计算出来的一个非常大的数字,因为Git是分布式的版本控制系统,在工作中可能多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号就会发生冲突。
那么如何把 readme.txt 回退到上一个版本,即cchange
版本呢?
首先,Git必须知道当前版本是哪个版本,在Git中用HEAD
表示当前版本,也就是最新的提交1094adb...
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
要把当前版本last vision
回退到上一个版本change,就可以使用
git reset`命令:
git reset --hard HEAD^
查看 readme.txt 的内容可以发现已经回到上一个版本了
cat readme.txt
用git log
再看看现在版本库的状态:
会发现最新的那个版本last vision
不见了,好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,怎么办?
其实只要上面的命令行窗口还没有被关掉,你就可以找到last vision
的commit id
,然后回到未来的版本:
git reset --hard ec916
版本号写前几位就可以,Git会自动去找(不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个)
再次查看 readme.txt 的内容,发现果然回来了。
cat readme.txt
假如你回退到了某个版本,关掉了电脑,第二天想恢复到新版本但找不到新版本的commit id
怎么办?
Git提供了一个命令git reflog
用来记录你的每一次命令:
git reflog
可以看到last vision
的commit id是ec916
,现在又可以回到新版本了。
Git的版本回退速度之所以快,是因为Git在内部有个指向当前版本的
HEAD
指针,当回退版本的时候,Git仅仅是把HEAD从指向last vision
改为指向change
,顺便把工作区的文件更新了。
┌────┐
│HEAD│
└────┘
│
└──> ○ append GPL
│
○ add distributed
│
○ wrote a readme file
--------------------------------------
# 改为指向 add distributed
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──> ○ add distributed
│
○ wrote a readme file
总结
- 使用命令
git init
,初始化Git仓库 - 使用命令
git add <file>
,可反复多次使用,添加多个文件 - 使用命令
git commit -m <message>
完成提交 - 使用命令
git status
,查看工作区状态 - 如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容 HEAD
指向当前版本,使用命令git reset --hard commit_id
可以切换版本- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本 - 常用GIT命令汇总:Git命令汇总 – Echo小窝 (liveout.cn)