Git、RESTful API
Git
Git工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
下图展示了 Git 的工作流程:
Git 工作区、暂存区和版本库
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 git rm –cached
命令时,会直接从暂存区删除文件,工作区则不做出改变。 - 当执行 git checkout . 或者 git checkout –
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。 - 当执行 git checkout HEAD . 或者 git checkout HEAD
命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
Git 常用命令
git init
:初始化仓库。git clone
:拷贝一份远程仓库,也就是下载一个项目。git remote(远程仓库操作)add origin ***.git
:添加文件到仓库。git push -u origin master
git push origin dev
:推送到远程仓库的dev分支。git log
:查看历史提交记录。git log --graph --pretty=oneline --abbrev-commit
git status
:查看仓库当前的状态,显示有变更的文件。git diff
: 比较文件的不同,即暂存区和工作区的差异。git add *
:添加文件到仓库。git commit -m "message"
:提交暂存区到本地仓库。- commit之后又改了一个小bug,但是又不想增加一个commit,可以用:
git commit --amend --no-edit
,直接将改动添加到上一次的commit中。 git push
:上传远程代码并合并。git pull
:下载远程代码并合并。touch .gitignore
:忽略git不必要提交的文件。git mv
:移动或重命名工作区文件。git rm
:删除工作区文件。
Git 标签管理
- 首先切换到需要打标签的分支上,然后使用
git tag v1.0
就可以在当前commit打上v1.0的标签。 git tag v1.0 commitID
对特定commit打标签。- 打标签时加上message:
git tag -a <tagname> -m "message"
。 git tag
查看所有标签。git show [tagname]
查看标签详细信息。git push origin <tagname>
可以推送一个本地标签到远程仓库。git push origin --tags
可以推送全部未推送过的本地标签。git tag -d <tagname>
可以删除一个本地标签。git push origin :refs/tags/<tagname>
可以删除一个远程标签(先从本地删除)。
Git 撤销与回滚
- 暂存区:
git add
之后commit之前存在的区域;工作区:git commit
之后存在的区域;远程仓库:git push
之后; - 作了修改,但还没
git add
,撤销到上一次提交:git checkout -f -- filename
;git checkout -f -- .
- 作了修改,并且已经
git add
,但还没git commit
:- 先将暂存区的修改撤销:
git reset HEAD filename
/git reset HEAD
;此时修改只存在于工作区,变为了 “unstaged changes”; - 再利用上面的checkout命令从工作区撤销修改。
- 先将暂存区的修改撤销:
git add
之后,作了修改,想丢弃这次修改:git checkout -f --filename
会回到最近一次git add
。- 作了修改,并且已经
git commit
了,想撤销这次的修改:git revert commitID
. 其实,git revert
可以用来撤销任意一次的修改,不一定要是最近一次。git reset --hard commitID
/git reset --hard HEAD^
(HEAD表示当前版本,几个^表示倒数第几个版本,倒数第100个版本可以用HEAD~100);参数--hard
:强制将暂存区和工作区都同步到指定的版本。git reset
和git revert
的区别是:reset是用来回滚的,将HEAD的指针指向了想要回滚的版本,作为最新的版本,而后面的版本也都没有了;而revert只是用来撤销某一次更改,对之后的更改并没有影响。- 然后再用
git push -f
提交到远程仓库。
Git 分支管理
- 创建分支:
git branch test
。 - 切换分支:
git checkout test
。 - 创建并切换分支:
git checkout -b test。
- 将test分支的更改合并到master分支:先在test分支上commit、push,再:
git checkout master
;git merge test。
- 如果合并时产生冲突:先手动解决冲突,再合并。
- 删除分支:
git branch -d test
。 git stash
- 如果当前分支还有任务没有做完,也不想提交,但此时需要切换或者创建其它分支,就可以使用stash将当前分支的所有修改(包括暂存区)先储藏起来;然后就可以切换到其它分支。
- 在其它分支工作完成之后,首先切换回原来的分支,然后使用
git stash list
命令查看。 - 可以使用
git stash apply <stash number>
恢复之前储藏的工作现场,再使用git stash drop <stash number>
删除掉储藏的内容。 - 也可以直接用
git stash pop
恢复并删除内容。
- 如果在其它分支上做了一个修改(比如修复了一个bug,这次修改有一个commitID),想要将这次修改应用到当前分支上,可以使用:
git cherry-pick commitID
,可以复制一个特定的提交到当前分支。
RESTful API
REST指Representational State Transfer,可以翻译为“表现层状态转化”。
主要思想
- 对网络上的所有资源,都有一个统一资源标识符 URI(Uniform Resource Identifier);
- 这些资源可以有多种表现形式,即REST中的“表现层”Representation,比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现。URI只代表资源的实体,不代表它的形式;
- “无状态(Stateless)”思想:服务端不应该保存客户端状态,只需要处理当前的请求,不需了解请求的历史,客户端每一次请求中包含处理该请求所需的一切信息;
- 客户端使用HTTP协议中的 GET/POST/PUT/DELETE 方法对服务器的资源进行操作,即REST中的”状态转化“。
设计原则
- URL设计
- 最好只使用名词,而使用 GET/POST/PUT/DELETE 方法的不同表示不同的操作;比如使用
POST /user
代替/user/create
。 - GET:获取资源;POST:新建/更新资源;PUT:更新资源;DELETE:删除资源。
- 对于只支持GET/POST的客户端,使用
X-HTTP-Method-Override
属性,覆盖POST方法。 - 避免多级URL,比如使用
GET /authors/12?categories=2
代替GET /authors/12/categories/2
。 - 避免在URI中带上版本号。不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI,版本号可以在HTTP请求头信息的Accept字段中进行区分。
- 最好只使用名词,而使用 GET/POST/PUT/DELETE 方法的不同表示不同的操作;比如使用
- 状态码:服务器应该返回尽可能精确的状态码,客户端只需查看状态码,就可以判断出发生了什么情况。见计算机网络部分 – HTTP请求有哪些常见状态码?。
- 服务器回应:在响应中放上其它API的链接,方便用户寻找。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ZC的学习录!
评论