目录
  1. 1. Git的背景
  2. 2. git 基础教程
    1. 2.1. 本地端的版本管理流程
    2. 2.2. 进阶场景应用
      1. 2.2.1. 版本切换
      2. 2.2.2. 撤回操作
      3. 2.2.3. 管理修改
      4. 2.2.4. 删除文件
    3. 2.3. 远程仓库的使用
      1. 2.3.1. 先有本地库,再创建Github的远程库,再将两者关联
      2. 2.3.2. 先有远程库,再clone到本地
git教程

Git的背景

  • Git是什么?

    • 目前世界上最先进的分布式版本控制系统
  • 版本控制

    现实情况 希望做到的样子
  • 集中式vs分布式

    • 集中式:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
    • 分布式:每个人电脑里都有完整的版本库,不必联网
  • Git的诞生

    • Linus创建开源的Linux,志愿者提供源代码
    • Linus 抵制CVS和SVN等集中式版本控制系统,缺点必须联网才能使用。稍好一点的商业版本控制需要付费,也不开源。
    • 2002年,Linux发展十年,Linus无法通过手工方式管理,选择商业版本控制软件系统BitKeeper
    • 2005年,两者谈崩,一个月内用C语言写了一个分布式版本控制系统Git
    • 2008年,Github网站上线,为开源项目免费提供Git存储。

git 基础教程

本地端的版本管理流程

  • 创建版本库

    • 第一步:本地创建一个目录
    • 第二步:git init可以让一个目录变成可以被git管理的文件夹
      • 多出一个.git文件
      • 目录中的每一个文件都能被Git跟踪管理
        • 传统的txt,或者code等可以被跟踪到内容(第几行插入内容是…)
        • 二进制文件只能跟踪文件的大小变化(word就是个二进制文件)
  • 大象放到冰箱有3步,而Git只有两步

    • git add readme.txt

      • 这应该没有消息(代表正确)
    • git commit -m ""

      • 这步才会提醒你具体修改的文件内容
      $ 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 status

    • 概念说明:工作区+版本库

    • 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)

      Untracked files:
      (use "git add <file>..." to include in what will be committed)

      Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)

      nothing to commit, working tree clean
      1. Untrack的意思是:工作区的内容没有被加入到版本库中
      2. Changes not staged for commit的意思是:版本库中存着某个文件,现在检测到工作区修改了,接下来的可能操作有两个:
        • 将修改后的文件 git add
        • 将版本库中的文件撤回到工作区:git checkout --<file>
      3. Changes to be committed:提示你去commit再stage中的changegit commit-m""
      4. 所有都OK,则显示stage是干净的。working tree clean
  • 小节

    • 基础语法就只有三个
      • git add
      • git commit -m""
      • git status
    • 经过以上的操作,就搭建完成了一个本地端的版本管理流程。

进阶场景应用

版本切换

  • 假设对readme.txt进行了三次操作,在Git仓库中应有(通过commit区分):

    • 版本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.
  • 查看文件的修改

    • 每一个comment对应着一个comment id,可以通过git loggit log --pretty=oneline查看对应的ID号

      $ 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 --pretty=oneline

      1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
      e475afc93c209a690c39c13a46716e8fa000c366 add distributed
      eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
    • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭

      ┌────┐
      │HEAD│
      └────┘

      └──> ○ append GPL

      ○ add distributed

      ○ wrote a readme file
      • 使用git reset--hard Head^切换上一版本
      • 使用git reset--hard Head^^切换上上一版本
      • 使用git reset--hard ID切换指定ID版本
      $ git reset --hard 1094a #只需要输入ID中的前几位即可
      HEAD is now at 83b0afe append GPL
    ┌────┐
    │HEAD│
    └────┘

    │ ○ append GPL
    │ │
    └──> ○ add distributed

    ○ wrote a readme file

    注:一旦切换后,当前的版本就无法通过git log查询,需要通过git reflog查看命令历史。

撤回操作

一般而言,我们会对三种场景中需要撤回操作

  • 恢复工作区中的修改:最简单直接git checkout --file
  • 恢复缓存区的修改:
    • 将缓存区的修改撤销掉:git reset HEAD <file>
    • 再还原原本的缓存区还原原本的工作区:上步
  • 恢复版本库:需要参照上节版本切换内容

管理修改

  • 正确的做法

    第一次修改 -> git add -> 第二次修改 -> git add -> git commit

  • 比较差异

    • git diff HEAD -- <file>:比较工作区与版本库中的差别
    • git diff filename:比较工作区和暂存区

删除文件

  • git rm:同时删除版本库本地的文件
  • 等同操作:先rm <本地file>,再git add <file>等同于git rm <file>
  • 问题:
    • 如何删除版本库中的文件,而不修改工作区的文件
    • 如何查看工作区的文件
    • 关联操作不是很会,还有就是SSH是个什么东西

远程仓库的使用

  • 设置本地库与远程库的传递方式

    Git支持多种协议,默认的git://使用ssh(原生git协议速度最快),但也可以使用https等其他协议。SHH协议需要在本地创建SSH Key。秘钥分为公钥和私钥。一个私钥可以产生无数个公钥。而公钥需要提交到github网站,告知每次push都是本人操作,就不用反复输密码了。

    • 根据不同的传输方式,Github的地址可分为:
      • https://github.com/michaelliao/gitskills.git[https传输方式]
      • git@github.com:michaelliao/learngit.git[SSH传输方式]
    • 若使用SHH传输方式,需要进行以下的设置
      • 创建SHH Key $ ssh-keygen -t rsa -C "youremail@example.com"
      • 创建完毕后,在.ssh目录下就会有id_rsaid_rsa.pub这两个文件
      • 登录Github,打开“Account settings”的"SSH Keys"页面,在Key文本框中黏贴公钥id_rsa.pub的文本内容
  • 有关远程库的一些基本使用

    # 列出已经存在的远程仓库
    $ git remote
    origin

    # 列出远程仓库的详细信息,在别名后面列出URL地址
    $ git remote -v
    $ git remote --verbose
    origin https://github.com/kekec/Test.git (fetch)
    origin https://github.com/kekec/Test.git (push)

    # 添加远程仓库
    $ git remote add <远程仓库的别名> <远程仓库的URL地址>

    # 修改远程仓库的别名
    $ git remote rename <原远程仓库的别名> <新的别名>

    # 删除指定名称的远程仓库
    $ git remote rm <远程仓库的别名>

    # 修改/显示远程仓库的 URL 地址
    $ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
    $ git remoter get-url <远程仓库的别名>

先有本地库,再创建Github的远程库,再将两者关联

  1. git init:会生成.git文件夹

  2. git remote add origin https://github.com/wangjs-jacky/Jupyter-notebook.git:远程库的名称为origin,URL的传输方式是https。填入的远程仓库的地址也是https。

  3. 第一次推送master的信息git push -u origin master

    之后的提交:git push origin master

先有远程库,再clone到本地

  • 直接在桌面:git clone https://github.com/wangjs-jacky/Jupyter-notebook.git `
文章作者: Jacky
文章链接: https://wangjs-jacky.github.io/2019/12/20/git%E6%95%99%E7%A8%8B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jacky's blogs