Git操作
基础操作
查看全局配置信息
git config --list
设置全局配置信息
git config --global user.name "wwyz"
初始化本地仓库
git init
将文件加入git版本库
git add "文件名"
拉取代码
git clone "版本库地址" "目录名"
# 快速克隆,克隆深度为1指最近一次commit
git clone --depth=1 "版本库地址" "目录名"
查看文件状态
git status
提交代码
git commit "说明"
git commit --amend # 重新提交
移除文件,移除后文件不在被版本控制
git rm
git rm --cached readme.txt #缓存中移除
移动文件
git mv "文件路径" "目标文件路径"
查看提交文件历史
git log
git log -p -2 #-p选项展开显示每次提交的内容差异,用-2则仅显示最近的两次更新
查看远程仓库
git remote -v
# 添加远程仓库
git remote add pb git://github.com/paulboone/ticgit.git
# 拉取远程代码更新
git fetch pb
# 查看远程仓库的信息
git remote show origin
推送提交的代码
git push origin master
忽略文件
通过在项目根目录配置.gitignore文件忽略要忽略的文件/文件夹。
Java项目一般忽略:.idea、target、out、classes
前端项目一般忽略:.idea、node_modules、dist
.gitignore 格式规范如下:
- 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob(shell 所使用的简化了的正则表达式)模式匹配。
- 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
*.[oa] # 忽略所有以 .o 或 .a 结尾的文件
*~ # 忽略所有以波浪符(~)结尾的文件
Tag打标签
对某一时间点上的版本打上标签,通常结合版本使用。Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
列出已有标签
git tag
分支
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。有人把 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来。Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。
什么是分支
在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
新建分支
git branch "分支名"
切换分支
git checkout "分支名"
合并分支
# 将其他分支合并到本分支
git merge "分支名"
分支变基
git rebase
# 将多次提交合并为一次提交,-i表示弹出交互式的界面让用户编辑完成合并操作
git rebase -i "开始提交点" "结束提交点"
# 将某一段commit粘贴到另一个分支上
git rebase "开始提交点" "结束提交点" --onto "分支名称"
拓展操作
版本库迁移
- 新建新git仓库
- 修改旧的git项目的remote地址为新仓库地址
- 执行强制push
git push -u origin master -f
统计代码提交数
git log --oneline | wc -l
统计代码行数
git log --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'