git init // git 初始化,建立一个空的本地仓库
git clone 分支地址 // 克隆分支,该命令会在本地生成一个目录,与远程主机的分支名相同
git clone 分支地址 本地目录名 // 克隆分支,该命令会在本地生成一个指定名称的目录
git clone -o 主机名 分支地址 // 给远程主机命名。 克隆分支的时候,所使用的远程主机会被 git 自动命名为 origin ,如果想使用其他主机名就需要用该命令
git checkout 分支名称 // 切换分支
git checkout -b 新分支名称 老分支名称 // 基于某分支创建新分支
git commit -m '备注' // 提交代码到本地仓库
git merge 分支名 // 合并指定分支到当前分支
git status // 查看当前分支信息
git remote 系列 【 为方便管理,git要求每一个远程仓库必须有一个名字。git remote 就是用来管理远程仓库的 】
git remote // 列出所有的远程仓库
git remote -v // 查看远程仓库网址
git remote show 仓库名 // 显示仓库的详细信息
git remote add 仓库名 网址 // 添加远程仓库
git remote rm 仓库名 // 删除远程仓库
git remote rename 仓库名 新仓库名 // 重命名仓库
git pull 系列
git pull // 拉取远程分支到本地
git pull 仓库名 分支名 :本地分支名 // 拉取指定的远程分支到本地,并与本地的制定分支合并
git pull 仓库名 分支名 // 拉取指定的远程分支到本地,并与当前分支合并(也就是说当要合并的是当前分支,上面一条命令的 ‘ : 本地分支名 ’可省略)
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的 release 分支自动"追踪" origin/release 分支
git branch --set-upstream 本地分支名 仓库名/远程分支名 // 建立追踪关系
举个栗子: git branch --set-upstream release origin/release // 指定release分支追踪远程origin/release分支
git pull 仓库名 // 拉取当前分支在远程仓库的追踪分支,并合并
git pull -p // 删除在远程仓库已经删除的分支(如果远程仓库删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支)
git push 系列
git push 仓库名 本地分支名 :远程分支名 // 推送本地分支内容到远程仓库指定分支,如果该远程分支不存在,则会被新建。
git push 仓库名 本地分支名 // 省略远程分支名,表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push 仓库名 :远程分支名 // 省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git branch 系列 【分支管理】
git branch // 查看本地分支,并且在当前分支前面加 * 号标识
git branch -r // 查看远程分支,
git branch -a // 查看所有分支,包括本地分支和远程分支,同样在当前分支前面加 * 号标识
git branch 分支名 // 创建新分支,但不会自动切换到新分支,仍在当前分支
git branch 新分支名 老分支名 // 基于某分支创建新分支;作用等同于 【 git checkout -b 新分支名称 老分支名称 】
git branch -m | -M 分支名 新分支名 // 分支重命名,若新分支名已存在,则需要使用 -M 强制命名;否则则使用 -m 即可
git branch -d | -D 分支名 // 删除分支
git branch -d -r 分支名 // 删除远程分支
git branch 分支名 // 创建分支
git help branch // git branch的帮助文档
举个栗子(帮助文档中的原案例):
git add 系列
git add 文件路径 // 添加版本控制
git add -A // 提交所有变化 [ A 即 all ]
git add -u // 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) [ u 即 update ]
git add . // 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git log 系列 【日志、记录管理】
1. git log // 列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明。如果记录过多,则按Page Up、Page Down、↓、↑来控制显示;按q退出历史记录列表。
2. git log -n // n表示条数;如果不想向上面那样全部显示,可以选择显示前n条。
3. git log --stat -n // 简要的显示增改的行数统计,及提交的变更文件的统计,-n 同上,前n条,可省略。列出修改过的文件以及其中添加和移除的行数,并在最后列出修改文件的个数及所有增减行数小计
4. git log -p -n // 作用基本同上,但是所展示内容更为详细,详细的列出每个文件修改的内容。
5. git log --graph // ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况(我觉得并不常用)
6. git log --pretty=oneline // 一行显示,只显示哈希字串和提交说明。
7. git log --pretty=format:" " -n // 控制显示的记录格式,-n 同上,前n条,可省略。常用的格式占位符写法及其代表的意义如下:
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期(可以用 -date= 选项定制格式)
%cr 提交日期,按多久以前的方式显示
%s 提交说明
7.1 带颜色的日志:
以这句为例: git log --pretty=format:'%Cred%h%Creset -%C(yellow)%s %Cgreen(%cd) %C(bold blue)<%an>' --date=format:'%Y-%m-%d %H:%M:%S'
效果如图:
详解:
先断句:[%Cred%h][%Creset -][%C(yellow)%s][%Cgreen(%cd)][%C(bold blue)<%an>]
然后是很明显能得到的规律了;
一个颜色 + 一个内容
颜色以%C开头,后边接颜色,还可以设置字体,如果要设置字体的话,要一块加个括号
能设置的颜色值包括:reset(默认的灰色),normal, black, red, green, yellow, blue, magenta, cyan, white
字体属性则有bold, dim, ul, blink, reverse
内容可以是占位符,也可以是直接显示的普通字符
8. git log 文件名 // 指定文件名;只列出关于指定文件的提交历史记录
git log *文件名 // 该命令后边的路径还支持正则,比如:git log *_list.html
另外,文件名应该放到参数的最后位置,通常在前面加上 -- 并用空格隔开表示是文件
9. 指定时间、提交人、关键字等
-(n) 仅显示最近的 n 条提交
--grep 仅显示指定关键字的提交。 // 如指定关键字为“优化”的所有提交: git log --grep=优化
--since, --after 仅显示指定时间之后的提交。 // 如9月18号之后的所有提交:git log --since=2017.09.18
--until, --before 仅显示指定时间之前的提交。 // 如两天前的提交历史:git log --before=2.days
--author 仅显示指定作者相关的提交。 // 如指定作者为"BeginMan"的所有提交:$ git log --author=BeginMan
--committer 仅显示指定提交者相关的提交。 // 如指定提交者为"Jack"的所有提交:$ git log --committer=Jack
注意:以上选项后面的参数可以带单双引号,如--author="BeginMan"
作者和提交者的区别不知道是啥?
作者与提交者的关系:作者是程序的修改者,提交者是代码提交人(自己的修改不提交是怎么能让别人拉下来再提交的?)
其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者(懂了吗?其实我也没看懂。。。)
举个栗子:如果要查看 Git 仓库中,2017 年 3 月期间,gitster 提交的脚本,可以用下面的查询命令:
git log --pretty="%h - %s" --author=gitster --since="2017-03-01" \
--before="2017-04-01" /
10. git log --no-merges
默认情况下git log会输出merge commit. 你可以通过--no-merges标记来过滤掉merge commit;
另外,如果你只对merge commit感兴趣可以使用 —merges:git log --merges。
10. -S"<string>"、-G"<string>"
有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:git log -S"Hello,World!"
另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
注:-S后没有"=",与查询内容之间也没有空格符
总结:
git log 命令支持的选项
-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
git 版本回退
git reset --hard 版本号 // 回退到制定版本git push -f -u origin 分支名 // 强制推送到远程服务器