• 重要概念:
    • 版本控制系统
      • CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统。
      • 集中式版本控制系统,版本库集中存放在中央服务器。
      • 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库。
    • 工作区(Working Directory):就是你在电脑里能看到的目录
    • 版本库(Repository):工作区有一个隐藏目录“.git”,这个不算工作区,而是Git的版本库
      • stage:(或者叫index)的暂存区
      • master:Git为我们自动创建的第一个分支
      • HEAD:指向master的一个指针
    • 往Git版本库里添加文件
      • !每次修改,如果不add到暂存区,那就不会加入到commit中。
        • 第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;
        • 第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支。
        • 把两次修改合并后一块提交:第一次修改 -> add -> 第二次修改 -> add -> commit
  • 操作命令:
    • git config初始配置(自报家门):

    • --global参数表示你这台机器上所有的Git仓库都会使用这个配置

      • $ git config --global user.name "Your Name"
      • $ git config --global user.email "[email protected]"
    • git init创建初始化仓库:

      • $ mkdir learngit
      • 创建一个空目录
      • $ git init
      • 把这个目录变成Git可以管理的仓库
    • git add添加文件到仓库:

      • $ git add readme.txt
      • 可反复多次使用,添加多个文件
    • git commit提交文件到仓库

      • $ git commit -m "wrote a readme file"
      • -m后面输入的是本次提交的说明,可以输入任意内容
    • git status显示当前的状态

    • 告诉我们工作区和版本库就不一致的情况

      • $ git status

        On branch master

        Changes not staged for commit:

        (use "git add/rm <file>..." to update what will be committed)

        (use "git checkout -- <file>..." to discard changes in working directory)

        deleted: test.txt

    • git diff查看difference

    • 显示的格式正是Unix通用的diff格式

      • $ git diff readme.txt
    • git log显示从最近到最远的提交日志查看版本变更

    • --pretty=oneline参数减少信息输出

      • $ git log --pretty=oneline
    • git reset回退到上一个版本

      • $ git reset --hard HEAD^
      • Git在内部有个指向当前版本的HEAD指针,HEAD指向的版本就是当前版本,上上一个版本就是HEAD^^,往上100个版本写成HEAD~100。
      • $ git reset --hard 3628164
      • 若git log命令显示commit id是“3628164...”,于是就可以根据指定回到过去/未来的某个版本
    • git reflog用来记录你的每一次命令:

    • 查看commit_id,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

      • $ ea34578 HEAD@{0}: reset: moving to HEAD^
      • $ 3628164 HEAD@{1}: commit: append GPL
    • git checkout -- file可以丢弃工作区的修改

    • -- file命令中的“--”很重要,没有“--”,就变成了“创建一个新分支”的命令(add之前)

      • $ git checkout -- readme.txt
    • git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区

    • 既可以回退版本,也可以把暂存区的修改回退到工作区。(commit之前->add之前)

      • $ git reset HEAD readme.txt
    • git reset --hard HEAD^回退到上一个版本(已经在master中了)

    • 还没有把自己的本地版本库推送到远程。(commit之后)

      • $ git reset --hard HEAD^
    • git rm从版本库中删除该文件

      • $ git rm test.txt
      • $ git commit -m "remove test.txt"
    • git checkout原理是用版本库里的版本替换工作区的版本

    • 无论工作区是修改还是删除,都可以“一键还原”。

      • 解决工作区删除了/修改错了的问题
      • 只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容(还未提交的修改)