git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)
Git有什么特点?简单来说就是:高端大气上档次! – 引用自廖雪峰的官网
安装完git后
检查是否安装完成
git --version
进行全局配置
$ git config --list
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ git config --global user.password 'youpassword'
与远程仓库握手
我们通常需要在github或gitee去生成的钥匙
ssh-keygen -t rsa -C "你的邮箱地址"
cd .ssh
cat .\id_rsa.pub
cv 到github 或者gitee
要熟练理解 git 的 使用:就要有
时间线的概念
每一次commit 就是一个版本生成一个它的id
git 分为3个区域:工作区、暂存区、版本控制区
首先对需要跟踪的项目进行初始化
git init
会选择当前路径的所有文件 单个跟踪就直接输入对应文件
git add .
此时我们的文件会从当前的工作区跟踪到暂存区
当我们需要进行提交到版本控制区的时候
git commit -m "提交备注信息"
第一次推送时
git remote add origin git@gitee 用户名加项目仓库地址 //cv 你的项目仓库地址
推送并创建到你的master
git push -u origin master
一些常用的git指令 重命名分支
git branch -m oldname newname
删除远程分支
git branch --delete origin oldname
上传新分支到远程
git push origin newname
把修改后的本地分支与远程分支关联
git branch --set-upstream-to origin/newName
拉取远程仓库且合并
git pull origin master
l拉取本地不合并
git fetch <remote>
查看状态
git status
查看官方手册
git help git
查看提交日志
git log
查看分支
git branch
查看本地和远程所有分支
git branch -a
拉取远程的并切换到新分支
git checkout -b 新分支名 origin/远程分支名
提一句: - b , 意思就是base 会议当前的分支未base,新建分支
git checkout remote/.../...
查看提交日志树
git log --graph --oneline
查看当前目录所有改动的内容
git diff
查看一个文件的改动情况
git diff 文件名
撤销修改
git checkout -- 文件名
从git缓存中删除而不是磁盘
git rm --cached 文件名
强制删除
git rm 文件名 -f
查看完整的提交哈希码
git log --graph --pretty=oneline
管理 reflog 信息
git reflog
此时我们通过查看到的信息配合回滚命令
git reset --hard 版本号进行强制回滚
查看当前暂存区的文件
git ls-files
显示暂存的条目的相关信息
git ls-files -s
显示删除了的文件
git ls-files -d
撤销错误添加到暂存区的文件
git rm --cache 文件名
删除提交到暂存区的文件|文件夹
git rm -r --cache 文件|文件夹名
**撤销所有**
git reset HEAD -- .
撤销特点目标
git reset HEAD -- 文件或者文件夹名
将文件从缓存中删除
git rm -cached filepath
删除错误提交的commit有三个选项,–hard、–mixed、–soft
仅仅只是撤销已提交的版本库,不会修改暂存区和工作区
git reset --soft 版本库ID
//仅仅只是撤销已提交的版本库和暂存区,不会修改工作区
git reset --mixed 版本库ID
//彻底将工作区、暂存区和版本库记录恢复到指定的版本库
git reset --hard 版本库ID
显示暂存区的目录树,其中第三个字段不是文件大小而是暂存区编号
若想针对暂存区的目录树使用git ls-tree命令,需要先将暂存区的目录树写入Git对象库,然后针对该目录树执行git ls-tree命令
查看HEAD(版本库中当前提交)指向的目录树
git ls-tree -l HEAD
创建分支
git branch 分支名称
切换分支
git checkout 分支名称
创建并立即切换到分支
git checkout -b 分支名称
合并分支
git merge 分支名称
删除分支(合并后,谨慎使用)
git branch -d 分支名称
**删除远程源仓库**
git remote rm origin
删除远程分支
git push origin --delete 分支名称
添加远程源仓库**
git remote add origin 仓库地址
直接修改远程源仓库
git remote set-url origin 仓库地址
将本地分支和远程分支合并关联
git push --set-upstream origin 新分支名
git Fork 项目的仓库同步更新上游
git被称为搞基网,可能跟 fork me 有关联…此处应该有一张图
在你clone 下来的 fork 别人(fork 后的地址) 的本地仓库里 运行:
第一步 验证远程分支
git remote -v
如果你是第一次使用本操作,那么不出意外的话,你的源仓库 就是你 fork 过来的仓库
第二步 现在你要指定你的上游仓库,也就是原作者的仓库地址,去复制过来
git remote add upstream 原作者的仓库
第三步 进行验证
git remote -v
现在它有4行了.
第四步 拉取更新的 branches 和 commits
git fetch upstream
第五步 Checkout 本地分支
git checkout master
第六步 合并
git merge upstream/master
第七步 提交
git push origin master
谨慎使用
删除暂存区中的文件
同时删除暂存区与工作区中的文件!
git rm -f 文件名
删除远程仓库
git remote rm 远程仓库名
初学者 不容易理清楚 remote、origin 以及时间线的概念,其实很好理解
remote 直译: 远程
origin 直译: 源
时间线:类似黑客帝国 子弹时间 的实现原理
提一句
git pull // 等同 git fetch + git merge
一句话:将远程的部分与本地进行合并
推荐使用
创建 .gitignore
字面意思:git 忽略 ,git 会依赖此文件忽略文件匹配管理
把他建在仓库根目录下
无需后缀名 ,可以直接用正则进行匹配
比如:我们推送远程,发给你的协调开发者时,无需或者不想发送某些文件的时候
node_modules/ //匹配所有node_modules目录以及目录下的所有目录以及文件
可能遇到的问题
git merge upstream/master
可能提示
error: Your local changes to the following files would be overwritten by merge:
hr/src/views/employees/employees.vue
Please commit your changes or stash them before you merge.
Aborting
解决办法:回滚
git stash
git pull origin master
git stash pop //此时,执行git stash pop,您将看到冲突的局部更改仍然存在,让你决定将进行什么操纵
回滚:
git reflog //查阅版本号
git reset --hard 版本号
git pull origin master
统计个人代码量
git log --author="xiongteng" --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 }' -
查看排名前 5 的贡献者
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
统计所有用户的行数信息
git log --shortstat --pretty="%cE" | sed 's/\(.*\)@.*/\1/' | grep -v "^$" | awk 'BEGIN { line=""; } !/^ / { if (line=="" || !match(line, $0)) {line = $0 "," line }} /^ / { print line " # " $0; line=""}' | sort | sed -E 's/# //;s/ files? changed,//;s/([0-9]+) ([0-9]+ deletion)/\1 0 insertions\(+\), \2/;s/\(\+\)$/\(\+\), 0 deletions\(-\)/;s/insertions?\(\+\), //;s/ deletions?\(-\)//' | awk 'BEGIN {name=""; files=0; insertions=0; deletions=0;} {if ($1 != name && name != "") { print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net"; files=0; insertions=0; deletions=0; name=$1; } name=$1; files+=$2; insertions+=$3; deletions+=$4} END {print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net";}'
git blame -h
--incremental 在我们找到它们时显示责备条目,增量
-b 不显示边界提交的对象名称(默认值:关闭)
--root 不将根提交视为边界(默认值:关闭)
--show-stats 显示工作成本统计
--progress 强制进度报告
--score-debug 显示责备条目的输出分数
-f, --show-name 显示原始文件名(默认:自动)
-n, --show-number 显示原始行号(默认:关闭)
-p, --porcelain 以专为机器使用而设计的格式显示
--line-porcelain 显示带有每行提交信息的瓷器格式
-c 使用与 git-annotate 相同的输出模式(默认:关闭)
-t 显示原始时间戳(默认:关闭)
-l 显示长提交 SHA1(默认值:关闭)
-s 禁止作者姓名和时间戳(默认值:关闭)
-e, --show-email 显示作者电子邮件而不是姓名(默认值:关闭)
-w 忽略空格差异
--ignore-rev <rev> 责备时忽略 <rev>
--ignore-revs-file <文件>
忽略来自 <file> 的修订
--color-lines 对上一行的冗余元数据进行不同的着色
--color-by-age 颜色线按年龄
--最少花费额外的周期来找到更好的匹配
-S <file> 使用来自 <file> 的修订而不是调用 git-rev-list
--contents <file> 使用 <file> 的内容作为最终图像
-C[<score>] 查找文件内和文件间的行副本
-M[<score>] 查找文件内和文件间的行移动
-L <range> 只处理行范围 <start>,<end> 或 function :<funcname>
--abbrev[=<n>] 使用 <n> 位来显示对象名称