[原]git的使用(一)---建立本地仓库、add和commit、status和git diff、版本回退使用git reset

在window下已经安装了git的环境

1.建立本地仓库

 mkdir   test     #建立test目录

  cd   test        #进入目录

 git  init           #创建好了本地git仓库,会发现在test目录中多了一个.git目录,并且这个目录是隐藏的

示例:

$ git init
Initialized empty Git repository in F:/git-repo/test/.git/

init前

init后

2.提交文件到中转站和仓库(add和commit)

使用Notepad++创建一个文本文件readme.txt

(记得把Notepad++的默认编码设置为UTF-8 without BOM)不能使用记事本等其他工具创建

readme.txt文件位于test目录中

readme.txt文件内容为:

Git is a version control system.
Git is free software.
[提交到中转站]在路径为test目录中执行命令           
$ git add readme.txt                #告诉git 将readme.txt文件添加到仓库等等提交(也可以认为添加到了仓库中转站)没有任何输出表示正确添加到中转站
[提交到仓库]在路径为test目录中执行命令
$ git commit -m "wrote a readme file"                #告诉git  将刚才放置在中转站的提交到仓库 并给这个提交动作附上一个标签
[master (root-commit) 51af5b3] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

注意:注意:注意:

为什么提交要用add和commit   因为可以add多个文件到中转站,一次commit就可以将中转站中的文件提交到仓库。

比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

 ------------------------------------------------------add时遇到的warning-----------------------------------------

$ git add file1.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory.

------------------------------------------------------需要了解的概念-----------------------------------------

LF是linux下的换行符,而CRLF是enter + 换行

当创建文档的时候使用的环境是windows,而git运行环境在linux环境

-------------------------------------------------------解决这个warning--------------------------------------

git config --global core.autocrlf false


----------------------------------------------------------end--------------------------------------------------

3.git status和git diff
一般步骤为,检查init的git仓库的文件是否有修改 git status
如果有修改就查看修改的地方是不是正确的 git diff
如果修改正确的就提交的中转站 git add <file>
不清楚是否正确提交到中转站 git status
如果正确就再提交到仓库确保代码正常 git commit <file> -m "string"
$ git status                                #查看init仓库所有文件的状态,即查看当前文件test目录中的所有文件的状态(未修改/修改/更新)包括中转站中的文件状态
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:   readme.txt       # 红色表示此文件被修改

no changes added to commit (use "git add" and/or "git commit -a")
$ git diff readme.txt                       #查看被修改的文件,修改了哪些东西
diff --git a/readme.txt b/readme.txt        #比较修改前和修改后的文件
index d8036c1..53d4271 100644
--- a/readme.txt                            
+++ b/readme.txt                             #在readme.txt中做了增加操作
@@ -1,2 +1,2 @@
-Git is a version control system.
-Git is free software.
 No newline at end of file
+Git is a distributed  version control system.
+Git is free software.
$ git add readme.txt                       #检查修改无误后提交到中转站
$ git status                               #确认各个文件的状态和中转站里的文件
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt
$ git commit readme.txt -m "add distributed "      #将中转站里的文件提交到.git仓库
[master 9682929] add distributed
 1 file changed, 2 insertions(+), 2 deletions(-)

 最后,相当于所有的修改都已经提交到了git仓库里面

$ git status                           #查看整个Test目录的结果
On branch master
nothing to commit, working directory clean     #已经clean了

4.git的快照commit

从之前的改动到现在已经提交了三个版本的readme.txt到.git仓库

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

查看git的快照commit,需要使用git log:

类似每次快照都要产生log文件,需要用git log来查看快照,git log是按照最新到最旧来显示。

如下:

################################
  【需要了解的概念】:Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),
  上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
################################


$ git log commit f78cd0925b2bc2883d7ed4de49b1a851367ae56d #这一串数字代表快照的id号,由SHA1产生 Author: userlhb
<lhb@lhb.com>                 Date: Sat Mar 26 20:23:52 2016 +0800 #最新的commit快照 也叫做HEAD快照 append GPL commit 96829291d720b3b84d0ab2a5aad89b0af97a1394 Author: userlhb <lhb@lhb.com> Date: Sat Mar 26 16:20:13 2016 +0800 add distributed #这是HEAD快照的前一个快照 用HEAD^表示 commit 51af5b36b85c52e86b6140d3a73b5e22cd3f78da Author: userlhb <lhb@lhb.com> Date: Sat Mar 26 15:36:57 2016 +0800 #最旧的commit快照 wrote a readme file #这是HEAD快照的前前一个快照 用HEAD^^表示,问题来了?如果前前一百个,怎么表示? HEAD~100

或者显示为一行,添加--pretty=oneline

$ git log --pretty=oneline
f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

5.git中实现版本回退使用git reset

   先看下面两幅图两分钟:

--------------------------------------------------------------------------------------------

    

图一                                       表示当前在append GPL这个版本上

-----------------------------------------------------------------------------------------------------

图二 表示当前在wrote a readme file这个版本上。

  [看图说明]

  git reset 可以控制指针 HEAD 在不同的快照直接切换,如果需要切换到上一个快照用git reset --hard HEAD^

  git reset 和 git commit <file> -m "string" 的动作会被记录到git reflog中,使用git reflog可以查看记录

  git log 查看所有提交到版本库中的快照(版本)

  

---------------------------------------------------------------------------------------------------

[实践出真知]

看图一,理解回退。
回退到中间那个版本add disributed
$ git log --pretty=oneline                                         #列出.git仓库中的所有版本号
f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file


$ git reset --hard HEAD^                                                  #回退到前一个版本add distributed
Unstaged changes after reset:
M       readme.txt


$ git log --pretty=oneline                                         #查看是否回退到add distributed,不能查看之前的版本。
96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

有没有发现什么?对,回退到add distributed后,不能查看之前的版本。要是又要回退到最开始那个版本怎么办呢?

看图二,理解回退到仓库中最新的那个版本:因为 git reflog 能记录 git reset和git commit <file> -m "string"的动作,所以可以

使用git reflog来查看每个动作的id号,然后通过id号回退到最新的那个版本append GPL

[实践出真知]

$ git reflog                                         #罗列出所有的HEAD动作
9682929 HEAD@{0}: reset: moving to HEAD^
f78cd09 HEAD@{1}: commit: append GPL                 #append GPL 的id是 f78cd09
9682929 HEAD@{2}: commit: add distributed
51af5b3 HEAD@{3}: commit (initial): wrote a readme file


$ git reset --hard f78cd09 #移动HEAD指针到 f78cd09 append GPL $ git log --pretty=oneline #查看是否切换到append GPL 这个版本 f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

 接下一篇:git的使用(二)

参考git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

 





原文地址:https://www.cnblogs.com/horizonli/p/5323363.html