首先看一下a.txt文件的内容
studeyGit Make me Happy!!!
接下来对文件进行修改
studeyGit Make me Happy!!!
Git is Good
我们可以使用下面的命令进行查看结果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: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
上面的命令可以使我们时刻掌握仓库当前的状态。可以看出文件已被修改但是还没有准备提交的修改。
我们可以使用下面命令查看修改的内容git diff
diff --git a/a.txt b/a.txt
index b384108..3d042d2 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,2 @@
-studeyGit Make me Happy<A3><A1><A3><A1><A3><A1>
\ No newline at end of file
+studeyGit Make me Happy<A3><A1><A3><A1><A3><A1>
+Git is Good
\ No newline at end of file
提交修改和添加文件到版本库一样也是两步。
git add a.txt
查看状态git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
可以看出已经是待提交状态了
接下来我们提交git commit -m "second commit"
[master 89e3350] second commit
1 file changed, 2 insertions(+), 1 deletion(-)
查看状态git status
On branch master
nothing to commit, working tree clean
工作目录是干净的了
1.版本回退
我们不断的对文件进行修改,如果后悔了想回到以前的某个版本怎么办?
首先本例子中目前只有两个版本,但是在实际开发中有成千上万个版本,到底回到哪个版本可怎么办?我们可以使用git log
命令查看每次的提交日志
commit 89e3350cc522e9f343018056fbaec50409ecbc5e (HEAD -> master)
Author: yz <357823669@qq.com>
Date: Tue Jan 23 16:27:42 2018 +0800
second commit
commit 6a46a5a0eebc19b7d6cfc2ce05e623a082a125af
Author: yz <357823669@qq.com>
Date: Tue Jan 23 15:41:30 2018 +0800
first commit
可以看出我们的提交信息以及提交备注我们可以加上--pretty=oneline
参数进行格式化
89e3350cc522e9f343018056fbaec50409ecbc5e (HEAD -> master) second commit
6a46a5a0eebc19b7d6cfc2ce05e623a082a125af first commit
好了 有了日志信息中的版本号(采用SHA1算法生成)我们就可以回退到以前的任何版本了
另外HEAD
代表当前版本 HEAD^
代表上一个版本 以此类推 但是100个版本怎么办呢?我们可以使用 HEAD~100
来表示
接下来我们可以使用 git reset --hard HEAD^
或者 git reset --hard 6a46a
回退到上个版本
这里版本号我们不用写全 Git会自动去找 当然也不能写一两位HEAD is now at 6a46a5a first commit
已经回退成功了。(备注:git reset --hard HEAD^
在cmd 中需要 将 ^
加上双引号 "^"
因为^
是特殊字符)
commit 6a46a5a0eebc19b7d6cfc2ce05e623a082a125af (HEAD -> master)
Author: yz <357823669@qq.com>
Date: Tue Jan 23 15:41:30 2018 +0800
first commit
可以看出最新一次的提交记录已经没有了,so 我们怎么从过去回来呢 (最新版本的id没有了呀)
我们可以使用git reflog
命令查看我们每次的提交命令去找到最新版本的版本号,从而回到最新版本
6a46a5a (HEAD -> master) HEAD@{0}: reset: moving to 6a46a5a0eebc
89e3350 HEAD@{1}: commit: second commit
6a46a5a (HEAD -> master) HEAD@{2}: commit (initial): first commit
git reset --hard 89e3350
HEAD is now at 89e3350 second commit
好了 我们又回到最新版本
了 因为在每次时光穿梭的时候只是代表当前版本的HEAD
指针进行移动 所以速度是非常快的
2.暂存区与工作区(用了大量廖老师的图 )
Git与其他版本控制不同之处就是暂存区的概念
工作区(Working Directory)比如我的studygit文件夹就是一个工作区
版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index
)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
之前我们说的git提交文件到版本库分为两步
第一步:git add
将文件添加到缓存区
第二步:git commit
将缓存区的文件全部提交到当前分支
当我们创建版本库的时候就会自动创建master
分支
下面举个例子
首先我们修改a.txt
内容 并新建一个文件c.txt
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: a.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
c.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以看出a.txt
已经被修改了 c.txt
处于untracked
状态 说明是新添加的文件
使用git add a.txt c.txt
我们将文件添加到暂存区
查看状态
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
new file: c.txt
可以看出文件已经添加到暂存区了
接下来我们提交文件git commit -m "third commit"
查看状态
On branch master
nothing to commit, working tree clean
工作区已经干净了 而且暂存区也没有了任何内容