reflog
可以看到 HEAD 的移动记录,假如之前误删了一个分支,可以通过 git reflog
看到移动 HEAD 的哈希值
从图中可以看出,HEAD 的最后一次移动行为是 merge
后,接下来分支 new
就被删除了,那么我们可以通过以下命令找回 new
分支
git checkout 37d9aca git checkout -b new
PS:reflog
记录是时效的,只会保存一段时间内的记录。
stash
用于临时保存工作目录的改动。开发中可能会遇到代码写一半需要切分支打包的问题,如果这时候你不想 commit
的话,就可以使用该命令
git stash
使用该命令可以暂存你的工作目录,后面想恢复工作目录,只需要使用
git stash pop
这样你之前临时保存的代码又回来了
该命令可以让和 merge
命令得到的结果基本是一致的。
通常使用 merge
操作将分支上的代码合并到 master
中,分支样子如下所示
使用 rebase
后,会将 develop
上的 commit
按顺序移到 master
的第三个 commit
后面,分支样子如下所示
Rebase
对比 merge
,优势在于合并后的结果很清晰,只有一条线,劣势在于如果一旦出现冲突,解决冲突很麻烦,可能要解决多个冲突,但是 merge
出现冲突只需要解决一次。
使用 rebase
应该在需要被 rebase 的分支上操作,并且该分支是本地分支。如果 develop
分支需要 rebase
到 master
上去,那么应该如下操作
## branch develop git rebase master git checkout master ## 用于将 `master` 上的 HEAD 移动到最新的 commit git merge develop
这是一个很经典的面试题,在这题中可以将本文讲得内容都串联起来。
DNS 的作用就是通过域名查询到具体的 IP。
因为 IP 存在数字和英文的组合(IPv6),很不利于人类记忆,所以就出现了域名。你可以把域名看成是某个 IP 的别名,DNS 就是去查询这个别名的真正名称是什么。
在 TCP 握手之前就已经进行了 DNS 查询,这个查询是操作系统自己做的。当你在浏览器中想访问 www.google.com
时,会进行一下操作:
以上介绍的是 DNS 迭代查询,还有种是递归查询,区别就是前者是由客户端去做请求,后者是由系统配置的 DNS 服务器做请求,得到结果后将数据返回给客户端。
PS:DNS 是基于 UDP 做的查询。