返回
Git 基本操作
配置
git config –list –show-origin 查看所有配置信息 git config 命令带入–system参数会将配置写入/etc/gitconfig文件,对整个系统生效;–global选项会写入~/.gitconfig文件对当前用户所有仓库生效
#安装完成GIT之后配置相关用户名邮箱
git config --global user.name "me"
git config --global user.email [email protected]
git config --global core.editor vim
git config --global log.date iso
git config --global merge.conflictstyle diff3
git config --global merge.tool nvimdiff3
配置github ssh 访问
ls -al ~/.ssh [[查看是否生成SSH]] key
ssh-keygen -t rsa -b 4096 -C "[email protected]" [[生成key]]
eval "$(ssh-agent -s)" [[保证ssh可用]]
ssh-add ~/.ssh/id_rsa [[添加ssh]] key到客户端
将ssh key添加到github账户
clip < ~/.ssh/id_rsa.pub ssh -T [email protected] [[测试是否连接到github]]
操作
- 初始化 git init命令创建一个本地的仓库 git clone / clone一个已经存在的仓库
- 添加追踪文件 git add 添加文件到仓库暂存区
- 提交: 尝试每个提交成为一个逻辑上独立的变更集,并且每个提交附带一个 有用的信息 git diff –check 检查是否有空白错误 git commit 加-a参数会跳过暂存,将所有已追踪文件一起提交
- 删除文件
rm file #本地删除文件,修改未放入暂存区
git rm file #修改待提交,提交完成之后文件不再跟踪
git rm -f file #删除已经修改或者已经暂存的文件
git rm --cached file #将文件从仓库中删除但是保留在本地
- 文件重命名 git mv old new
- 贮藏
git stash #贮藏当前未提交内容
git stash list #查看已经贮藏的列表
git stash apply #应用最新贮藏
git stash apply <stashid> #指定应用的贮藏
git stash pop #应用贮藏并从栈上丢弃
- 清理工作目录 git clean -f -d [-n] git stash –all
查询
仓库状态
- git status查看当前仓库状态;
- git diff查看详细的未暂存文件与暂存区域的差异;
- git diff –staged/cached 查看对比已暂存文件与最后一次提交的文件差异;
- git diff master…contrib 查看当前contrib分支与master分支的共同祖先起,该分支中的工作。
提交记录
- git log 按照时间顺序显示提交记录;
- git log -p 附带提交记录变化;
- git log –stat 显示缩略统计信息;
- git log –pretty=oneline\full\fuller\short 自定义输出信息程度;
- 可以自定义log输出格式
git log --pretty=format:"%h - %an, %ar : %s"
git log --pretty=format:"%h %s" --graph
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 –date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%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(用来定义自己的格式)。 |
–oneline | –pretty=oneline –abbrev-commit 合用的简写。 |
- 限制输出
git log -n
git log --since=2.weeks --after --until --before
git log --author --commiter --grep --all-match
git log -S function_name
git log --no-merges
- 简短输出 git log –abbrev-commit –pretty=oneline
- 分支差异查询
git log experiment..master # 在master分支而不在experiment分支中的提交
git log origin/master..HEAD # 在远程分支而不在当前分支的提交
git log refA refB --not refC # 查询所有被refA或者refB包含,但是不被refC包含的提交
git log --left-right experiment...master # 不是两个分支同时包含的提交查询
- 查看包含某次提交的tag git tag –contains [commitid]
搜索
- 使用git grep从提交历史、工作目录、索引中搜索字符串或者表达式 git grep –break –heading -n –count –show-function main
- git 日志搜索
git log -S ZLIB_BUF_MAX --oneline #查找ZLIB_BUF_MAX变量什么时候引入的
git log -L :git_deflate_bound:zlib.c #查看某个函数的每一次变更
git blame <file> #查看文件每一行的最后一次提交记录
回退
- 未提交到暂存区的回退 git checkout –
- git commit –amend 将暂存区文件添加到上次提交记录中,或者只修改提交信息;
- git reset HEAD 取消文件暂存,从待提交中剔除;
- 修改历史提交信息或者合并历史提交
git rebase -i HEAD~n
[[p]], pick = use commit
[[r]], reword = use commit, but edit the commit message
[[e]], edit = use commit, but stop for amending
[[s]], squash = use commit, but meld into previous commit
[[f]], fixup = like "squash", but discard this commit log message
[[x]], exec = run command (the rest of the line) using shell
[[d]], drop = remove commit
- 重置
git reset --soft HEAD~ # 撤销上一次提交记录,只移动head指针,index指针不变,既上一次提交变为暂存状态
git reset [--mixed] HEAD~ # 撤销上一次提交,也会取消暂存所有东西
git reset --hard HEAD~ # 完全撤销上一次提交,上一次提交的内容被销毁
# 亦可以指定文件路径
远程仓库
- 查看远程仓库: git remote -v
- 添加远程仓库: git remote add url
- 拉取远程仓库:git fetch 拉取后会拥有那个远程仓库的所有分支的引用;
- 推送远程仓库: git push
- 查看远程仓库信息:git remote show
- 远程仓库重命名:git remote rename
- 删除远程仓库:git remote remove
标签
- 列举标签:git tag -l “v1.8*”
- 轻量标签:git tag v1.0 [commit]
- 附注标签:git tag -a v1.1 -m “v1.1” [commit]
- 推送标签:git push origin [ [–tags–]
- 删除标签并推送:git tag -d ; git push origin –delete
分支
- git checkout -b <new_branch>创建分支并切换
- git merget 合并分支,如果冲突可尝试使用git mergetool解决冲突
- git branch -d hotfix 删除分支
- git branch -v 查看分支
- git branch –merged or –no-merged 查看merge与否的分支
- git branch –no-merged master 尚未合并到master的分支
- git push 将分支推送到远程仓库
- git checkou –track origin/serverfix 设置当前分支追踪的远程分支
- git checkout -b br origin/serverfix 检出远程分支并追踪, git checkout serverfix 如果本地没有这个分支而且远程有则会自动设置追踪
- git branch -u/–set-upstream-to origin/serverfix 修改本地分支追踪上游分支
- git branch -vv 显示分支的详细信息
- git push origin –delete serverfix 删除远程分支
- 变基: 如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基, 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
# 将experiment分支的代码以变基的方式合入master
git checkout experiment
git rebase master
git checkout master
git merge experiment
# or
git rebase master experiment
# 变基一个与另一个分支有交集的分支,只合入该分支中的有差异部分:取出client分支,找出其与server分支分歧之后的补丁,然后把这些补丁在master分支上重放
git rebase --onto master server client
忽略文件
编辑.gitignore文件,格式规范如下: • 所有空行或者以 # 开头的行都会被 Git 忽略。 • 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。 • 匹配模式可以以(/)开头防止递归。 • 匹配模式可以以(/)结尾指定目录。 • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配
任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只
匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配
(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以
匹配 a/z 、 a/b/z 或 a/b/c/z 等
文件参考 gitignore
子模块
- 为已经存在的项目添加子模块 git submodule add
- 克隆包含子模块的项目
git submodule init
git submodule update
#或者将两步合为一步
git submodule update --init
git submodule update --init --recursive #递归抓取任何嵌套的子模块
#或者在clone时进行更新
git clone --recurse-submodules <url>
- 子模块更新
# cd进子模块目录
git fetch
git merge
#或者不在子目录中运行
git submodule update --remote
- 在子模块上工作
git submodule update --remote --merge
git push --recurse-submodules=check #push前检查子模块是否已经提交
一些流程
- 提交代码流程
#创建dev分支进行开发
git checkout -b dev
#添加文件到提交列表
git add modified_file
git commit -m "msg"
git checkout 本地分支名[待提交分支]
git pull
git merge dev
git push origin 本地分支名:refs/for/远程分支名 #提交gerrit等待代码review
git push origin 分支名:refs/heads/分支名 #直接提交到远程分支
#### 或者
git fetch upstream
git merge upstream/master
vim somefile
git add somefile
git commit
git push origin <branch>
- 新建分支
#本地开好分支,推送到远程:
git checkout -b feature-branch #创建并切换到分支feature-branch
#推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)
git push origin feature-branch:feature-branch
- cherry-pick使用
git cherry-pick [<options>] <commit-ish>...
常用options:
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息