《SQL基础教程》简要总结 《设计师要懂心理学》读书笔记 MySQL与MariaDB学习笔记 WDT (Folly) 安装指南 -- CentOS 7 [solved]Page build failed(Jekyll) 数据包过滤及分析实例 tshark tcpdump Scala Tour 学习总结 “Docker容器和容器云”读书笔记(1) “Docker Practice”读书笔记 “图解基础设施设计模式”小结 “图解服务器端网络架构”小结 Python网络安全编程 数据包解析笔记 华为挑战赛(1) DDoS攻击防御与云服务 基于网络回溯分析技术的异常行为分析 “Linux程序设计”小结(进程间通信) C语言编程规范(华为软件精英挑战赛) 2017阿里在线编程题--单源最短路径问题 2017年阿里在线编程题-- 数串分组 Uinx/Linux上的帮助查询命令 你懂C,所以C++不在话下 一篇特别长的总结(C专家编程) 程序员面试金典--笔记(精华篇) C陷阱与缺陷--笔记 半小时搭建电子商务网站--opencart linux网络知识和工具(持续更新) 网卡参数查询及设置工具ethtool 高性能流量生成工具trafgen(DDoS模拟) Linux流量控制工具TC 流量控制工具TC详细说明 tcpdump过滤数据包,结果不对? Lecture 网络攻击与防御技术笔记 gotgit-git权威指南 高效使用MacOS所要知道的 shell内置字符串处理 配置ntp(知其所以然) 360黑客攻防技术分享会--记录 中毒U盘恢复--快捷键病毒 Tor--anonymity network介绍(PPT) IBM bluemix 再读《Linux Shell脚本攻略》 linux shell 学习摘记(9) linux shell 学习摘记(8) linux shell 学习摘记(7) linux shell 学习摘记(6) linux shell 学习摘记(5) linux shell 学习摘记(4) linux shell 学习摘记(3) linux shell 学习摘记(2) linux shell 学习摘记(1) firefox vim 插件 vimperator A Byte of Vim 笔记 windows注册表小知识 安全测试工具篇(开源&商业) 安全及性能测试工具(网站收集) 性能测试工具 屡试不爽的“3个”iPad使用技巧 Shell Shortcuts(和Tab键一样实用) vim--自动添加jekyll post信息头 vim 自动给文件添加头部信息 GitHub Tips (很实用,值得收藏) Linux路由、防火墙、NAT命令

gotgit-git权威指南

2016年12月21日

网站:http://www.worldhello.net/

  • 图形工具qgit, gitg, GitX
    cvs2svn gnupg
    git grep “工作区文件内容搜索”
    .gitconfig 版本库、全局配置、系统级别的配置文件 –> 采用INI格式文件

git status -s
第一列的M –> 版本库中和暂存区的有差别
第二列的M –> 工作区和暂存区的有差别

蒋鑫
gotgit–Git权威指南
Git 权威指南

.git/index 记录文件的时间戳,长度等信息

比较时间戳

git checkout . 或 git checkout – filename 会用暂存区的文件替换工作区的!
git checkout HEAD . 或 git checkout HEAD 会用HEAD指向的master分支中的文件替换工作区和暂存区的文件! git rm --cached 从暂存区中删除文件而已! git reset == git reset HEAD 默认是mixed的,所以暂存区的会被重写 soft mixed hard 暂存区中的文件会被master分支指向的目录树所替换,但工作区不受影响

git reset –soft HEAD^ 仅仅是引用退回,工作区和暂存区的文件不变(可方便的进行重新提交,修改提交的内容)
git reset –mixed HEAD^ == git reset HEAD^
git reset –hard HEAD^ 全部退回上一版本,取消所有修改
git reset HEAD filename 或 git reset – filename 是 git add filename的反向操作!!! 工作区的内容不做修改!
游标! –> git reflog 可以查看 master分支指向的变迁

git diff 工作区和暂存区
git diff –cached 暂存区和HEAD
git diff HEAD 工作区和HEAD

git cat-file 查看对象
git cat-tree
git ls-files
git ls-tree
git write-tree
git rev-parse 显示引用对应的分支

git cat-file -p
git rev-parse

master 代表分支master中最新的提交
HEAD 代表版本库中最近的一次提交
HEAD^2
HEAD~6
aa1234^{tree}
aa1234:path/to/file 提交对应的文件对象
:path/to/file 暂存区

SHA1 哈希值 是通过 “对象名(commit/blob/tree)+字节数+空字符+内容(cat-file)”–> 40位的散列值/哈希值 –> 为什么不按照顺序来呢?

分支游标master

git reflog show master 显示master指针
git reflog -1 默认是HEAD指针

checkout – 中的 – 是为了避免路径和引用的重名

分离头指针–>HEAD 头指针指向的是一个具体的提交ID,而不是一个引用(分支)

git checkout branch
git checkout – filename 用暂存区的文件来覆盖本地的,取消自上次git add filename依赖的本地修改
git checkout branch – filename 维持HEAD指针不变,用branch所指向的提交中的filename替换暂存区和工作区中的文件

重置 和 检出 –> 暂存区 & 工作区

git reset –soft HEAD^ 取消前面的一次提交

git clean 可以删除本地多余的文件和目录

WIP work in progess

git stash 是通过一个脚本来实现的
先commit ,然后保存commit,即添加一个stash引用,然后通过 git reset –hard 重置working directory和index
日志、引用的日志

git tag 其实也是一个引用,通过记录提交ID(或创建Tag对象)来为当前版本库的状态进行“留影”

git add -u 快速标记删除,将本地文件中的变更(修改,删除)全部记录到暂存区中(为了解决本地文件删除,而暂存区文件没删除的现象)

git mv 相当于 git del +git add
git add -A 相当于对修改的文件执行git add, 本地删除的文件执行 git rm , 对新增的文件执行git add

文件归档

git archive -o latest.zip HEAD
git archive -o pratial.tar HEAD src doc
git archive –format=tar –prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz

tar -czf hello.tar.gz root
tar -zcf hello.tar.gz
git add -i 交互式添加文件

.gitignore语法
.a
!lib.a
/TODO #只忽略此目录下的TODO语法,子目录的TODO文件不忽略
build/ # 忽略所有build/目录下的文件
doc/
.txt

.git/info/exclude 设置只对本地有效的独享式文件忽略

git statsh 是通过一个脚本程序来实现的,其中包含git reset – hard HEAD 过程
git diff 可真对各类引用进行对比

git rev-parse refs/tags/old_practices
git describe

一个显示版本好的Hello World, 将git describe 的输出作为软件版本号
目录文件结构

../src
├── Makefile
├── main.c
└── version.h.in
  • main.c 内容
    ``` c
    #include “version.h”
    #include

int main(){
printf(“Hello,world.\n”);
printf(“version: %s.\n”, _VERSION);
return 0;
}

- version.h.in 内容
``` c
#ifndef HELLO_WORLD_VERSION_H
#define HELLO_WORLD_VERSION_H

#define _VERSION "<version>"

#endif
  • Makefile
    ``` Makefile
    OBJECTS = main.o
    TARGET = helloworld

all: ${TARGET}

${TARGET}: ${OBJECTS}
${CC} -o $@ $^

main.o: main.c version.h

version.h: new_header

new_header:
@sed -e “s//$$(git describe --tags)/g" \ < version.h.in > version.h.tmp @if diff -q version.h.tmp version.h >/dev/null 2>&1; \ then \ rm version.h.tmp; \ else \ echo "version.h.in => version.h"; \ mv version.h.tmp version.h; \ fi

clean:
rm -rf ${OBJECTS} version.h

.PHONY: all clean
```

克隆生成裸版库 git clone --bare /path/to/demo /path/to/repose/demo.git
创建生成裸版库 git init --bare /path/demo-init.git
git ls-remote

git rev-parse 版本表示法
git rev-list 版本范围表示法

git log –stat –oneline 只需显示修改了的文件名
git diff 可针对二进制进行比较,同时也可以逐词比较(--word-diff)

文件溯源 git blame capture.sh
二分查找 git bisect, 通过标记版本的好坏
git bisect --> git bisect good ; git bisect good G --> git bisect bad .......

git show b80d5a4:agent/sysinfo.py > sysinfo_old.py 检出文件历史版本到新的文件
git checkout b80d5a4 -- ./agent.py
git checkout b80d5a4 整个工作去切换到历史版本
git ls-tree b80d5a4 查看历史提交的目录树

悔棋 git reset git rebase git merge
git rebase --onto <newbase> <since> <till>
git rebase -i HEAD^^
git rebase --onto 8f7f94b A master 将master分支里程碑之后的提交全部迁移到根提交8f7f94b上

再多人协作的过程中,可进行反转提交
git show HEAD
git revert HEAD 在不改变原提交的前提下,撤销对其的修改

git 以SHA1 哈希值作为目录名和文件名保存的对象又一个术语,称之为松散对象,而松散对象打包后会提高效率
git管家: git gc

git reflog

git clone 下来的文件很多时候是多松散文件进行了打包

智能协议(git, ssh, file://, https),哑协议(https, others)
非快进方式(non-fast-forward),推送只允许“快进式”的操作,即推送的本地版本库的提交是建立在远程版本库响应分支的现有提交基础之上
禁止非快进式推送

git config receive.denynonfastforwards=true

git pull = git fetch + git merge

git merge refs/remotes/origin/master 默认合并后的结果会自动提交,添加–no-commit选项会将结果放入暂存区

git merge 合并信息存放在 .git/MERGE_HEAD MERGE_MSG MERGE_MODE

当进行文件合并的时候会存在多个暂存区
git show :1:doc/README.txt
git show :2:doc/README.txt

手工解决冲突文件
用图形工具完成冲突解决

git merge –tool-help
git mergetool –tool=vimdiff
图形化的工具更不错
vimdiff –> -d , :vertical diff , [c, ]c, set scrollbind, dp(diff put), do(diff get, dg被占用了), diffupdate, :set diffopt=context:3,
Kdiff 工具不错, bc也行

git ls-files -s
git config merge.tool
git config merge.tool vimdiff

git config –global merge.tool kdiff3.path
git config –global mergetool.kdiff3.path /path/to/kdiff3
git config –global mergetool.kdiff3.cmd ‘/usr/bin/kdiff3 –myparameters’
merge.log 是否在合并提交说明中包含合并提交的概要信息,默认为false

git describe 显示里程碑和提交ID的组合来代表软件的版本号
git name-rev HEAD

git ls-remote origin 显示远程中的里程碑
git push origin :mytag2 删除远程中的里程碑

git cat-file -p mytag2
git rev-parse mytag2

linux 里程碑命名:以字母v开头,以-rc为后缀是优先于正式版本发布的,正式发布半分去掉了预发布版的后缀,正式发布后的升级/修改是通过最后一位数字的变动来体现的。

特性分支、主题分支 feature branch, topic branch
git branch -d / git branch -D
git grep -n argv
git branch git checkout git checkout -b

git branch -d user1/getopt

包含说明的里程碑,其提交的ID会显示成”v1.0^{}”

git formate-patch jx/v1.1..jx/v1.2
(两个..用于表示版本范围)

git cherry-pick jx/v1.0-i18n

gettext 可实现多语言功能

git show-ref

远程版本分支

git ls-remote –heads file:///path/to/repos/hello-world.git

git show-ref 查看全部本地引用
git branch -r

.git/config文件
[remote “origin”]
url = git@github.com:wenfengshi/GPAgent.git
fetch = +refs/heads/:refs/remotes/origin/

git checkout –track -b hello-jx hello-1.x 基于hello-1.x创建hello-jx分支

git remote set-url new-remote file:///path/to/repos/hello-user2.git

git fetch –no-tags file:
git remote add

将最近的三个提交转化为补丁文件
git formate-pathch -s HEAD~3..HEAD

git send-email *.patch 辅助发邮件的功能

mail
git am user1-mail-archive 可以是保存在mbox中的邮件批量地应用在版本库中

ls *.path

cat *.path git am 手动打补丁

打补丁工具
stgit
quilt

子模块
git submodule <–> svn:externals
.gitmodules 默认不克隆外部版本库,若要克隆则要git submodule init 及 git submodule update命令
git submodule add /path/to/repos/libA.git lib/lib_a

git submodule status
git submodule init
git submodule update

cd /path/to/lib/lib_a && git checkout master && git commit
cd /path/to/ && git submodule status

隐性子模块

子树合并–>外部的版本库回座位一个目录被整个复制到本版本库中,并且复制到本版库中的子目录下数据可以和原版本库数据建立跟踪关联
git –git-dir=/path/to/repos/libA.git init –bare
git read-tree, git write-tree, git commit-tree
一般流程:

  1. git remote add util /path/to/repos/util.git
  2. git fetch util
  3. git branch util-branch util/master
  4. git read-tree –prefix=lib util-branch

使用git-subtree插件
git subtree add -P lib /path/to/repos/util.git master
git subtree merge
git subtree pull
git subtree split
推荐流程:

  1. git remote add util /path/to/repos/util.git
  2. git fetch util
  3. git branch util-branch util/master
  4. git subtree add -P lib util-branch

git & svn
git svn clone
git add
git commit
git svn fetch
git svn rebase
git svn dcommit

git clone git-svn-demo myclone

git svn clone = git svn init + git svn fetch

Git服务器

HTTP
Gitweb 只提供版本库的图形化浏览功能,而不提供版本库的读写功能

Git
git daemon
git-daemon-run

SSH

补丁中的二进制文件
GNU 中的 diff, path不支持
git format-patch, git am 仅对git 库有效
git apply –> 对所有都有效

FreeMind软件
属性、钩子、模版、稀疏检出、浅克隆、嫁接, git replace, git notes

git config –global core.quotepath false 使用了本地语言(如中文)命令文件后,能够在状态查看、差异比较时正确显示文件名

$ git status
On branch master
Your branch is up-to-date with ‘origin/master’.
Untracked files:
(use “git add ..." to include in what will be committed)

    .2016-09-23-linux_shell_scripting_cookbook_1.md.swm
    .2016-09-23-linux_shell_scripting_cookbook_1.md.swn
    .2016-10-24-tor_introduction.md.swm
    .2016-10-24-tor_introduction.md.swn
    iconv
    "../\347\242\216\350\250\200/.2016-11-27-snowden-film.md.swn"
    "../\347\247\201\345\272\223/2016-09-24-git_common_commands.md"
    "../\347\247\221\347\240\224/2016-09-09-CNA_FCoE_RDMA_Chelsio.md"
    "../\347\247\221\347\240\224/2016-09-09-gridftp_installation.md"
    "../\350\257\273\344\271\246/.2016-09-24-IT_booklist_2016.md.swk"
    "../\350\257\273\344\271\246/.2016-09-24-IT_booklist_2016.md.swl"
    "../\350\257\273\344\271\246/.2016-09-24-IT_booklist_2016.md.swm"
    "../\350\257\273\344\271\246/.2016-09-24-IT_booklist_2016.md.swn"
    "../\350\265\204\346\272\220/.2016-09-23-ss_client.md.swl"
    "../\350\265\204\346\272\220/.2016-09-23-ss_client.md.swm"
    "../\350\265\204\346\272\220/.2016-09-23-ss_client.md.swn"
    "../\350\265\204\346\272\220/2016-09-23-python_resources.md"
    "../\350\265\204\346\272\220/2016-09-24-others_resource.md"

nothing added to commit but untracked files present (use “git add” to track)
$ git config –global core.quotepath false
$ git status
On branch master
Your branch is up-to-date with ‘origin/master’.
Untracked files:
(use “git add ..." to include in what will be committed)

    .2016-09-23-linux_shell_scripting_cookbook_1.md.swm
    .2016-09-23-linux_shell_scripting_cookbook_1.md.swn
    .2016-10-24-tor_introduction.md.swm
    .2016-10-24-tor_introduction.md.swn
    iconv
    ../碎言/.2016-11-27-snowden-film.md.swn
    ../私库/2016-09-24-git_common_commands.md
    ../科研/2016-09-09-CNA_FCoE_RDMA_Chelsio.md
    ../科研/2016-09-09-gridftp_installation.md
    ../读书/.2016-09-24-IT_booklist_2016.md.swk
    ../读书/.2016-09-24-IT_booklist_2016.md.swl
    ../读书/.2016-09-24-IT_booklist_2016.md.swm
    ../读书/.2016-09-24-IT_booklist_2016.md.swn
    ../资源/.2016-09-23-ss_client.md.swl
    ../资源/.2016-09-23-ss_client.md.swm
    ../资源/.2016-09-23-ss_client.md.swn
    ../资源/2016-09-23-python_resources.md
    ../资源/2016-09-24-others_resource.md

nothing added to commit but untracked files present (use “git add” to track)

对于使用DBK字符集的中文Windows,需要为Git进行如下设置,才能够在提交说明中正确地使用中文
git config –system core.quotepath false
git config –system i18n.commitEncoding gbk
git config –system i18n.logOutputEncoding gbk

在linux上, git cat-file -p HEAD iconv -f gbk -t utf-8

git 在创建树对象时,以本地字符集而非UTF-8字符集进行保存
git cat-file -p HEAD^{tree} | iconv -f gbk -t utf-8

Windows & Mac OS 文件大小写不敏感
应设置: git config core.ignorecase true

CRLF Carriage return / line feed 0x0D 0x0A

统一处理方式:保存的时候为LF, 实际再进行转换
git 只对前8000个字符进行检查,其中出现了NULL字符(0x00)则当作二进制文件,否则为文本文件
git config –global core.autocrlf true –> 对文本文件进行换行, 工作区文件始终使用CRLF作为换行符,对于Windows下的Git合适
git config –global core.autocrlf input –> 只在文件提交到版本库时,对blob文件的换行符转化为LF,检出时则不进行转换 –> 对于Linux下的Git合适

Git的其他特性

Git通过属性文件为版本库中的文件或目录添加属性。设置了属性的文件或目录,在执行Git操作时会做特殊处理,如换行符转换时,text属性。

*.doc diff=antiword 属性文件优先级: 1. .git/info/attributes 2. .gitattributes 3. core.attributes 4. $(prefix)/etc/gitattributes 常用属性: text; eol; ident; filter(检入和检出时进行相应的转化);diff; merge; whitespace(对文本中空白字符是否规范做出检查); export-ignore; export-subset; delta; encoding; binary; git钩子脚本 .git/hooks, 当git在执行特定操作时会调用特定的钩子脚本。 例如可以规范git commit meaage 内容, 稀疏检出:本地版本库检出时不检出全部,只将特定的文件从本地版本库中检出到工作区,而其他未指定的文件则不予检出 1. 设置core.sparseCheckout true 2. 编辑.git/info/sparse-checkout 将检出的目录和文件放入其中 浅克隆:git clone / git fetch 操作时用 --depth 参数设定要获取的历史提交的深度 (大于0) ,会把源版本库分支上最近的 + 1 个历史提交作为新版本库的全部历史提交。 但会有许多的限制(不能从浅克隆版本克隆出新的版本库等等),多以基本是用来查看和研究的 --> 会有.git/shadow文件 提交嫁接,实现本地版本库上两条完全不同的提交线嫁接到一起 --> linux kernel从bitkeeper到git的转移 提交替换,直接替换另外的提交,在不影响其他提交的基础上实现对历史提交的修改 git replace git 评注:针对提交添加评注 git notes --> 评注的内容保存在git对象库中的而一个blob对象中, git --exec-path git每个子命令其实都有一个git-的文件相对应, 作者分别对git命令做了总结 csv, git , svn 对话 --> 能比较好的了解其中的不一样 diff -u 什么样的应用场景能用到!

知识共享许可协议
SWF's Hacking Dreamonephone 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
© 2011-2017. All rights reserved by onephone. Powerd by Jekyll.