网站: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
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/
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 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:onephone/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
一般流程:
- git remote add util /path/to/repos/util.git
- git fetch util
- git branch util-branch util/master
- 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
推荐流程:
- git remote add util /path/to/repos/util.git
- git fetch util
- git branch util-branch util/master
- 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
.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
.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属性。