Git是目前世界上最先进的分布式版本控制系统,与SVN这类的集中式版本控制系统不同,Git通过在每个人的电脑都设置一个完整的版本库,使得不需要联网也能使用Git提供的各种功能。而在进行多人协作时(涉及远程仓库),通过把各自的修改推送上去便可以看到各自的改动。
上图所示,工作区为本地看到电脑里的目录,暂存区则是在创建仓库后生成的.git文件夹中的index文件,本地仓库也是在.git目录下,远程仓库则是使用Github、Gitee等创建的仓库。本节主要介绍本地仓库与暂存区的使用。
Windows用户可以在Git官网进行下载,下载地址,然后可以按默认选项进行安装,安装成功后,得到下图的文件目录。
安装成功后,我们就可以使用Git愉快地进行版本管理了。首先我们需要配置自己的机器,通过以下命令设置名字与邮箱,其中global
参数表示这台机器上的所有Git仓库都使用这个名字与邮箱。
git config --global user.name "Your Name"
git config --global user.email "[email protected]"`
$ git init
Initialized empty Git repository in D:/博客/git/test/.git/
通过执行git init
创建版本库,创建成功后会在工作区目录下出现.git文件夹, 注意.git文件夹是用于跟踪管理版本的,不要随意更改。
首先在工作区目录下创建一个readme.txt文本文件,如图
readme.txt中我先写入hello world,
然后在git bash中执行命令git add readme.txt
将文件添加到暂存区,再执行git commit -m "第一次提交"
将文件提交到仓库,其中-m
参数用于指定提交时的注释。执行结果如下
$ git add readme.txt
$ git commit -m "第一次提交"
[master (root-commit) c63aa3a] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
然后,可以执行git status
查看是否还存在未提交文件。
$ git status
On branch master
nothing to commit, working tree clean
然后我们在readme.txt文件中添加change11111,再执行git status查看工作区状态。
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以看到文件进行了修改,同时Git提示可以使用git add
进行更新,我们执行git add readme.txt
与git commit -m "第一次修改"
继续向readme.txt文件写入change22222,可以使用git diff 查看修改内容
$ git diff
diff --git a/readme.txt b/readme.txt
index 2fe4992..9ed4e1f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
hello world
-change11111
\ No newline at end of file
+change11111
+change22222
\ No newline at end of file
然后按前面命令提交,至此readme.txt中包含内容
我们可以通过git log
命令查看历史提交记录,
$ git log
commit 93a066b23c3a99e361508f6be19d6ac0bf458bb7 (HEAD -> master)
Author: XXXX<[email protected]>
Date: Sun Jul 2 20:17:40 2023 +0800
第二次修改
commit 5e687930625b606d6a82332403628438ef6eaf26
Author: XXXX<[email protected]>
Date: Sun Jul 2 20:13:05 2023 +0800
第一次修改
commit c63aa3a2bfb2cd2f65bd99da5b32067e5c5438be
Author: XXXX<[email protected]>
Date: Sun Jul 2 19:43:26 2023 +0800
第一次提交
可以看到目前总共完成了三次操作,那么如何完成版本回退呢?
可以使用命令git reset --hard HEAD^
回退到上个版本,回退到上上个版本仅需将HEAD^
改为HEAD^^
,如果是很多个以前版本,则可以使用HEAD ~ n
(n为以前版本,若为1000个以前版本则是HEAD~1000
)。
执行 git reset --hard HEAD^,可以看到readme.txt文件回退到了上个版本。那么如果我们像回到最新版本又该怎么做呢?可以使用命令git reset --hard 版本号
。如何查询版本号呢?可以使用git reflog
命令查询。
$ git reflog
5e68793 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
93a066b HEAD@{1}: commit: 第二次修改
5e68793 (HEAD -> master) HEAD@{2}: commit: 第一次修改
c63aa3a HEAD@{3}: commit (initial): 第一次提交
下面是执行git reset --hard 93a066b
后的结果,同时readme.txt也恢复到了第二次修改后的版本
$ git reset --hard 93a066b
HEAD is now at 93a066b 第二次修改
撤销修改有两种命令,分别是git checkout --file 与 git restore --staged file。其中git resotre的出现是因为git checkout承担了不仅仅撤销修改的任务,还包括分支的管理。因此git restore可以更方便用于撤销修改。
使用git checkout --file
包含两种情况:
一是文件以readme.txt举例,再文件中添加change33333,但修改后还没有放到暂存区,即没有执行git add 命令,那么git checkout -- readme.txt
执行则会撤销修改回到和版本库一模一样的状态,即撤销change33333的添加;
二是readme.txt已经添加到暂存区后,但又对其做了修改,新的修改还没有提交到暂存区,现在,撤销修改就回到添加到暂存区后的状态。如下图所示,我先添加change33333,并使用git add将其提交到暂存区,接着又添加change44444,但不提交到暂存区,结果是恢复到添加change33333的状态。
使用git restore --staged file
包含以下几种情况:
一.已经添加到暂存区但还没有commit:git restore --staged readme.txt
二.已经commit:
可以使用git restore -s HEAD~1 readme.txt
将版本回退到当前快照的前一个版本;
或者git restore -s 93a066b readme.txt
指定明确的 commit id ,回退到指定的快照中。