git的系统学习

欢迎移步我的个人博客

由于之前对于git工具以及GitHub的使用只是停留在掌握了一些简单的命令,于是便想系统地从头学习一下~

本文参考廖雪峰的Git教程

设置签名

  • 形式:
    • 用户名:xxx
    • Email: xxx@xxx.com
  • 作业:区分不同工作人员
  • 注意:此处的签名与登录远程库的账号密码无关
  • 命令:
    • 项目/仓库级别:仅在当前本地库范围有效,信息保存在./.git/config文件
      • git config
      • git config user.name xxx
      • git config user.email xxx@xx.com
    • 系统用户级别:登陆当前操作系统的用户范围,信息保存在~/.gitconfig文件
      • git config --global
      • 同上
    • 级别优先级:
      • 就近原则:项目界别优先于系统用户级别,二者都存在时,采用项目级别
      • 只有系统用户级别则以系统用户级别签名为准
      • 不允许都没有

创建版本库/仓库/repository

  1. 选择一个合适位置,创建一个空目录,路径上不含中文

    $ mkdir learngit
    $ cd learngit
    $ pwd
    /Users/michael/learngit
    
  2. 使用git init初始化该目录为git可以管理的仓库。

    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
    

    随后目录下多出一个.git目录,用来跟踪管理repository。

    使用ls -ah可查看隐藏目录。

把文件添加到仓库

  1. 在前面创建的learngit目录/子目录下,新建一个readme.txt文件,内容为:

    Git is a version control system.
    Git is free software.
    
  2. 使用命令git add把文件添加到仓库,执行后无显示即为成功。

    $ git add readme.txt
    
  3. 使用命令git commit把文件提交到仓库。

    $ git commit -m "wrote a readme file"
    [master (root-commit) eaadf4e] wrote a readme file
     1 file changed, 2 insertions(+)
     create mode 100644 readme.txt
    

    git commit命令:-m后输入本次提交的说明,便于日后找到改动记录。

    执行成功后显示:1 file changed; 2 insertions几个文件被改动,插入了几行内容。

  4. git add <file>一次可以添加一个命令,而git commit -m <message>一次可以提交多个文件。

git status查看仓库状态

  1. 继续修改readme.txt文件为:

    Git is a distributed version control system.
    Git is free software.
    
  2. 使用git status查看结果

    $ 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:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    可以看出,readme.txt被修改了,却没有准备提交的修改。

  3. 使用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.
    

    可以看出,我们在readme.txt第一行添加了distributed单词

  4. 知道对文件做了什么修改后就可以提交到仓库了,按照前面的git add <file>git commit -m <message>命令操作。

    1. git add readme.txt
      

      无任何输出,成功。

    2. 再使用git status瞅一眼仓库当前状态。

      $ git status
      On branch master
      Changes to be committed:
        (use "git reset HEAD <file>..." to unstage)
      
      	modified:   readme.txt
      

      可以看到,将要被提交的修改包括readme.txt

    3. 随后便可以继续提交了。

      $ git commit -m "add distributed"
      [master e475afc] add distributed
       1 file changed, 1 insertion(+), 1 deletion(-)
      
    4. 提交后,再使用git status查看仓库状态。

      $ git status
      On branch master
      nothing to commit, working tree clean
      

      可以看出,没有需要提交的修改,工作目录是干净的。

版本回退

修改文件后,把修改提交到git仓库的完整步骤如下:

修改readme.txt文件如下:

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

进行提交

$ git add readme.txt
$ git commit -m "append GPL"
[master 1094adb] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

在文件修改到一定程度后,可以保存一个“快照”,这个在Git中被称为commit。在文件被改乱,或误删文件后,可以从最近的一个commit中进行恢复。

  1. 使用git log命令查看共有多少个版本被提交到仓库中。

    $ git log
    commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
    Author: Michael Liao <askxuefeng@gmail.com>
    Date:   Fri May 18 21:06:15 2018 +0800
    
        append GPL
    
    commit e475afc93c209a690c39c13a46716e8fa000c366
    Author: Michael Liao <askxuefeng@gmail.com>
    Date:   Fri May 18 21:03:36 2018 +0800
    
        add distributed
    
    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: Michael Liao <askxuefeng@gmail.com>
    Date:   Fri May 18 20:59:18 2018 +0800
    
        wrote a readme file
    

    git log命令显示从近到远的提交日志。可以看到,最近的一次为append GPL,上一次是add distributed,最早的一次则是wrote a readme file

  2. 若觉得输出信息过多,可以添加--pretty=oneline参数

    $ git log --pretty=oneline
    1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
    e475afc93c209a690c39c13a46716e8fa000c366 add distributed
    eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
    

    前面的一大串乱码一样的数字是commit id(版本号),是由SHA1计算出来的很大的数字,用十六进制表示。原因是分布式版本控制系统,需要多人在同一个仓库工作,避免冲突。

    注:每次提交一个新的版本,Git都会将他们自动串成一个时间线。

  3. 若将readme.txt回退到上一个版本(add distributed版本)。在Git中,HEAD表示当前版本,上个版本就是HEAD^,上上个版本就是HEAD^^,往前100个版本就是HEAD~100

    使用git reset命令,回退到上一个版本。

    $ git reset --hard HEAD^
    HEAD is now at e475afc add distributed
    

    查看readme.txt内容,发现已经被还原为add distributed版本。

    $ cat readme.txt
    Git is a distributed version control system.
    Git is free software.
    
  4. 此时,使用git log查看仓库状态,发现之前最新的append GPL已经看不到了,但是,只要命令行窗口没有被关掉,就还是可以找回的:向上翻,找到append GPL版本的commit id1094adb...,就可以通过git reset命令回到指定版本。版本号没必要写全,但是要足够让Git找得到唯一的那个版本。

    $ git reset --hard 1094a
    HEAD is now at 83b0afe append GPL
    

    注:Git版本回退很快,在Git内部由一个指向当前版本的HEAD指针,在回退版本的时候,Git仅仅是把HEAD指针从指向append GPL改为指向add distributed,顺便把工作区的文件更新了。所以,让HEAD指向哪个版本号,当前的版本就是哪个。

    ┌────┐                                  ┌────┐
    │HEAD│                                  │HEAD│
    └────┘                                  └────┘
       │                                       │
       └──> ○ append GPL                       │    ○ append GPL
            │                                  │    │
            ○ add distributed     ==>          └──> ○ add distributed
            │                                       │
            ○ wrote a readme file                   ○ wrote a readme file
    
  5. 当你使用了git reset --hard HEAD^回退到add distributed版本后,想要再恢复回append GPL版本时,必须要找到append GPLcommit id

    但是若你已经把命令行窗口关闭,并且关闭了电脑,该如何恢复到新版本?

    可以使用git reflog命令来显示Git记录下来的你的每一次命令。

    $ git reflog
    e475afc HEAD@{1}: reset: moving to HEAD^
    1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
    e475afc HEAD@{3}: commit: add distributed
    eaadf4e HEAD@{4}: commit (initial): wrote a readme file
    

To Summarize:

  1. 初始化一个Git仓库,使用git init命令。

    添加文件到Git仓库,分两步:

    使用命令git add,注意,可反复多次使用,添加多个文件;

    使用命令git commit -m,完成。

  2. 要随时掌握工作区的状态,使用git status命令。

    如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

  3. HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

    穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值