基本概念

文件状态

  • Git仓库目录: Git用来保存项目的元数据和对象数据库的地方.这是Git中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据.
  • 工作目录: 对项目的某个版本独立提取出来的内容.这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改.
  • 暂存区域: 一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中.有时候也被称作“索引”,不过一般说法还是叫暂存区域.

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件.
  2. 暂存文件,将文件的快照放入暂存区域.
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录.

如下图

项目状态

每次commit之后会生成一个状态,每个状态都可以看作一个节点.

git diff可比较两个节点的不同.

HEAD可以看作指向当前节点的指针,其值和节点的hash值一致.

git checkout命令就是移动HEAD的命令.

如果checkout后面是分支名,该分支会和HEAD同步.

如果checkout后面不是分支名,而是某个commit节点,则当前不属于任何分支.分支不会改变

分支可以看作是也是指向节点的指针.最开始的分支名为master.

和分支的命令是git branch相关.

git checkout -bgit branch branch_name && git checkout branch_name的缩写.(虽然我觉得这容易造成对checkout的不理解)

移动分支的命令是git branch -f branch_name HEAD~3

git reset可以看作是对commit的撤销.

git revert可以看作是commit的撤销,只是这种撤销为反向的commit的形式.

这两种撤销形式都是对当前的branch进行的.

git cherry-pick可以把另一条分支的commit抓取到当前分支直接作为当前的分支的commit

有趣的是,这里cherry-pick意为采摘樱桃

但是cherry-pick有个不好的地方就是,一定要知道所要采摘的commit的hash值.

这里利用git rebase -i即交互式的变基方法可以解决这个问题.

目前为止,分支和HEAD两个东西差不多理清了.它们可以看作指向分支的指针.

但是有个问题,就是这些指针随时可以改变的.

有什么东西可以总是指向某个节点吗?

这就是git tag.它在代码库中起着锚点的作用.

git describe --tags可以对分支进行描述.

git clone可以克隆远程仓库

远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。

git fetch是对本地远程分支origin/master操作,而不是当前分支.它只做两件事

  • 下载远程仓库数据
  • 移动远程分支

git pull实际上就是git fetchgit merge的缩写(虽然没觉得这样很好).

git push会把远程仓库跟当前master分支同步,同时远程分支origin/master也同步了

命令

git diff可比较

参考图

参考

pro git
git可视化交互场(强烈推荐)

经验

  1. github和jsdeliver的cdn同步仓库必须为public,否则不会生效.

问题解决方案

  1. git push的时候每次都要输入用户名和密码的问题

原因是在添加远程库的时候使用了https的方式…所以每次都要用https的方式push到远程库

# 查看协议
git remote -v
# 重新设置委ssh的方式
git remote rm origin
git remote add origin git@github.com:username/repository.git
git push -u origin master
  1. 将博客的source文件夹添加到github pages的同一仓库的不同分支

这里要注意本地的分支名应该要和远程的分支名一致.在远程分支创建source分支后,本地分支也需要创建source分支并切换至该分支.

# 初始化仓库
git init
# 添加远程仓库
git remote add origin git@github.com:misaka7690/misaka7690.github.io.git
# 添加source文件
git add .
git add -A
git add -u
git commit -m "autoupload by cmd"
# 本地创建source分支
git checkout -b source
# 强制推送至远程source分支
git push --set-upstream  origin source -f
  1. 每次开机时github都要输入账号和密码

在 C:\Users{用户名}中的.gitconfig文件,文本编辑器打开,记事本就可以,添加一行

[credential]

helper = store

  1. 取消上次commit

语法格式如下

git reset --option HEAD^

此处option有三种选择:

  • mixed(默认参数): 不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
  • soft: 不删除工作空间改动代码,撤销commit,不撤销git add .
  • hard: 删除工作空间改动代码,撤销commit,撤销git add .

另外对于HEAD^,其等价HEAD~1,如果要撤回连续n次commit,只需改为HEAD~n.

  1. git命令行显示分支图
git log --graph --decorate --oneline  --all
  1. github markdown显示latex

使用云服务

![](http://latex.codecogs.com/gif.latex?\\frac{\\partial J}{\\partial \\theta_k^{(j)}}=\\sum_{i:r(i,j)=1}{\\big((\\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\\big)x_k^{(i)}}+\\lambda \\xtheta_k^{(j)})
  1. git远程合并仓库(无冲突)
git pull origin master --allow-unrelated-histories
  1. git 根据commit信息回到某个版本

  2. git修改默认编辑器为vim

git config --global core.editor vim

我很好奇