本文通过模拟一个简单 nodejs 应用构建过程来演示常用的 git 命令。
准备实验目录
1 | mkdir todo-srv |
1 | Initialized empty Git repository in /root/todo-srv/.git/ |
使用 ls -la 命令,可以看到当前目录中多了一个隐藏目录 .git, 这个目录是Git来跟踪管理版本的。
初始化node项目
1 | npm init |
目录中多了 package.json 文件
新增名为 server.js 的文件,内容如下:
1 | var http = require('http'); |
检查当前的 git 状态
1 | git status |
系统显示:
1 | On branch master |
可以看到,新增的两个文件 package.json 和 server.js 都没有加入到git仓库中。
把文件加入仓库
在当前目录运行:
1 | git add . |
命令,将当前目录中新增的文件加入到 git 本地仓库中。 再查看状态
1 | git status |
系统显示
1 | On branch master |
提交变更
1 | git commit -m "init" |
1 | *** Please tell me who you are. |
1 | git config --global user.email "root@abc.com" |
再次提交,
1 | git commit -m "init" |
系统提示:
1 | [master (root-commit) 455d5c9] init |
再次使用 git status 查询状态,可以看到
1 | On branch master |
更改 server.js
1 | var http = require('http'); |
1 | On branch master |
提交修改,执行
1 | git add server.js |
在执行 git status, 可以没有更改但未提交的文件。
使用git log 查看更改历史
在目录中执行:
1 | git log |
系统提示:
1 | [[33mcommit 290a26658acbac2cca19232e06f434acd6ca65b9[[m[[33m ([[m[[1;36mHEAD -> [[m[[1;32mmaster[[m[[33m)[[m |
再次改变
将输出类型改为 “application/json”
1 | res.writeHead(200, {'Content-Type': 'application/json'}); |
提交改变,然后通过 git log 查看:
1 | [[33mcommit 331b541afdbe1646d297b3a129cec2d51414ec23[[m[[33m ([[m[[1;36mHEAD -> [[m[[1;32mmaster[[m[[33m)[[m |
回退到版本
要回退到上一个版本,执行:
1 | git reset --hard HEAD^ |
系统显示:
1 | HEAD is now at 290a266 change the format of result to json |
查看文件内容, 可以看到,Content-Type已经恢复为: ‘text/html’
1 | res.writeHead(200, {'Content-Type': 'text/html'}); |
查看 git log, 可以看到最后一次修改被回退了。
执行:
1 | git reflog |
1 | [[33m290a266[[m[[33m ([[m[[1;36mHEAD -> [[m[[1;32mmaster[[m[[33m)[[m HEAD@{0}: reset: moving to HEAD^ |
可以查看到版本的内部id
回复到 “331b541” 版,执行:
1 | git reset --hard 331b541 |
系统提示:
1 | HEAD is now at 331b541 change the content-type |
参考文件内容:
1 | var http = require('http'); |
执行:
1 | git log |
可以看到如下结果:
1 | [[33mcommit 331b541afdbe1646d297b3a129cec2d51414ec23[[m[[33m ([[m[[1;36mHEAD -> [[m[[1;32mmaster[[m[[33m)[[m |
再次执行 git reflog 进行比较:
1 | [[33m331b541[[m[[33m ([[m[[1;36mHEAD -> [[m[[1;32mmaster[[m[[33m)[[m HEAD@{0}: reset: moving to 331b541 |
理解暂存区
修改 server.js 文件,在文件中增加一行,申明一个 data 对象,并插入到 res 的结果中。 修改后的代码如下:
1 | var http = require('http'); |
执行:
1 | git status |
系统提示:
1 | On branch master |
使用 add 命令将改变提交到暂存区
1 | git add server.js |
继续修改 server.js 文件,加入在 data 中添加一个属性:
1 | var data = { id: 1, title: 'call tom', desc: 'call tom and jack' } |
再次用 git status 命名查看状态,看到如下结果:
1 | On branch master |
这时如果要放弃上一步的改动,可以直接运行:
1 | git checkout server.js |
再次查看 server.js 的内容,可以看到内容已经恢复了。
如果需要撤销在暂存区的修改,可以使用 rest 指令, 如下:
1 | git reset server.js |
系统显示:
1 | Unstaged changes after reset: |