GIT学习笔记
创建仓库
创建本地repository
- 创建一个本地的仓库,这个目录里面所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,因此可以在任何时候都可以最总理是、或者在将来摸个时刻可以“还原”。
- 在linux系统上创建仓库非常简单:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
- 然后再通过
git init
命令把这个目录变成Git可以管理的仓库。
$ git init
已初始化空的 Git 仓库于 /home/lancibe/learngit/.git/
- 这样就能建立一个空的本地仓库。
把文件添加到仓库
- 我们可以先写一个
readme.txt
,可以使用linux上的vim编辑器来进行,但是注意一定要放在learngit目录或者他的子目录下。因为这里是git仓库。 - 第一步:把文件添加到仓库:
$ git add readme.txt
- 第二步:把用命令
git commit
将文件提交到仓库
$ git commit -m "wrote a readme file"
- 双引号里的内容是输入说明,可以任意写,但是不要不写,因为输入说明对自己、对别人的阅读都很重要。
git commit
命令执行成功之后,系统会提示:1 file changed, 2 insertions(+)
,这表示1个文件被改动,插入了两行内容。
管理工作区
- 如果要对文件进行修改,例如我们将readme.txt文件进行了修改,可以运行
git status
来查看结果:
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但是还没有准备提交的修改。- 虽然git告诉我们文件被修改了,但是如果想看看具体修改了什么内容,可以使用
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.
- 可以从上面的命令输出轻易地发现,我们在第一行添加了一个distributed的单词。
- 在知道了对readme.txt文件作出了什么修改后,再把他提交到仓库就放心多了提交修改和提交新文件是一样的两步,先是
git add
,不过我们现在可以使用git status
来查看工作区状态。
$ git add readme.txt
$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
git status
告诉我们,将要被提交的修改包括readme.txt`下一步,我们就可以放心的提交了。
$ git commit -m "add distributed"
[master c97cbed] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
- 提交完成之后,我们可以再使用
git status
命令查看仓库的当前状态。
$ git status
位于分支 master
无文件要提交,干净的工作区
版本回退
- 在实际工作中,我们肯定不会记得一个相当大的文件每次修改都修改了什么内容,在git中,我们可以通过
git log
命令查看(历史版本)。
$ git log readme.txt
commit 58cc858205b10b71bffa84f9f454c36f5873e5f8 (HEAD -> master)
Author: lancibe <1609547089@qq.com>
Date: Thu Dec 5 15:28:00 2019 +0800
append GPL
commit c97cbeda14418ae7db9d338af24af98c1487eafa
Author: lancibe <1609547089@qq.com>
Date: Wed Dec 4 16:42:44 2019 +0800
add distributed
commit efc9a5a30e94689144ee1ea2372a8133d9b8655d
Author: lancibe <1609547089@qq.com>
Date: Wed Dec 4 15:45:51 2019 +0800
it is the first file README
git log
命令显示从最近到最远的提交日志,我们可以看到三次提交。如果觉得信息太多,看的眼花缭乱的,可以加上--pretty=oneline
参数:
$ git log --pretty=oneline readme.txt
58cc858205b10b71bffa84f9f454c36f5873e5f8 (HEAD -> master) append GPL
c97cbeda14418ae7db9d338af24af98c1487eafa add distributed
efc9a5a30e94689144ee1ea2372a8133d9b8655d it is the first file README
- 每一行前面都会有一大串字母加数字,这是版本号
commit id
,是一个十六进制数。 - 版本回退:如果我们想把readme.txt回退到上一个版本,应使用以下步骤。
- 首先,git必须知道当前版本是那个版本,即
HEAD
关键词表示的版本,上一个版本就是HEAD^
,上上个版本就是HEAD^^
,如果往前100个版本,要写100个^
数不过来,就可以写成HEAD~100
。 - 现在,我们要把当前版本
append GPL
会退到上一个版本,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD 现在位于 c97cbed add distributed
- 对于
--hard
参数的意义,后面会讲到。现在看看readme.txt
中的内容是否是上一个版本。
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
- 可以发现确实被还原了。
- 这时候再使用
git log
看看现在版本库的状态。
$ git log readme.txt
commit c97cbeda14418ae7db9d338af24af98c1487eafa (HEAD -> master)
Author: lancibe <1609547089@qq.com>
Date: Wed Dec 4 16:42:44 2019 +0800
add distributed
commit efc9a5a30e94689144ee1ea2372a8133d9b8655d
Author: lancibe <1609547089@qq.com>
Date: Wed Dec 4 15:45:51 2019 +0800
it is the first file README
- 这时候被回退的最新版本已经找不到了,如果想回去,其实也可以,只要上面的命令行窗口还没有被关掉,就可以使用版本号来还原。
$ git reset --hard 58cc
HEAD 现在位于 58cc858 append GPL
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
- 这样果然又折回来了。
- git的版本回退速度非常快,因为git内部有个指向当前版本的
HEAD
指针,当回退版本的时候,git仅仅是把指针指向了append GPL
。
- 然后还顺便把工作区的文件更新了,所以让
HEAD
指向哪个版本号,就把当前版本定位在哪。 - 但是,上面说的,如果不小心关闭或清空了命令行,找不到之前的版本的版本号了,又该怎么办呢。
- 当我们使用了
$ git reset --hard HEAD^
命令回退到上一个版本时,要找之前版本的版本号,可以使用git reflog
命令,它是用来记录我们的每一次命令的。
$ git reflog
58cc858 (HEAD -> master) HEAD@{0}: reset: moving to 58cc
c97cbed HEAD@{1}: reset: moving to HEAD^
58cc858 (HEAD -> master) HEAD@{2}: commit: append GPL
c97cbed HEAD@{3}: commit: add distributed
efc9a5a HEAD@{4}: commit (initial): it is the first file README
- 这样就可以轻松的找到版本号了。