标签 git 下的文章

场景描述:开发过程中,偶尔会遇到比如某个模块功能已经修改完成,但是因为需求变更,修改的地方不需要改了,这个时候就需要对修改的代码恢复原状,这时候只需要把修改的代码的 commit 进行删除,那么相应的修改操作也就恢复了;

••••••

这几天想要把一个 git 仓库中已经存在的一个子文件夹独立成一个新的 git 仓库,并且保留之前关于此文件夹的所有提交历史。不过我对 git 并没有这么精通,只好上网搜索之。可能是因为我关键词抓得不准,搜了好一会儿才找到可行的方案,所以写篇博文记录一下,希望能帮到后来人。

另外,在 git 里这种掌控历史的感觉真棒(笑)

0x01 需求分析

我为什么会有如本文标题所述这样的需求呢?这是因为我之前把所有为 Blessing Skin 这个程序编写的插件源码都放在一个 git repo 中了,每个子文件夹中都是一个独立的插件(因为嫌麻烦所以一股脑给塞进一个仓库里了),并且对每个子文件夹中的代码的修改最后都是在这个统一仓库中提交的。该仓库差不多长这样:

••••••

起因:不小新把记录了公司服务器IP,账号,密码的文件提交到了 git

方法:

git reset --hard <commit_id>
git push origin HEAD --force

参数:
三个参数:--soft --mixed --hard,会对 working tree、index 和 HEAD 进行重置:

  1. git reset --mixed:此为默认方式,不带任何参数的 git reset;这种方式,它回退到某个版本,只保留源码,回退commit 和 index 信息;
  2. git reset --soft:回退到某个版本,只回退了 commit 的信息,不会恢复到 index file 一级;如果还要提交,直接 commit 即可;
  3. git reset --hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容;

HEAD 最近一个提交
HEAD^ 上一次
<commit_id> 每次 commit 的 SHA1 值,可以用 git log 看到,也可以在页面上 commit 标签页里找到;

git add -Agit add .git add -u 在功能上看似很相近,但还是存在一点差别的;
git add .:它会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件;
git add -ugit add --update 的缩写,它仅监控已经被 add 的文件(即 tracked file),它会将被修改的文件提交到暂存区,不会提交新文件(untracked file)。
git add -Agit add --all 的缩写,是上面两个功能的合集。

••••••

最新闲来无事,折腾了一下 Hexo 博客系统,它是 Node.js 写的,据说速度很快。它的所有操作都可以直接在命令行完成,修改也只需要修改配置文件就可以了,不用上后台各种点击,避免各种麻烦。

Hexo 博客系统架构

首先了解一下 Hexo 博客系统的架构,它是如何实现静态博客通过服务器访问的:

Hexo 博客系统架构

••••••