git - msforest/notebook GitHub Wiki

学习资料

tutorials
pro git

git

$ ssh-keygen -t rsa -C "[email protected]"
	创建ssh key,根据提示进行操作,可一直按ENTER键,输出的内容会有密钥生成的路径,将公钥copy到git上
$ git remote add origin [email protected]:msforest/learngit.git
	关联远程仓库
$ ssh -T [email protected]
	验证是否远程链接成功
$ git push -u origin master
	上传到远程仓库
$ ssh -T -i ~/.ssh/id_rsa [email protected]
	输入此命令判断ssh key被哪个用户名占用
$ git remote set-url origin [email protected]:msforest/gitskills.git

git 配置文件

  • .git/config
    • 特定仓库下的配置,可用--file 修改,是默认选项;.git/config
  • ~/.gitconfig
    • 用户特定的配置,可用--global 修改;/.gitconfig 或/config/git/config
  • /etc/gitconfig
    • 系统范围的配置,可用--system 修改;该文件可能不存在,也可能在/usr/local/etc/gitconfig 下
  • git diff 默认显示暂存区域与工作目录之间的差异,即修改还未被 add 的文件

    • --stage[cached] 查看已暂存区域与工作目录之间的差异
    • git diff master...featureA 该命令仅会显示自当前特性分支与 master 分支的共同祖先起,该分支中的工作。 对于 diff 命令来说,你可以通过 把 ... 置于另一个分支名后来对该分支的最新提交与两个分支的共同祖先进行比较。
    • git diff master..test 两个分支比较(two dots vs three dots)[https://matthew-brett.github.io/pydagogue/git_diff_dots.html]
    • git diff --numstat commit..commit 同下
    • git diff --stat commit..commit 列出变化的文件(同 log 的参数)
    • git diff commit..commit -- filename 查看 filename 文件的差异
    • --check 检查空白错误
  • git log

    • origin/master..master 比较远端和本地分支相差的记录,查看在 master 分支而不在 origin/master 分支上的 commit commit1..commit2 显示区间 commits
    • master...dev 选择出被两个引用中的一个包含但又不被两者同时包含的提交 --left-right
    • --graph --pretty=oneline --abbrev-commit --all 显示 ascii 图形
    • --decorate[=short|full|auto|no] Print out the ref names of any commits that are shown
    • --stat displays the number of insertions and deletions to each file altered by each commit
    • -p displays apply patch by each file/ 也可查看指定文件的提交历史 git log -p 26ecad1查看此 commit 和之前的差异,-1查看当前 commit 的差异 git log -p xxx.md查看指定文件的提交历史差异
    • -S"xxx" 搜索内容,显示搜索的内容在哪一个 commit 中
    • --grep="xxx"
    • -- file 通过文件过滤 commit
    • --no-merges
  • git bisect 用于调试线上缺陷

    • start / good / bad / reset
  • git reflog

  • git gc

  • git prune 删除无效 commit,结合 git fsck 使用

  • git remote show origin

    • set-url --add origin xxx 添加多个仓库
    • prune: 删除远端已经删除的分支但在本地存在的分支。 same as git fetch --prune
  • git clone

    • -o 修改 origin
  • git branch b1 [master^] 不会切换到新分支 b1

    • 基于当前分支创建新分支 b1
    • master^ 基于 master 分支的上一个 commit 创建一个新分支 b1
    • --track 远程版本追踪
    • -v[v] 查看每一个分支的最后一次提交(也可查看设置了上游分支的分支)
    • -r 显示远端分支名
    • --merged / --no-merged 过滤这个列表中已经合并或尚未合并到当前分支的分支
    • -D 强制删除分支,当分支未合并时使用
    • -d 删除分支
    • -a 列出所有分支,包含远端分支
    • -m 重命名
    • -u 设置跟踪分支 [=== git checkout --track] git branch -u origin/xxx为当前分支设置上游
  • git checkout -b b1 [master^] (= git branch + git checkout) 会自动切换到新分支 b1

    • 同上
    • --track 设置跟踪分支
  • git reset

    • --soft 移动 HEAD 和 master 指向指定 commit,索引区和工作目录不变
    • --mixed 移动 HEAD 和 master 指向指定 commit,索引区也指向指定 commit,工作目录不变,默认设置
    • --hard 移动 HEAD 和 master 指向指定 commit,索引区和工作目录也指向指定 commit
    • --[soft|mixed|hard][head^^|head~3]
    1. 移动 HEAD 分支的指向 (若指定了 --soft,则到此停止)
    2. 使索引看起来像 HEAD (若未指定 --hard,则到此停止)
    3. 使工作目录看起来像索引
  • git revert 撤销指定 commit,不是撤销 head 到 commit 之间的内容,git 会生成一个新的 commit

    • -m (mainline) 当 commit 为合并提交,需指定该参数,表示要保留的内容,撤销另一个父节点内容
  • git rebase 变基提交

    • -i master~4
    • --onto: git rebase --onto master server client取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把 client 提交的 commit 以 master 为父节点,即仅仅是简单修改了 client 的父节点,还没有被 merge 到 master 分支。page85 git rebase master client将 client 的父节点修改为 master,并切换分支到 client 所有的变基操作,只是修改分支的父节点,并没有做 merge 操作,所以还要做合并操作 onto
  • git stash

    • show
    • save 默认暂存工作区和暂存区修改的文件,[--keep-index: 只暂存工作目录,不赞成缓存区]
    • pop
    • apply
    • branch 利用 stash 栈顶 commit 创建新分支并执行git stash drop stash@{0}命令
  • git show-branch 显示分支名和提交 ID

    • --more=4 master
  • git format-patch 生成补丁

    • r1..r2 这里的区间是由 show-branch 得出的
    • [commit sha1 id] -n
    • r1 从指定 commit 开始生成 patch,不包含 r1
  • git am/apply 应用补丁

  • gitk the git repository browser

  • git pull

    • --rebase 默认是 merge,fetch+merge => fetch+rebase
  • git merge git merge feature master => git checkout feature + git merge master

    • 快进合并:指两者分支的 HEAD 指向同一个祖先,直接把 B 分支的记录合并到 A 分支,并更新 A 分支的 HEAD 指向 B 的 HEAD,没有新的提交
    • 三方合并:指所在的分支和要 merge 的分支,都做了修改,即两者分支的 HEAD 不指向同一个祖先,采取使用新的提交来合并分支
    • 合并遇到冲突时不想解决,可以使用git merge --abort还原工作目录
  • git push

    • origin :dev 删除远端分支 dev
    • origin --delete dev 删除远端分支 dev
  • git clean 删除不受版本控制的文件

    • -f
  • git rev-list

  • git rev-parse: git rev-parse HEAD^

    • --short
  • git cat-file 查看 commit 的关系

  • git ls-tree

  • git fsck

  • git cherry [branch] 查找没有被合并至上游的提交

  • git cherry-pick 从别的地方复制 commit 到当前的分支上(从一些已存在的提交中应用更改)

  • git grep [msg]

    • -n 显示匹配行
    • -c 显示每个文件包含了多少行
  • git shortlog 列出贡献名单

  • git lfs 大文件存储(https://git-lfs.github.com)

    • git lfs install
    • git lfs tract '*.pdf'
  • git bundle 打包

    • create commits.bundle master ^9a466c5 打包提交区间,并命名为 commits.bundle
    • verify commits.bundle 检查这个文件是否是一个合法的 Git 包,是否拥有共同的祖先来导入。
    • list-heads ../commits.bundle 查看包里可以导入哪些分支
    • git fetch ../commits.bundle master:other-master 取出 master 分支到我们仓库中的 other-master 分支
  • git hooks hooks 存放在.git/hooks,使用 node.js 也可以写 hook,需要在文件头部添加#!/usr/bin/env node

问题

  1. merge vs rebase
  • 处理合并的时候,merge 会更改 commit,而 rebase 不会
  1. reset vs checkout vs revert 都有撤销的意思. reset 会移动 HEAD 分支的指向,而 checkout 则移动 HEAD 自身。
  • 关于文件级别的区别
Command Scope Common use cases
git reset Commit-level Discard commits in a private branch or throw away uncommited changes
git reset File-level Unstage a file/取消暂存
git checkout Commit-level Switch between branches or inspect old snapshots
git checkout File-level Discard changes in the working directory/丢弃修改
git revert Commit-level 撤销指定 commit,并提交一个新的 commit
git revert File-level (N/A)
  1. HEAD / HEAD^ / HEAD~
  • ~ 后可接数字,代表第 n 父提交。HEAD~3 === HEAD^^^
  • 当父提交是 merge 时,HEAD^2 代表第二父提交,不等于 HEAD^^,也不等于 HEAD~2 !^ vs ~
  1. git show vs git diff vs git log -p
  • git show 用于显示单个 commit 的 patch
  • git show commit -- filepath 显示单个文件的 patch
  • git log -p 显示的和 show 一样,但是它会显示之前所有的 commit 的 patch(包含当前 commit)

使用 gist

首先访问 gist 会比较慢,有时候根本打不开,这时候可以对本机 hosts 文件做一下修改

1. 访问https://www.ipaddress.com,搜索ip
2. 修改本地host文件
以Mac为例,命令行下输入:sudo vi /etc/hosts,然后输入电脑的密码,打开host文件。
3. 增加host映射
增加gist.github.com的映射。
192.30.253.118 gist.github.com
192.30.253.119 gist.github.com
4. 更新DNS缓存(可选操作)
命令行输入:sudo dscacheutil -flushcache,使增加的映射生效。

gistup

使用gistup来方便、快捷地上传文件到 gist 中,使用 npm 下载
npm install -g gistup
这是 javascript 写的一个应用程序。

然后在目录下初始化
gistup

这时候会打开浏览器访问 github 生存一个 token,然后把生成的 token 拷贝到终端下,按 enter 键进行下一步,完成以后 gist.github.com 会创建一个对应的目录,此时是空目录。我们可以在本地通过 git 常用命令把文件推送到 gist 下,然后就可以通过特定域名访问https://bl.ocks.org/xxxx/4060606

Let's Make a Block