Loading

Git 使用详解 & 基本命令用法

简介

  • 本文是廖雪峰 Git 教程个人学习笔记。
  • Git 是 Linux 创始人 Linus 为了方便管理 Linux 代码写的一个分布式版本控制系统。
  • 集中式和分布式:除了分布式的版本控制系统,对应的还有集中式版本控制系统,例如 CVS 和 SVN,集中式版本控制系统需要一个主服务器,像一个图书馆,借完书还要还书。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改。
  • 实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份 到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。GitHub 就是 这么一个 Git 远程仓库。

初始化 Git 设置 - git config

  • 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门。Git 需要设置一个 username 和 email 地址作为身份来关联你的 commit 操作,这里的 username 和 Github 用户名不是一个东西。
    • 为电脑上每一个仓库(repository)设置:
      $ git config --global user.name "Mona Lisa"
      $ git config --global user.email "email@example.com"
      # 验证用户名
      $ git config --global user.name
      > Mona Lisa
      
    • 为某个仓库单独设置:
      # 首先cd到仓库的目录下
      $ git config user.name "Mona Lisa"/
      

初始化 Git 仓库 & 提交

  • 使用 git init 命令把一个目录变成 Git 可以管理的仓库。
  • 在目录中新建一个 readme.txt 文件,并写入内容如下:
    Git is a version control system.
    Git is free software. 
    
    1. 使用 git add readme.txt 告诉 Git 把文件添加到仓库。
    2. 使用 git commit -m "wrote a readme file" 告诉 Git 把文件提交到仓库,并简要说明变更。
      $ git commit -m "wrote a readme file"
      [master (root-commit) 08035c7] wrote a readme file
       1 file changed, 2 insertions(+)
       create mode 100644 readme.txt
      
  • Git 中提交一定是两步:git addgit commit
  • Git 中分为工作区和暂存区(stage),工作区即目录中除 .git 目录之外的所有文件。git add 把文件修改添加到暂存区(staged),git commit 把暂存区所有内容提交到当前分支。
  • 如果对某个文件的修改不先用 git add 到暂存区,那么 git commit 就不会提交这个修改。
  • 创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

提交为什么要分成两步?

参考:https://www.zhihu.com/question/19946553/answer/13759819

  • 使用 git add 的好处主要有三点:分批提交、分阶段递交和便于回退
  • 分批提交:比如,你修改了 a.py, b.py, c.py, d.py,其中 a.py 和 c.py 是一个功能相关修改,b.py,d.py属于另外一个功能相关修改。那么你就可以采用:
    git stage a.py c.py
    git commit -m "function 1"
    git stage b.py d.py
    git commit -m "function 2"
    
  • 分阶段提交:比如,你修改了文件 hello.py,修改了一些以后,做了 git add hello.py 动作,相当于对当前的 hello.py 做了一个快照。之后又做了一些修改,此时如果运行 git commit,则只会对第一次的快照进行提交,当前内容还保存在工作区。
  • 方便回退:做了部分修改以后,进行 git add,然后任何时刻,都可以回退到 git add 时的状态:git checkout -- hello.py ,该命令详见下文。

查看变动状态 - git status & git diff

  • 修改 readme.txt 的内容:
    Git is a distributed version control system.
    Git is free software.
    
  • 运行 git status 查看仓库当前状态。输出告诉我们,readme.txt被修改过了,但修改还未准备提交。 :
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <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 看看具体修改了什么内容,即显示当前工作区的文件和暂存区文件的差异。得到如下输出:
    $ git diff
    diff --git a/readme.txt b/readme.txt
    index d8036c1..013b5bc 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.
    
    • git diff :显示工作区和暂存区的差异
    • git diff --staged :显示暂存区和上次提交的差异
    • git diff HEAD :显示工作区和上次提交的差异
  • 再使用 git add 命令之后运行 git status,输出告诉我们对 readme.txt 的修改已准备好提交
    $ git add readme.txt
    
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   readme.txt
    
  • 最后使用 git commit -m "add distributed" 提交即可

查看 commit 日志 - git log

  • 再一次修改 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"
    
  • 现在对 readme.txt 的修改了相当经历了三个版本,使用 git log 命令查看从最近到最远的提交日志:
    $ git log
    commit 6c6c620d747bf718d25c720dc56ec4c4ca1a1699 (HEAD -> master)
    Author: Max <max@max.com>
    Date:   Thu Apr 30 03:07:40 2020 +0800
    
        append GPL
    
    commit 173bd040d5a795dec81586f7da03a27395199901
    Author: Max <max@max.com>
    Date:   Thu Apr 30 03:02:37 2020 +0800
    
        add distributed
    
    commit 08035c7d90fbedf8b88030f456cd0c3c9c0cfcbb
    Author: Max <max@max.com>
    Date:   Thu Apr 30 02:34:20 2020 +0800
    
        wrote a readme file
    
  • 如果输出信息过多,加上 --pretty=oneline 参数:
    $ git log --pretty=oneline
    6c6c620d747bf718d25c720dc56ec4c4ca1a1699 (HEAD -> master) append GPL
    173bd040d5a795dec81586f7da03a27395199901 add distributed
    08035c7d90fbedf8b88030f456cd0c3c9c0cfcbb wrote a readme file
    
  • 上面每条日志中一大串类似 6c6c6... 的是 commit id(版本号)

时光机 - 版本回退 - git reset

  • 现在我们要把当前版本 "append GPL" 回退到上一个版本 "add distributed" ,就可以使用 git reset 命令,执行后文件会被立刻还原:
    $ git reset --hard HEAD~
    HEAD is now at 173bd04 add distributed
    
  • 在 Git 中 HEAD 表示当前分支的最新提交(即最新版本),上一个版本就是 HEAD^,上上一个版本就是HEAD^^。
  • 上 n 个版本也可以写成 HEAD~n。注意在 Windows 命令行中换行符是 ^,所以用 HEAD~ 或 HEAD~1 表示上一个版本也行。
  • 运行 git log 会发现 commit 日记也被还原了:
    $ git log
    commit 173bd040d5a795dec81586f7da03a27395199901 (HEAD -> master)
    Author: Max <max@max.com>
    Date:   Thu Apr 30 03:02:37 2020 +0800
    
        add distributed
    
    commit 08035c7d90fbedf8b88030f456cd0c3c9c0cfcbb
    Author: Max <max@max.com>
    Date:   Thu Apr 30 02:34:20 2020 +0800
    
        wrote a readme file
    
  • 如果又要取消回退怎么办?可以在命令行窗口往上翻,找到之前 append GPL 的 commit id 是 6c6c62...,于是就可以用commid id 指定回到未来的某个版本,版本号没必要写全,前几位就可以了:
    $ git reset --hard 6c6c62
    HEAD is now at 6c6c620 append GPL 
    
    如果之前的 commit id 命令行里找不到,可以用 git reflog ,这个命令可以查看所有使用过的命令历史:
    $ git reflog
    6c6c620 (HEAD -> master) HEAD@{0}: reset: moving to 6c6c62
    173bd04 HEAD@{2}: reset: moving to HEAD~
    6c6c620 (HEAD -> master) HEAD@{3}: commit: append GPL
    173bd04 HEAD@{4}: commit: add distributed
    08035c7 HEAD@{5}: commit (initial): wrote a readme file
    

使用 git checkout 和 git reset HEAD 撤销修改

  • 如果文件修改还未使用 git add 添加到暂存区,要想撤销修改,既可选择手动将文件恢复,
    也可以使用 git checkout -- readme.txt 。这个命令可以方便地把文件恢复到上次添加到暂存区时的状态,即让这个文件回到最近一次 git addgit commit 时的状态。
  • 如果修改已经添加到了暂存区,但是要恢复到上次提交时的状态 ,
    则先需要执行 git restore --staged readme.txtgit reset HEAD readme.txt,用于撤销往暂存区的修改(unstage)。最后再用上面讲的 git checkout -- readme.txt 即可最终恢复到上次提交时的状态。
  • 如果修改已经 commit,直接版本回退即可。

删除文件 git rm

  • 删除文件同样是一种修改操作。
  • 当从工作目录中删除了文件后,导致工作区和版本库不一致,所以运行 git status 命令便会立刻告诉你有文件被删除了。
  • 如果确实要删除,那就用命令 git rm 从版本库中删掉,然后 git commit
  • 如果属于误删,使用 git checkout -- readme.txt 即可恢复到上次提交时的状态。
posted @ 2020-08-19 11:05  x0c  阅读(319)  评论(0)    收藏  举报