zoukankan      html  css  js  c++  java
  • Git命令非主流札记

            使用git做开发的版本管理也有一年半之多了,但是始终都是常用的branch commit status diff push等一些再常用不过的命令,最近闲下来,打算学习一下高端用法,所以就静下心来好好读了一下蒋鑫老师的《Git权威指南》,果然受益匪浅,加上之前搭建过gerrit审核服务器,做过gitiles搭建等,感觉目前来说对于git能算是一个小小的里程碑了,记录一下觉得很有用的命令。


    常用篇:

    git commit -s 
    提交信息中会存有Signed-off-by: <user.name> <user.email>信息
     
    git commit -am
    添加当前本地修改并写commit信息
    如 git commit -am 'test'
     
    git log --graph --oneline
    简介显示git log,一行,树状图形。
     
    git log -p
    显示每个commit的diff信息
     
    git log --stat [-num]
    显示每个commit所修改的文件信息,显示最近num次
     
    git tag <tag name>
    在当前位置创建tag,加-m参数后可跟描述
     
    git tag -d <tag name>
    删除某tag
     
    git tag -ln
    显示当前的tag及描述列表
     
    git push <remote> <tag>
    推送本地tag至远端remote
     
    git push <remote> :<tag>
    删除远端tag
     
    git diff --word-diff
    逐词比较
     
    git clone [--bare] [--mirror] repository directory[.git]
    不带参数的时候就是将repository 克隆到本地成为工作区,版本库在.git目录下
    --bare 是克隆到本地成为git裸版本库,可以对其进行推送(git push)
    --mirror 是克隆到本地成为git版本库,对上游版本库进行了注册,所以在此版本库中可以执行git fetch操作进行持续更新


    进阶篇:

    git stash [sava <message>]
    将工作区修改暂存
     
    git stash list
    查看保存的进度
     
    git stash pop <stash>
    将git stash暂存的修改弹出
    stash为git stash list的标号
     
    git stash clear
    删除所有存储的进度
     
    git stash drop <stash>
    删除一个保存的进度,默认是最新的那个
     
    git rev-parse --show-toplevel
    显示当前git仓储的绝对路径
     
    git format-patch [-s] <since> <till>
    将从since到till的commit转换成patch,-s代表需要签名。
     
    cat *.patch | git am
    应用git format-patch生成的patch
     

    BUG篇:

    git blame [-L <num>] <file>
    文件追溯,如果某个文件(哪行)导致了一个bug,可以通过这个命令快速查看这里是谁提交的,例:
    git blame -L 6, +10 main.c 看main.c从第六行起后边10行的commit信息。
     
    二分查找
    git bisect start [BAD] [GOOD]
    开始记录二分查找
     
    git bisect good/bad
    把某个commit标记为好/坏的版本
     
    如果有标记错的情况:
    git bisect log > logfile
    git bisect reset
    编辑logfile将错误的那条删除或#注释,然后
    git bisect replay logfile
     
    git bisect run [cmd]
    bisect支持自动搜索,cmd可以是shell命令,shell脚本,其他脚本等等。如:
    git bisect run make
    git bisect run ~/test_case.sh
    git bisect run sh -c 'make'
    返回0代表good
    返回125代表跳过
    返回1~127(除125)代表bad
     

    反悔篇:

    git reflog show dev
    查看本地分支dev的提交记录,可用于恢复reset的内容
    e875f66 dev@{0}: merge e875f66afec3177c69f420e5c23d78887676ae4a: Fast-forward
    2923439 dev@{1}: merge 29234390a3b0a65be9c9e751914ecc0d0a175ba3: Fast-forward
    bc51812 dev@{2}: merge bc51812ad4faf78421cb4ccff4b8bb9d1badab13: Fast-forward
     
    git reset --hard dev@{2}
    恢复到dev@{2}处,相当于反操作0 1的动作。
     
    git commit --amend [-m <commit message>]
    修改已经commit过的commit信息
     
    git checkout [commit/branch/tag...] --path
    将本地path文件回复至某个点时的状态,如 git checkout HEAD^ --README
     
    git reset --soft HEAD^^
    多步悔棋,恢复到最近两次提交之前,然后git commit。实现多次悔棋。
     
    git commit -C [commit/branch/tag...]
    提交的时候 commit信息用某个点的
     
    git checkout master
    git reset --hard HEAD@{1}
    将master分支重置与最新的提交上
     

    变基篇:

    git rebase
    个人认为最难理解的一个命令,一度想要放弃理解,终于在实践后得到部分理解。故记录。
     
    git rebase --onto <base> <since> <till>
    首先会切换至base,相当于 git checkout base
    然后cherry-pick since以上(不包括since)直到till(包括till)之间的所有commit
     
    在原git树上的自上到下的结构应该是 till > since > base
    执行命令后其实就相当于丢弃了base(不包含)到since(包含)之间的其他commit
     
    如果till就是HEAD,则可省略HEAD,即: git rebase --onto base since
    PS:since till也可以是别的线上的提交
     
    git rebase -i <commit/tag/...>
    交互式编辑,采用修改文件的方式自动变基。后接参数为“基”,修改配置文件的时候需要注意:
    从上到下的顺序为最老提交到最新提交,与gitk qgit等顺序相反。
    删除/跳过:删除那一行的commit信息
    合并: 将自动的pick改为squash,则将与上一个老commit合并
     

  • 相关阅读:
    4.3.4 查询语法基础(2)
    4.3.4 查询语法基础(1)
    一个存储过程调用另一个存储过程 (2009-12-29 13:57:05)
    4.3.3 基于行的操作
    4.3.2 基于集合的操作
    4.3 数据操纵语言(DML)
    4.2 从哪儿开始
    子查询、联合查询和连接查询
    4.1 SQL的本质
    本书说明
  • 原文地址:https://www.cnblogs.com/james1207/p/3315317.html
Copyright © 2011-2022 走看看