[关闭]
@coder-pig 2017-11-18T06:25:38.000000Z 字数 5107 阅读 922

1.2.2 Git版本控制——本地操作命令

Tutorial-Android


在安装完Git后,就可以开始Git的基本使用了~


1.相关配置【git config】

区分globallocal,前者代表 全局设置,就是设置了在整个系统中,
所有的带Git版本管理的项目都是这样的配置;后者代表 本地设置 即在某个项目
独立的设置,后者优先级高于前者。比如全局设置的用户名是"Coder-pig",本地
设置的是"Jay",commit的时候author就是Jay而不是Coder-pig。
除了通过命令行修改,还可以直接修改对应文件:

全局配置文件:etc/gitconfig (Mac下是隐藏文件,用户/.gitconfig)
本地配置文件:当前仓库/.git/config

  1. # 安装完Git后第一件要做的事,设置用户信息
  2. # (global可换成local在单独项目生效):
  3. git config --global user.name "用户名" # 设置用户名
  4. git config --global user.email "用户邮箱" #设置邮箱
  5. git config --global user.name # 查看用户名是否配置成功
  6. git config --global user.email # 查看邮箱是否配置
  7. # 其他查看配置相关
  8. git config --global --list # 查看全局设置相关参数列表
  9. git config --local --list # 查看本地设置相关参数列表
  10. git config --system --list # 查看系统配置参数列表
  11. git config --list # 查看所有Git的配置(全局+本地+系统)

2.获取帮助【git help】

  1. git help 命令 # 如:git help init

3.创建本地仓库【git init】

  1. git init 仓库名 # 创建一个新的带Git仓库的项目
  2. git init # 为已存在的项目生成一个Git仓库

4.添加文件到暂存区/文件跟踪标记【git add】

可以使用git add 文件名,将工作空间的文件添加到暂存区,或批量添加文件

  1. git add 文件名 # 将工作区的某个文件添加到暂存区
  2. git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件
  3. git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件
  4. git add . # 将当前工作区的所有文件都加入暂存区
  5. git add -i # 进入交互界面模式,按需添加文件到缓存区

附:交互界面模式示例

上图流程:

1.先在GitForTest的文件夹里创建了两个文件
2.键入git add -i,进入后,键入4,选择添加untracked的文件
3.他给我们列出了untracked的文件,然后我们根据序号来添加文件
4.输入?会弹出相关提示,然后直接回车,结束选择!
5.然后再次输入git add -i,输入4,可以看到已不存在untacked的文件了!


5.让Git不Tracked特定文件【.gitignore文件配置】

将未tracked的文件添加到缓存区后,Git就会开始跟踪这个文件了!
对于一些比如:自动生成的文件日志临时编译文件等,就
没必要进行跟踪了,这个时候可以编写.gitignore文件,在里面
把不需要跟踪的文件或文件夹都写上,git就不会对这些文件进行跟踪!
另外.gitignore文件与.git文件夹在同级目录下

如果不想自己写,可以直接到:[https://github.com/github/gitignore][24] 复制粘贴!
也可以自行编写,支持简化了的正则表达式(规范与示例模板摘自:[Git王者超神之路][25])

  • * : 匹配零个或多个任意字符
  • [abc]:只匹配括号内中的任意一个字符
  • [0-9]:- 代表范围,匹配0-9之间的任何字符
  • ?:匹配任意一个字符
  • **:匹配任意的中间目录,例如a/**/z可以匹配:a/z,a/b/z,a/b/c/z等

示例模板

  1. # 忽略所有以 .c结尾的文件
  2. *.c
  3. # 但是 stream.c 会被git追踪
  4. !stream.c
  5. # 只忽略当前文件夹下的TODO文件, 不包括其他文件夹下的TODO例如: subdir/TODO
  6. /TODO
  7. # 忽略所有在build文件夹下的文件
  8. build/
  9. # 忽略 doc/notes.txt, 但不包括多层下.txt例如: doc/server/arch.txt
  10. doc/*.txt
  11. # 忽略所有在doc目录下的.pdf文件
  12. doc/**/*.pdf

!!!特别要注意一点!!!:

配置.gitignore只对那些没有添加到版本控制系统的文件生效(未Tracked的文件)!

举个例子:

有A,B两个文件,你先把他两个add了,然后在.gitignore文件中
配置了不跟踪这两个文件,但是你会发现根本不会生效。

  1. git add A
  2. git add B
  3. # 配置不跟踪A和B
  4. git add .gitignore

所以,最好的做法就是在项目刚开始的时候,先添加.gitignore文件。
当然,即使是发生了,还是有解决方法的,可以键入下述命令清除标
记状态,然后先添加.gitignore,再添加文件即可:

  1. git rm -r --cached . # 清除版本控制标记,.代表所有文件,也可指定具体文件

还有,如果你用的是IDEA的编辑器的话,可以下一个.ignore的插件,可以手动
直接勾选不需要跟踪的文件。


6.将暂存区内容提交到本地仓库【git commit】

  1. git commit -m "提交说明" # 将暂存区内容提交到本地仓库
  2. git commit -a -m "提交说明" # 跳过缓存区操作,直接把工作区内容提交到本地仓库

如果不加-m "提交说明",git会让用你让默认编辑器(如vi)来编写提交说明,
可能有些朋友用不惯vi,要么别漏掉-m "提交说明",要么自己设置编译器:

  1. git config --global core.edit 喜欢的编辑器

除此之外,有时可能需要修改上次提交的内容,比如修改提交说明,或者修改文件等:

  1. # 合并暂存区和最近的一次commit,生成新的commit并替换掉老的
  2. # 如果缓存区没内容,利用amend可以修改上次commit的提交说明
  3. # 注:因为amend后生成的commit是一个全新的commit,旧的会被
  4. # 删除,所以别在公共的commit上使用amend!切记!!!
  5. git commit --amend
  6. git commit --amend --no-edit # 沿用上次commit的提交说明

7.查看工作区与缓存区的状态【git status】

  1. git status # 查看工作区与暂存区的当前情况
  2. git status -s # 让结果以更简短的形式输出

8.差异对比(内容变化)【git diff】

  1. git diff # 工作区与缓存区的差异
  2. git diff 分支名 #工作区与某分支的差异,远程分支这样写:remotes/origin/分支名
  3. git diff HEAD # 工作区与HEAD指针指向的内容差异
  4. git diff 提交id 文件路径 # 工作区某文件当前版本与历史版本的差异
  5. git diff --stage # 工作区文件与上次提交的差异(1.6 版本前用 --cached)
  6. git diff 版本TAG # 查看从某个版本后都改动内容
  7. git diff 分支A 分支B # 比较从分支A和分支B的差异(也支持比较两个TAG)
  8. git diff 分支A...分支B # 比较两分支在分开后各自的改动
  9. # 另外:如果只想统计哪些文件被改动,多少行被改动,可以添加 --stat 参数

9.查看历史提交记录【git log】

  1. git log # 查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)
  2. git log -p -次数 # 查看最近多少次的提交记录
  3. git log --stat # 简略显示每次提交的内容更改
  4. git log --name-only # 仅显示已修改的文件清单
  5. git log --name-status # 显示新增,修改,删除的文件清单
  6. git log --oneline # 让提交记录以精简的一行输出
  7. git log graph all --online # 图形展示分支的合并历史
  8. git log --author=作者 # 查询作者的提交记录(和grep同时使用要加一个--all--match参数)
  9. git log --grep=过滤信息 # 列出提交信息中包含过滤信息的提交记录
  10. git log -S查询内容 # 和--grep类似,S和查询内容间没有空格
  11. git log fileName # 查看某文件的修改记录,找背锅专用

除此之外,还可以通过 --pretty 对提交信息进行定制,比如:

更多规则与定制如下(摘自:Git王者超神之路),或参见:Viewing the Commit History

format对应的常用占位符:(注:作者是指最后一次修改文件的人,提交者是提交该文件的人)

占位符 说明 占位符 说明
%H 提交对象(commit)的完整哈希字串 %h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串 %t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串 %p 父对象的简短哈希字串
%an 作者(author)的名字 %ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date= 选项定制格式) %ar 按多久以前的方式显示
%cn 提交者(committer)的名字 %ce 提交者的电子邮件地址
%cd 提交日期 %cr 提交日期,按多久以前的方式显示
%s 提交说明

一些其他操作:

选项 说明
-p 按补丁格式显示每个更新之间的差异
--stat 显示每次更新的文件修改统计信息(行数)
--shortstat 只显示 --stat 中最后的行数修改添加移除统计
--name-only 仅在提交信息后显示已修改的文件清单
--name-status 显示新增、修改、删除的文件清单
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)
--graph 显示 ASCII 图形表示的分支合并历史
--pretty 格式定制,可选选项有:oneline,short,full,Fullerton和format(后跟指定格式)

还有一些限制log输出的选项

选项 说明
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
--grep 仅显示含指定关键字的提交
-S 仅显示添加或移除了某个关键字的提交

10.查看某行代码是谁写的【git blame】

  1. git blame 文件名 # 查看某文件的每一行代码的作者,最新commit和提交时间

Tip:

如果你用的IDEA系列的编译器,右键行号,选择Annotate也可以实现同样的效果


11.设置Git命令别名【git config --global alias】

可以为常见的命令起个简单的别名,就不用每次都敲完整命令,比如可以设置:
status为st,checkout为co ; commit为ci ; branch为br等

  1. git config --global alias.st status


12.为重要的commit打标签【git tag】

对于某些提交,我们可以为它打上Tag,表示这次提交很重要,
比如为一些正式发布大版本的commit,打上TAG,当某个版本
出问题了,通过TAG可以快速找到此次提交,拿到SHA1值,再
去查找问题,比起一个个commit看,省事很多!

Git标签分两种:轻量标签附加标签
前者只是在提交上加个Tag,指向提交的Hash值;
而后者还会保存打标签者的信息,时间和附加信息;

  1. git tag 标记内容 # 轻量标签
  2. git tag -a 标记内容 -m "附加信息" # 附加标签

如果想为之前的某次commit打TAG的话,可以先找出SHA1值,设置调下述命令:

  1. git tag -a 标记内容 版本id # 比如:git tag -a v1.1 bcfed96

默认情况,git push不会把标签推送TAG到远程仓库,如果想推送到服务器,可以:

  1. git push origin 标记内容 # 推送某标签到
  2. # 删除所有本地仓库中不存在的TAG:
  3. git push origin --tags

另外,可以在新建分支的时候也加上TAG

  1. git checkout -b 分支名 标记内容

还可以用show命令查看标签对应的信息

  1. git show 标记内容

如果你想删除本地Tag:

  1. git tag -d 标记内容

如果是删除远程Tag:

  1. git push origin --delete tag 标记内容

15.Git命令自动补全【输命令的时候按两次tab键】


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注