Git — 从安装到操作

本文大致描述了Git的操作过程(Windows实现的,少部分与Linux不同)......


安装

  1. 在 windows 上安装 Git:
    • 访问官网,直接从官网上下载:Git
    • 安装完成之后,鼠标右键,如果出现了 Git Bash Here,则说明安装成功
    • 输入以下内容查阅版本号也可以验证安装是否成功
      git --version
  2. 因为 Git 是分布式版本控制系统,所以在安装之后必须关联到自己的用户名和邮箱上
    $ git config --global user.name "xxx"
    $ git config --global user.email "xxx@xxx.com"
    • 注意:git config 命令的 --global 参数表示的是,你这台电脑上,所有的Git仓库都会使用这个配置,
      当然,你也可以对某个仓库指定特定的用户名和邮箱,即:
      $ git config user.name "xxx"
      $ git config user.email "xxx"
  3. 查看与修改:
    • 查看用户名与邮箱
      $ git config user.name
      $ git config user.email
    • 修改用户名与邮箱其实与创建时的操作一样的,可以想象成你创建的新用户名以及邮箱覆盖掉了之前的

创建版本库

  1. 版本库仓库,仓库里面的所有文件都由Git管理,Git能跟踪每个文件的更、删、改,以便随时还原到某个时刻
  2. 创建版本库方法:
    • 创建一个新文件夹,比如我在桌面新建一个 project(在Windows系统中请保持英文名称,以免出现莫名其妙的错误)
    • 然后:右键 -> 选择 Git Bush here
    • 输入 git init,即可把这个文件夹变为Git可以管理的仓库
    • 当然,现在还只是一个“看起来为空的仓库”,其实,创建成功之后,会在该仓库中生成一个隐藏的文件夹:.git文件夹
    • 现在我们来用cmd看一下这个.git文件夹里面有什么:
      • 在对应的文件夹路径下面,输入 dir/a:h,查看隐藏文件
      • 输入 cd .git,进入对应的 .git 文件目录下面
      • 输入 dir,看里面的文件
    • 需要注意的是,这个 .git 目录是Git用来跟踪管理版本库的,emm,不要碰为好

把文件添加到版本库

假设现在我们在上述的版本库 project 下添加一个名为 first.txt,内容为My first text 的文件。

  1. 第一步:用 git add 添加文件
    • 新建文件 first.txt,内容为 My first text
    • project路径下输入命令:
      $ git add first.txt
    • 如果没有任何提示,这个过程就默默地结束了,那么恭喜你,成功了,Unix的哲学是“没有消息就是好消息”
    • 注:git add 后面可以跟多个文件,甚至是不同类型的文件,如:
      $ git add a.txt b.doc
    • 而下面提到的 git commit -m "xxx" 一次性可提交多个文件
  2. 第二步:用 git commit -m "xxx" 把文件提交到仓库
    $ git commit -m "xxx"
    • 注:未报错即为提交成功,这里引号内的内容是对这次提交的注释,即对本次提交的说明
    • 只用git commit -m会报错:error: switch 'm' requires a value,因此,强烈建议写上有意义的内容,这对阅读者更友好

穿梭过去,回到未来

  1. 我们已经学会了添加和提交,其实commit就像一个快照一样,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失
  2. 实际生活中,我们也不可能把每次的修改都记住,当然,这一点在Git上面完美解决了,我们可以用git log查看我们的历史记录:
    $ git log
    • git log命令显示从最近到最远的提交日志
    • 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
      $ git log --pretty=oneline
    • 注:那一大串的字符,其实是commit id(版本号),每提交一个新版本,实际上Git就会把它们自动串成一条时间线
  3. 现在呢,我们启动时光穿梭机,准备把first.txt回退到上一个版本,怎么做呢?
    • 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,用HEAD^就表示上一个版本,HEAD^^表示上上个版本,以此类推
    • 其实,git reset命令可以做到:
      $ git reset --hard HEAD^
      • 注:当然,还可以继续回退哈
  4. 现在应该被还原了,我们用git log查看现在版本库的状态,细心点会发现,怎么没有了最后的版本呢?那岂不是我只能回去不能回来?
    • 其实办法是有的,如果你的命令窗口没有关闭的话,你可以在回退之前找到那个最后的版本,比如我这里是dca7d8f1f6d06405f7395712f17d1c83a410cf82
    • 然后,我只需要git reset到那个版本去即可:
      $ git reset --hard dca7
    • 注:hard后面跟的是版本号,这里的版本号不需要写全,Git会自动寻找(当然也不能只写前面一两个字母,以免多个版本号无法确定是哪一个)
  5. Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向你指定的版本号
  6. 现在,你回退到了某个版本,但是关闭了电脑,打开电脑之后想恢复到新版本怎么办?找不到新版本的commit id怎么办?
    • Git提供了一个命令git reflog用来记录你的每一次命令:
      $ git reflog
    • 现在找到了版本号,就可以穿梭到过去未来啦

查看状态与追踪修改

  1. 之前我们已经成功地添加并提交了一个first.txt文件,现在,我们对该文件做一些修改,但是我们并不着急提交到Git上去
  2. 我们尝试着在命令行里面输入
    $ git status
  3. 情况如下:
  4. git status告诉我们:first.txt被修改了,但是这个修改之后的文件并未提交
  5. 那么如何查看修改的具体情况呢?答案是git diff
    $ git diff first.txt
  6. 那么,现在我们重新刷一遍流程:
    • git add first.txt添加修改后的文件(先添加才能提交,否则会报错)
    • git commit -m "..."提交修改后的文件
    • git status查看状态

工作区和暂存区

  1. 什么是工作区?
    • 工作区就是你能看到的目录
  2. 前面提到过,.git是Git的版本库,Git版本库中存放了很多东西,其中最重要的就是:
    • 暂存区:stage(有时也把暂存区叫做索引,所以暂存区也叫index)
    • Git自动创建的一个分支:master
    • 指向 master 的一个指针:HEAD
  3. 下面这幅图表示了工作区、暂存区之间的关系:
    • 左侧为工作区,右侧为版本库,在版本库中标记为 index 的区域是暂存区,标记为 master 的是master分支所代表的目录树
    • 此时 HEAD 实际是指向 master 分支的一个"游标"。所以图示的命令中出现HEAD的地方可以用master来替换
    • 图中的 objects 标识的区域为 Git的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容
  4. stagegit add,git commit的联系:
    • 前面的git add用来添加文件,实际上就是把文件添加到暂存区,同时,工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中
    • 之后的git commit用来提交文件,实际上就是把暂存区中的内容提交到当前分支,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新
    • 由于Git自动创建了一个分支:master,所以现在git commit就是往master分支上提交更改
    • 可以简单理解为,需要提交的文件修改全部放到暂存区,然后,一次性提交暂存区的所有修改

管理修改

  1. 为什么Git比其他版本控制系统设计得优秀?因为Git跟踪并管理的是修改,而非文件,跟着下面体会一下吧:
  2. 现在我们修改一下first.txt,随便为其添加一行this is new
  3. 然后,我们用git add first.txt添加,再用git status查看:
  4. 现在我们再次修改文件,我们再添加一行this is new new
  5. 我们用cat first.txt来查看一下这个文件的内容:
  6. 现在我们用 git commit -m 提交一下:
    • 为什么会显示没有修改呢?
  7. 我们回顾一下流程:第一次修改 -> git add -> 第二次修改 -> git commit
    • 因为Git管理的是修改而非文件
    • 当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是工作区的第二次修改并未放到暂存区
    • git commit只负责提交暂存区的修改,所以只提交了第一次的修改

撤销修改

  1. 现在,我们添加一行:This line is about to be revoked
  2. 我们当然可以在退出前手动删除,但是退出之后呢?
  3. 我们先用git status查看一下:
    • 现在的情况是,我在工作区修改了文件,但是我还没有提交到git上面去,我想通过git来撤销这个修改
  4. 好的,那么,试试这个命令:
    $ git checkout -- first.txt
    • 再用cat first.txt查看一下文件内容,是不是惊奇地发现,我才添加的一行内容被撤销了...
    • 注意:git checkout -- file中的--非常重要,如果没有--,就变成了切换到另一个分支的命令
  5. 现在,我们尝试着“过分一点”:我们不仅给文件添加了一个内容,而且我们还git add操作了
    • 冷静一下,git status让我们明白:现在我们只是添加到了暂存区,但是还没有提交
    • 那我们怎么撤销呢?
  6. Git同样告诉我们,用命令git reset HEAD xxx可以把暂存区的修改撤销掉(unstage),重新放回工作区:
    $ git reset HEAD first.txt
    • git reset命令既可以回退版本,也可以把暂存区的修改撤销到工作区
    • git status查看,可以明白,现在暂存区是干净的,工作区有修改
    • 我们再用git checkout -- first.txt丢掉工作区的修改吧,让这个世界彻底清净.

删除文件

  1. 通常删除文件时,直接在文件管理器中把没用的文件删了,或者用rm命令删了:
    $ rm first.txt
  2. 我们现在删除文件,然后通过git status命令会立刻明白哪些文件被删除了:
  3. 现在你有两个选择;
    • 一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
      $ git rm first.txt
      $ git commit -m "remove first.txt"
    • 二是你删错文件了,但是因为版本库里面还有,所以可以很轻松地把误删的文件恢复到最新版本:
      $ git checkout -- first.txt
      • git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
  4. 命令git rm用于删除一个文件,如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

本地代码上传到远程仓库(GitHub)

这里我举例把本地的example文件夹中的所有内容(这里只有一个index.html)上传到GitHub仓库中去

  1. 创建版本库
    $ git init
  2. 将代码上传到本地的Git仓库中
    • 首先,我们得清楚的是,我们要做的是将本地的仓库与远程的GitHub仓库关联起来
    • 那么,我们必须先把代码先上传到本地的Git仓库中
    • 前面,我们只是新建了一个Git仓库,这个仓库显然还是空的,那么,我们现在上传本地代码:
      $ git add index.html
      $ git commit -m "first"
    • 至此,本地工作完毕,接下来操作GitHub的Git仓库
  3. 在GitHub中创建一个Git仓库
    • 注:这里的仓库名随意,除了取名外其他项均可不管
    • 成功创建如下:
  4. 其实在创建成功的那一页,GitHub下面有相关的提示,OK,那么我们现在根据提示来关联到GitHub上:
    $ git remote add origin git@github.com:xxx/xxx.git
    • 注:这里的git@github.com:xxx/xxx.git其实就是你的仓库的地址
    • 添加后,远程库的名字就是origin,这是Git默认的名称,也可以改成别的,但是origin已是约定俗成吧
  5. 关联成功之后,就该传代码啦!
    $ git push -u origin master
    • 注:其实git push命令实际上就是把当前的分支master推送到远程
  6. 可在你的GitHub仓库中查看是否上传成功:(样例如下)
  7. 我们还差最后一步:将本地内容推送到GitHub上(总不能改一次代码就建一个仓库吧)
    • 很简单,假设我现在在目录下做了改动(我对index.html做了改动)
    • 那么,一条命令即可更新远方的index.html
      $ git push origin master
  8. 细节
    • 细心的朋友可能会发现,似乎刚才的$ git push origin master只能刷新index.html,而假如说我在文件夹新建了new.txt,这条命令并不会因此就帮我上传到GitHub
    • 还记得之前说过的么?GitHub是被本地Git仓库关联的,也就是说,只是新建了new.txt,都没有传到本地Git上去,怎么可能传到GitHub上去呢?
    • 好吧,不多费口舌了,直接扔答案吧:
      $ git add new.txt
      $ git commit -m "second"
      $ git push origin master

    • 最终,我们成功在GitHub更新了!也就拥有了真正的分布式版本库!

从远程库克隆(略过)


本次博客先更新到这里,之后若有需要会再次探讨Git世界

git
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

推荐使用cmder

1个月前 评论
Ozzie (楼主) 1个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!