入门
安装Git
命令
-
预配置
-
查看版本号
git --version 版本号
-
查看git命令文档
git help git命令 查看git命令文档(例如: git help log))
-
配置信息
git config --system --list 查看所有用户范围的公共属性(/etc/gitconfig,windows在[git安装目录]/etc/gitconfig) git config --global --list 查看当前用户范围的公共属性(~/.gitconfig) git config --list 查看当前项目范围的公共属性([项目路径]/.git/config) git config [--global|--system] key value 设置配置信息key,value,例如配置用户信息
使用示例
git config --global user.name "test" 标记自己名字是"test" git config --global user.email "[email protected]" 标记自己邮箱是"[email protected]" // 上述配置信息,可以在提交记录中看到 /* 公司内网https的SSL证书未经过第三方机构签 署,直接操作Git就会报错,需要设置忽略证书, 即sslVerify。一般情况下,通过执行如下命令进行设置 */ git config --global http.sslVerify "false"
-
ssh连接仓库
ssh-keygen -t rsa -C "[email protected]" 使用[email protected]为依据生成密钥
生成的密钥文件保存在
~/.ssh
目录,切换到该目录,复制公钥文件(id_rsa.pub)内容,粘贴到仓库对应配置处。
以github为例,操作如下:点击右上角 "Account Settings" 设置图标 点击左侧 "SSH Keys" 点击 "Add SSH key" 粘贴你的密匙到 "Key" 文本区 点击 "Add key" 确认操作输入你的 GitHub 密码
测试是否配置成功
ssh -T [email protected]
-T表示强制客户端以交互模式工作,可以提高执行速度
第一次输入,直接输入yes即可.
The authenticity of host 'github.com (207.97.227.239)' can't be established. RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)?
如果验证成功,GitHub会提示
Hi you_username! You've successfully authenticated, but GitHub does not provide shell access.
-
-
管理项目
-
添加/提交
git init (git 初始化) git status (查看git管理的状态) git add (将文件添加到git跟踪,文件被放入暂存区,可以提交或者存储到远程主机) git commit ( 提交到版本库中) git log (查看git的日志)
-
分支
git branch (查看所有分支) git branch 分支名 (创建分支) git checkout 分支名 (切换到该分支) git checkout -b 分支名 (创建并切换到该分支) git branch -d 分支名 (删除已经合并的分支) git branch -D 分支名 (强制删除,不管有没有合并)
-
藏匿区
藏匿区用于保存当前所有文件的状态,以便将来还原到该状态,提交会使藏匿区失效。
git stash (保存当前分支未提交的工作状态到"藏匿区"以便将来可以回到这个工作状态) git stash list (查看该分支藏匿区保存的所有工作状态) git stash apply 工作状态名 (回到某个工作状态) git stash drop 工作状态名 (删除某个工作状态)
使用示例
在master分支修改一个文件test.txt(此时test.txt没有纳入版本控制(因为还没执行git add)),执行:
git stash
Saved working directory and index state WIP on master: 50c9371 fixed a bug
git stash list
stash@{0}: WIP on master: 50c9371 fixed a bug
可以看到当前文件状态已经被保存到藏匿区“stash@{0}”中,现在将“test.txt”纳入版本控制,并切换分支v1.0
git add test.txt
git checkout v1.0
当v1.0分支任务结束,又可以切回master,恢复藏匿区,继续开发
git checkout master
git stash apply stash@{0}
-
本地与远程仓库交互
-
远程仓库管理
git remote [-v | --verbose]
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
git remote rename <old> <new>
git remote remove <name>
git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
git remote set-branches [--add] <name> <branch>…
git remote get-url [--push] [--all] <name>
git remote set-url [--push] <name> <newurl> [<oldurl>]
git remote set-url --add [--push] <name> <newurl>
git remote set-url --delete [--push] <name> <url>
git remote [-v | --verbose] show [-n] <name>…
git remote prune [-n | --dry-run] <name>…
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
- 常用命令
git remote add 远程仓库名(我们一般使用origin) 仓库URL (添加仓库) git remote remove 远程仓库名 (删除仓库) git remote rename 远程仓库名 新仓库名 (重命名仓库) git remote set-url --add --push 仓库URL (添加push时提交的url,这条命令可以实现一次push到多个仓库)
- 常用命令
-
拉取远程代码
git pull [options] [<repository> [<refspec>…]]
git pull 等同于“git fetch <远程主机名> <分支名>” + “git merge 远程仓库名/分支名”的结合
- 常用命令
- 常用命令
-
推送本地代码到远程
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>] [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose] [-u | --set-upstream] [--push-option=<string>] [--[no-]signed|--signed=(true|false|if-asked)] [--force-with-lease[=<refname>[:<expect>]]] [--no-verify] [<repository> [<refspec>…]]
- 常用命令
git push -u 远程仓库名 本地分支名:远程分支名 (将本地分支代码推送到远程分支并建立跟踪)
-u 表示参数建立追踪。 这样git status 时会显示本地分支和远程分支的偏离情况
如果本地分支名与要推送的远程分支名一样,则远程分支名可以省略:git push -u 远程仓库名 本地分支名
如果想删除远程分支,则省略本地分支名,然后在前面加上“:":git push -u 远程仓库名 :远程分支名
等同于:git push origin --delete 远程分支名
如果push的时候,已经有人在该分支上提交了代码,则push会失败,此时需要先把更新抓取到本地在合并到项目中,才能再次push。(pull 或者 fetch+merge)
- 常用命令
-
-
日志
git log [<options>] [<since>..<until>] [[--] <path>...]
如果不带任何参数,列出所有历史记录,最近的排在最上方,显示提交对象的哈希值-作者-提交日期-和提交说明等。
通过Page Up、Page Down、↓、↑、Enter来控制显示。按q退出历史记录列表。
参数说明
-
显示
-
基础参数
--stat 显示修改文件列表及文件增删改行数(修改1行记为1个“+-”) --shortstat 只统计--stat 最后的添加、删除行数 -p 显示修改文件的具体修改内容是哪些 --graph 使用ASCII符号绘制分支合并历史 --oneline 一行显示,只显示哈希值(短)和提交说明 --decorate 标记会让git log显示每个commit的引用(如:分支、tag等) --simplify-by-decoration 只显示被branch或tag引用的commit --name-only 在有文件修改的提交记录后面显示修改文件列表 --name-status 不仅显示文件列表,还显示文件状态(A.添加、M.修改、D.删除) --relative-date 使用较短的相对时间显示(例如:"two weeks ago")
使用效果:
git log --shortstat
commit 7759193b639feea86c32a4a53081f3325d9c9cfd (v1.0) Author: test <[email protected]> Date: Thu Sep 20 15:08:45 2018 +0800 update v1.0.txt for a new function 1 file changed, 3 insertions(+), 1 deletion(-)
git log --stat -p
commit 7759193b639feea86c32a4a53081f3325d9c9cfd (v1.0) Author: test <[email protected]> Date: Thu Sep 20 15:08:45 2018 +0800 update v1.0.txt for a new function --- v1.0.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/v1.0.txt b/v1.0.txt index 94e938d..dfadc35 100644 --- a/v1.0.txt +++ b/v1.0.txt @@ -1 +1,3 @@ -111111111111111111111111 \ No newline at end of file +111111111111111111111111 + +22222222222222222222222 \ No newline at end of file
git log --oneline --graph --name-status
* 5949acc (HEAD -> master) merge v1.0 branch' |\ | * 7759193 (v1.0) update v1.0.txt for a new function | | M v1.0.txt | * 4ac8cdd only v1.0.txt | | D fix.txt | | D test.txt | * 666472f add v1.0 file | | A v1.0.txt * | 078799f merge file |\ \ | * | 0b3d607 (fix) delete test.txt | |/ | | D test.txt | * 5817d19 add fix file | | A fix.txt * | 1d69a16 merge v1.0 | | A fix.txt * | bfa5865 upldate 88888888888 |/ | M test.txt * ed68942 init file A test.txt
-
格式化参数
格式化输出日志使用
--pretty
参数,其值有:--pretty=(oneline|short|medium|full|fuller|email|raw)
,默认输出格式取值是:medium--pretty=oneline 基本和--oneline一样,不过commitId是长文本格式 --pretty=format:"":自定义日志显示格式,取值有: %H 提交对象(commit)的完整哈希字串 %h 提交对象的简短哈希字串 %T 树对象(tree)的完整哈希字串 %t 树对象的简短哈希字串 %P 父对象(parent)的完整哈希字串 %p 父对象的简短哈希字串 %an 作者(author)的名字 %ae 作者的电子邮件地址 %ad 作者修订日期(可以用 -date= 选项定制格式) %ar 作者修订日期,按多久以前的方式显示 %cn 提交者(committer)的名字 %ce 提交者的电子邮件地址 %cd 提交日期(可以用 -date= 选项定制格式) %cr 提交日期,按多久以前的方式显示 %s 提交说明 %d 关联分支名(ref名称) 作者和提交者的区别不知道是啥? 作者与提交者的关系:作者是程序的修改者,提交者是代码提交人(自己的修改不提交是怎么能让别人拉下来再提交的?) 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁, 然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者(soga) %C 设置显示颜色和字体,这个参数要配置上面的参数一起使用。 有两种使用方式:[%C颜色]格式化参数 或者 [%C(字体 颜色)]格式化参数 %Creset 重置颜色 %Cred 切换到红色 %Cgreen 切换到绿色 %Cblue 切换到蓝色 %C(bold blue) 加粗蓝色 例如 "%Cred%h" 用红色显示简短的commitId; "%Creset -" 用默认颜色显示“-”; "%C(yellow)%d" 用黄色显示关联分支名; "%C(bold blue)%an" 作者名字蓝色加粗
format显示内容中出现日期的格式使用
--date
参数定制,和--pretty
一样,它有几个默认值
--date= (relative|local|default|iso|rfc|short|raw)
,也可以使用format自定义格式。
-
-
过滤
-
常用过滤条件
按数量
git log -n 5:显示前5条记录
按日期
git log --after="2014-7-1" 查看“2014-7-1”后提交的记录 git log --before="2014-7-1" 查看“2014-7-1”前提交的记录
按提交者姓名(或者邮箱)
git log --author="test" 查找提交者姓名或者邮箱包含“test”的记录 加上“-i”可以忽略大小写匹配
按提交描述
git log --grep="hello" 查找提交描述包含“hello”的记录 如果想同时使用 --author 和 --grep,还要附加一个“--all-match”参数
按版本文件
git log -- ./subProject/src/main/java/com/test/mapper/testMapper.xml
--
在前表示按照文件查找(必须完整路径),--
在后表示按分支查找
按文件内容git log -S "hello" 查看所有版本文件中包含“hello”的提交记录 git log -G "w+" 查看所有版本文件中包含字母的提交记录(正则匹配)
按分支范围
git log branch1..branch2 查看branch2有并且branch2没有的提交记录 git log branch1...branch2 查看branch2或者branch2的提交记录
按merge提交
git log --no-merges 查看不是merge commit的记录 git log --merges 只看merge commit记录
按标签(tag)
git log testTag1 查看testTag1之后提交的记录 git log testTag1..testTag2 查看testTag1到testTag2之间的记录,不包括testTag1
按commitId/shortCommitId
git log commitId 在commitId之前提交的记录 git log commitId1 commitId2 查看commitId1和commitId2之间的提交记录 git log commitId1..commitId2 查看commitId1和commitId2之间的提交记录,但不包括commitId1
commitId 可以用HEAD[[^][~num]]代替
HEAD代表最新提交的commitId
HEAD~1代表HEAD记录的前1条commitId ,HEAD~2代表HEAD记录的前2条commitId …以此类推。
HEAD^ 等同于 HEAD~1。
-