返回

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]]

操作

  1. 初始化 git init命令创建一个本地的仓库 git clone / clone一个已经存在的仓库
  2. 添加追踪文件 git add 添加文件到仓库暂存区
  3. 提交: 尝试每个提交成为一个逻辑上独立的变更集,并且每个提交附带一个 有用的信息 git diff –check 检查是否有空白错误 git commit 加-a参数会跳过暂存,将所有已追踪文件一起提交
  4. 删除文件
rm file #本地删除文件,修改未放入暂存区
git rm file #修改待提交,提交完成之后文件不再跟踪
git rm -f file #删除已经修改或者已经暂存的文件
git rm --cached file #将文件从仓库中删除但是保留在本地
  1. 文件重命名 git mv old new
  2. 贮藏
git stash #贮藏当前未提交内容
git stash list #查看已经贮藏的列表
git stash apply #应用最新贮藏
git stash apply <stashid> #指定应用的贮藏
git stash pop #应用贮藏并从栈上丢弃
  1. 清理工作目录 git clean -f -d [-n] git stash –all

查询

仓库状态

  1. git status查看当前仓库状态;
  2. git diff查看详细的未暂存文件与暂存区域的差异;
  3. git diff –staged/cached 查看对比已暂存文件与最后一次提交的文件差异;
  4. git diff master…contrib 查看当前contrib分支与master分支的共同祖先起,该分支中的工作。

提交记录

  1. git log 按照时间顺序显示提交记录;
  2. git log -p 附带提交记录变化;
  3. git log –stat 显示缩略统计信息;
  4. git log –pretty=oneline\full\fuller\short 自定义输出信息程度;
  5. 可以自定义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 合用的简写。
  1. 限制输出
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
  1. 简短输出 git log –abbrev-commit –pretty=oneline
  2. 分支差异查询
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  # 不是两个分支同时包含的提交查询
  1. 查看包含某次提交的tag git tag –contains [commitid]

搜索

  1. 使用git grep从提交历史、工作目录、索引中搜索字符串或者表达式 git grep –break –heading -n –count –show-function main
  2. git 日志搜索
git log -S ZLIB_BUF_MAX --oneline #查找ZLIB_BUF_MAX变量什么时候引入的
git log -L :git_deflate_bound:zlib.c #查看某个函数的每一次变更
git blame <file> #查看文件每一行的最后一次提交记录

回退

  1. 未提交到暂存区的回退 git checkout –
  2. git commit –amend 将暂存区文件添加到上次提交记录中,或者只修改提交信息;
  3. git reset HEAD 取消文件暂存,从待提交中剔除;
  4. 修改历史提交信息或者合并历史提交
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
  1. 重置
git reset --soft HEAD~ # 撤销上一次提交记录,只移动head指针,index指针不变,既上一次提交变为暂存状态
git reset [--mixed] HEAD~ # 撤销上一次提交,也会取消暂存所有东西
git reset --hard HEAD~ # 完全撤销上一次提交,上一次提交的内容被销毁
# 亦可以指定文件路径

远程仓库

  1. 查看远程仓库: git remote -v
  2. 添加远程仓库: git remote add url
  3. 拉取远程仓库:git fetch 拉取后会拥有那个远程仓库的所有分支的引用;
  4. 推送远程仓库: git push
  5. 查看远程仓库信息:git remote show
  6. 远程仓库重命名:git remote rename
  7. 删除远程仓库:git remote remove

标签

  1. 列举标签:git tag -l “v1.8*”
  2. 轻量标签:git tag v1.0 [commit]
  3. 附注标签:git tag -a v1.1 -m “v1.1” [commit]
  4. 推送标签:git push origin [ [–tags–]
  5. 删除标签并推送:git tag -d ; git push origin –delete

分支

  1. git checkout -b <new_branch>创建分支并切换
  2. git merget 合并分支,如果冲突可尝试使用git mergetool解决冲突
  3. git branch -d hotfix 删除分支
  4. git branch -v 查看分支
  5. git branch –merged or –no-merged 查看merge与否的分支
  6. git branch –no-merged master 尚未合并到master的分支
  7. git push 将分支推送到远程仓库
  8. git checkou –track origin/serverfix 设置当前分支追踪的远程分支
  9. git checkout -b br origin/serverfix 检出远程分支并追踪, git checkout serverfix 如果本地没有这个分支而且远程有则会自动设置追踪
  10. git branch -u/–set-upstream-to origin/serverfix 修改本地分支追踪上游分支
  11. git branch -vv 显示分支的详细信息
  12. git push origin –delete serverfix 删除远程分支
  13. 变基: 如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基, 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
# 将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

子模块

  1. 为已经存在的项目添加子模块 git submodule add
  2. 克隆包含子模块的项目
git submodule init
git submodule update
#或者将两步合为一步
git submodule update --init
git submodule update --init --recursive #递归抓取任何嵌套的子模块
#或者在clone时进行更新
git clone --recurse-submodules <url>
  1. 子模块更新
# cd进子模块目录
git fetch
git merge
#或者不在子目录中运行
git submodule update --remote
  1. 在子模块上工作
git submodule update --remote --merge
git push --recurse-submodules=check #push前检查子模块是否已经提交

一些流程

  1. 提交代码流程
#创建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>
  1. 新建分支
#本地开好分支,推送到远程:
git checkout -b feature-branch #创建并切换到分支feature-branch
#推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)
git push origin feature-branch:feature-branch
  1. cherry-pick使用
git cherry-pick [<options>] <commit-ish>...
常用options:
--quit            退出当前的chery-pick序列
--continue        继续当前的chery-pick序列
--abort           取消当前的chery-pick序列,恢复当前分支
-n, --no-commit   不自动提交
-e, --edit        编辑提交信息