Config file location
--global use global config file
--system use system config file
--local use repository config file
-f, --file <file> use given config file
--blob <blob-id> read config from given blob object
Config file location
,用来增删改查不同的配置文件Action
--get get value: name [value-regex]
--get-all get all values: key [value-regex]
--get-regexp get values for regexp: name-regex [value-regex]
--get-urlmatch get value specific for the URL: section[.var] URL
--replace-all replace all matching variables: name value [value_regex]
--add add a new variable: name value
--unset remove a variable: name [value-regex]
--unset-all remove all matches: name [value-regex]
--rename-section rename section: old-name new-name
--remove-section remove a section: name
-l, --list list all
-e, --edit open an editor
--get-color find the color configured: slot [default]
--get-colorbool find the color setting: slot [stdout-is-tty]
git --global --edit // 打开编辑器修改global配置文件
git --global --list // 列出该配置文件中的所有配置信息
--add
可以省略,如果不加Config file location
配置项的话,默认是保存到--local
git config --add user.age 25
git config user.xxx "hehehe"
git config --global user.name "zhangfengqi"
alias
$ git config --global alias.co checkout
$ git config --global alias.last 'log -1 HEAD'
$ git config --global alias.unstage 'reset HEAD --'
// 下面两者等同
$ git unstage fileA
$ git reset HEAD -- fileA
想要执行外部命令,而不是一个Git子命令,需要在命令前面加入!
符号。
$ git config --global alias.visual '!gitk'
忽略某些后缀的文件,只需要修改.gitignore
,将其添加进去
vim .gitignore
*.swp
*.a
!lib.a // 忽略所有.a后缀,但是lib.a除外!
文件 .gitignore 的格式规范如下:
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号() 匹配零个或多个任意字符;abc 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 0-9 表示匹配所有 0 到 9 的数字)。 使用两个星号() 表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
A collection of .gitignore templates
http://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#Removing-Files
git rm xxx
记录这次删除文件的操作,下一次提交时,该文件就不再纳入版本管理了。git rm --cached deleteme.rb // 保存working tree的文件,只从stage中移除,并不再追踪
git mv oldfile.txt newfile.txt
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
// Make a new folder named src, and move all of the .html files into this folder
git mv *.html src/
https://git-scm.com/docs/git-push
// git push origin HEAD
A handy way to push the current branch to the same name on the remote.
直接输入git commit --amend
,会被带入编辑器进行提交信息修改
通过修改文件然后运行 git add
或 git rm
一个已追踪的文件,随后运行 git commit --amend
拿走当前的暂存区域并使其做为新提交的快照。
注意顶 因为修正会改变提交的 SHA-1 校验和。 它类似于一个小的变基 - 如果已经推送了最后一次提交就不要修正它。
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。 例如,上面的状态报告显示: README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。 而 Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。
git diff
比较的是工作区和暂存区的差别 git diff –cached
比较的是暂存区和版本库的差别 git diff HEAD
可以查看工作区和版本库的差别 每次commit后,git diff –cached
没有内容,是因为暂存区的内容已经更新到版本库中,因此暂存区和版本库中的内容无差别commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
按提交时间列出所有的更新,最近的更新排在最上面。加入参数-p
可以看到每次提交的内容差异
--pretty=oneline | short | full | fuller
$ git log --pretty=oneline // 只有commit号和comment
4df268a7256494563ff21feeb245a5fb52e42709 m_school bug fixed1
a1f8f9f33ffa4a39d99a0325e92acd73a48e11fa agent phone
$ git log --pretty=short // 没有提交时间,是merge的提交会有简明提示
commit 7e65491f3f742c3dd3befccd01f74d60d1000c19
Author: zuoerdong
redian index, brief content trim space and substr to length 100
commit de7042ce4004d8207d3aa4f768d076402ccc972c
Merge: 4f0513c 448fdf7
Author: Wang Chunwei
git log --pretty=full // 作者和提交者都会列出来,还是没有提交时间
commit 4df268a7256494563ff21feeb245a5fb52e42709
Author: Zhang Fengqi <zhangfengqi@xxx.com>
Commit: Zhang Fengqi <zhangfengqi@xxx.com>
m_school bug fixed1
$ git log --pretty=fuller // 多了时间
commit 4df268a7256494563ff21feeb245a5fb52e42709
Author: Zhang Fengqi <zhangfengqi@xxx.com>
AuthorDate: Fri Jan 15 18:28:23 2016 +0800
Commit: Zhang Fengqi <zhangfengqi@xxx.com>
CommitDate: Fri Jan 15 18:28:23 2016 +0800
m_school bug fixed1
--pretty=format:"xxx"
alias.hist=log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short
选项 | 说明 |
---|---|
%h | commit的短哈希,大写H则为完整哈希 |
%t | tree的短哈希,同上 |
%an | 作者(author)名字 |
%ae | anthor email |
%ad | 作者修订日期(可以用 –date= 选项定制格式) |
%ar | relative date 按多久以前的方式显示 |
%s | 提交说明 |
%ar
等同于--date=relative
或者--relative-date
--all-match
选项,否则满足任意一个条件的提交都会被匹配出来选项 | 说明 | example |
---|---|---|
-(n) | 仅显示最近的n条提交 | |
--since 或 --after | 仅显示指定时间之后的提交 | --since="2016-01-01" or "1 month 1 day 9 hours ago" |
--until 或 --before | 仅显示指定时间之前的提交 | |
--anthor | 指定作者 | |
--commiter | 指定提交者 | |
--grep | 匹配提交说明中的关键字 | --grep=gulp --grep="initial commit" |
--S | 仅显示添加或移除了某个关键字的提交 | --Sfunction_named |
--decorate
命令查看各个分支当前所指的commit对象$ git log --oneline --decorate
4df268a (HEAD, origin/master, origin/HEAD, master) m_school bug fixed1
a1f8f9f agent phone
两种类型的标签:轻量标签(lightweight)与附注标签(annotated)
附注标签是存储在 Git 数据库中的一个完整对象。它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;通常建议创建附注标签。
使用-a
,a for annotated.
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
// 查看标签的详细信息
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
不保存任何相关信息,只是一个特定提交的引用,轻量标签本质上是将提交校验和存储到一个文件中,然后做个map对应。
// 不需要任何其他参数,也不需要写comment
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
// 假设v1.4的commit号为ca82a6,下面两者等同,不会有额外的标签信息
$ git show v1.4
$ git show ca82a6
$ git tag -a v1.2 9fceb02
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上。
$ git push origin v1.5
$ git push origin --tags // 推送所有不在远程仓库上的标签
git checkout -b [branchname] [tagname]
https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86
| 树 | 用途 | | ————- | ————- | | HEAD | 指向上一次提交的快照,下一次提交的父结点 | | Index(暂存区) | 预期的下一次提交的快照,add操作之后所放置的区域,当你运行git commit
时 Git 看起来的样子| | working Directory | 硬盘本地工作目录,沙盒 |
git init
执行之后只有工作目录有文件1.js(v1)git add 1.js
后现在暂存区和工作目录有1.js(v1),HEAD里没有git commit
之后,现在三个区中的文件才是一致的,1.js(v1)git status
才会显示为空git reset
三步原理HEAD
这个特殊指针,GIT获知当前在哪个分支上。HEAD
可被看作为当前分支的别名。可以简单认为checkout
到哪儿,HEAD
移动到哪儿$ git branch dev
HEAD -> master
↓
98ca9 <--- f30ab
↑
dev
$ git checkout -b dev // 当新建并切换到dev分支时,HEAD才会移动
master
↓
98ca9 <--- f30ab
↑
dev <- HEAD
var gitalk = new Gitalk({ clientID: '82f3fb6574634b43d203', clientSecret: '5790d9fdbfe9340d29810b694b3b2070a9a3b492', repo: 'zfengqi.github.io', owner: 'zfengqi', admin: ['zfengqi'], distractionFreeMode: true, id: window.location.pathname, }); gitalk.render('gitalk-container');