关于Git的基本操作过程

名词概念

在了解Git的基本操作原理之前,得先了解几个概念:

  • 工作区(Working Directory)
    正如英文名字所说,含义就是电脑上能看到的目录,比方说E:\learnignpython这个文件夹就是一个工作区。

  • 版本库(Repository)
    如要使用Git,就得首先像《Git 版本库的建立及文件添加》的文章里创建版本库。
    创建版本库之后,在对应的工作区下会生成一个隐藏的目录.git, 而这个目录不算工作区,而是Git的版本库。
    而版本库里含有很多东西,其中比较重要的有

    • 1、暂存区(stage/index)
    • 2、分支(master)
    • 3、指针head

版本的存储

基本概念搞懂之后,就了解一下Git文件修改版本存储到版本库的基本操作过程(如图):

工作区与版本库

  1. 当创建Git版本库时(即Git在当前目录下自动生成一个目录.git),版本库里头也就自动创建了唯一一个分支Master
  2. 使用命令git add,实质就是把工作区的文件添加到暂存区上。
  3. 使用命令git commit,实质就是把暂存区的所有内容添加到当前分支上。

以上可执行git status命令了解具体情况:

在工作区刚刚修改完文件,使用git status命令,查看工作区暂存区分支之间的状态。
eg:

E:\Git>git status #使用git status命令,得到下面信息
on branch master  
Changes not staged for commit: #检测到文件修改,但没有上传到stage
    (use "git add (file)..." to update what will be committed) 
    (use "git checkout --(file)..." to discard changes in working directory) 
        modified: Hello,Seiei.txt #检测到文件修改
no changes added to commmit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握查看工作区暂存区分支之间的状态。 ,如果目录下有文件从来没有添加到暂存区,它的状态会是Untracked
上面的命令告诉我们,Hello,Seiei.txt被修改过了,但还没有准备提交的修改,即没有使用git add命令把文件修改添加到暂存区stage上。
现在有两个方法,要么使用git addgit commit -a命令把文件修改添加到暂存区stage或分支branch上,要么使用git checkout命令撤回修改,返回暂存区stage或分支branch的之前存储文件版本。

此时,git status虽然告诉了我们文件修改了,但具体要看修改了什么内容得执行git diff命令(先与暂存区的版本比较,若暂存区为空,则分支最新的版本比较):

E:\Git>git diff
diff --git a/Hello,Seiei.txt/b/Hello,Seiei.txt
index f075ef5..419fb58 100644
--- a/Hello,Seiei.txt
+++ b/Hello,Seiei.txt
@@ -1,5 +1,5 @@  #下面是文本内容,加减号代表修改部分
 Hello,Seiei.txt
-Git is a version control system
+Git is a branch version control system
 Git is for free
 add something to test the git

注:
git diff --cached命令是暂存区(stage)和分支(master)的比较
git diff命令是是工作区(work dict)和暂存区(stage)的比较


将把工作区的文件修改使用git add命令后,在调用执行git status命令,查看工作区暂存区分支之间的状态。
eg:

E:\Git>git status
On branch master
Changes to be committed: #检测到stage有东西可以commit到branch上
    (use "git reset HEAD <file>..." to unstage)
        modified: Hello,Seiei.txt ##检测到文件修改

上面指令告诉我们,Hello,Seiei.txt文件被修改过,并已经添加到暂存区上。
现在有两个操作可供选择,要么把暂存区的所有内容添加到当前分支上;要么清除暂存区回退成与分支内容一致,但工作区没有清除,若想把工作区也清除,就得在使用git checkout -- file(这里的--后面有一个空格键)命令了。


最后调用git commit命令,查看工作区暂存区分支之间的状态。
eg:

E:\Git>git status
On branch master
nothing to commit, working tree is clean

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的,暂存区stage为空。
此时的版本库变成(如图):

commit 后的版本库

简单总结一下:

  • 存储过程就是:把需要提交文件修改通通经git add命令添加到暂存区上,然后,暂存区经git commit命令添加到分支上。
  • 要随时掌握工作区暂存区分支之间的状态。可使用git status命令。
  • 可以使用git diff命令查看文件修改内容(先与暂存区的版本比较,若暂存区为空,则与分支最新的版本比较)。
  • Git是根据暂存区或分支来跟踪修改的,而且修改储存到分支时基本都经过暂存区,所以每次修改,如果不add到暂存区,那就不会加入到commit命令中
  • 上述的所有都是以工作区的状态作为原点,比较原点。

版本的回退

对文件进行修改,每当你觉得文件修改到一定程度时,就可以“保存一个快照”,这个快照在Git中被称为commit一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把花了时间的工作成果全部丢失。

当要把当前版本返回到其他版本,就要用到可以使用到HEAD指针了。

执行git reset --hard commit_id命令起到变更当前版本的作用,其原理是:Git在内部有个指向当前版本的HEAD指针,该指针指向的版本号对应不同的文件版本。所以让HEAD指向哪个版本号,就会把当前版本定位在那个版本号对应的版本。此时的工作区文件版本会被替换掉。
要取得版本号commit_id),就要用git loggit reflog命令,
eg:

E:\Git>git log
commit 09c37cd0469698c8995bab28ac25eff6b69f8e70
Author: AB786883603 <786883603@qq.com>
Date:   Sun May 28 18:51:39 2017 +0800

    check five

commit 5368a84ef2f862988ef53fe4db62c9ec3a8c6a3d
Author: AB786883603 <786883603@qq.com>
Date:   Sun May 28 15:19:34 2017 +0800

    create test.txt

........

如果嫌输出信息太多,看得眼花缭乱的,可以添加上--pretty=oneline参数。
eg:

E:\Git>git log --pretty=oneline
09c37cd0469698c8995bab28ac25eff6b69f8e70 (HEAD -> master) check five
5368a84ef2f862988ef53fe4db62c9ec3a8c6a3d create test.txt
bbef9e87e0659fd10f6ea69aacd679822e92489a check three
38d45e1589c0ab14c7bceeeb429c8e40dcc40510 check two
e47844db8fac4ce492e38d214f6a65c7f5e4780e make a new file

以上这是版本回退查询版本号的方法。其中前面那一大串数字是commit_id版本号)。而要从旧版本重返新版本就要调用git reflog命令查询版本号了。

在知道要返回的版本号后,就可以使用git reset --hard commit_id返回了(版本号不需要写全,差不多就可以了,Git会自动查询的)。
eg:

E:\Git>git reset --hard 09c37cd
HEAD is now at 09c37cd check five

整章总结:

  • 理好前面的小总结

  • 要理解好工作区与版本库,还有版本库中的暂存区(stage)分支(branch)HEAD指针之间的关系。

  • 版本的回退及返回与HEAD指针有关
    想要回退版本就用git log --pretty=oneline命令查询版本号,再使用git reset --hard commit_id回退版本。(注:hard)
    想要重回较新的版本就得使用git reflog命令查询版本号,再使用git reset --hard commit_id重返新版本。

posted @ 2017-05-28 17:27  Seiei  阅读(180)  评论(0)    收藏  举报