git
一、配置ssh
- 设置user name和email
git config --global user.name 'heny' git config --global user.email 'heny@qq.com'
- 生成SSH密钥过程
(1)查看是否已经有了ssh密钥:cd ~/.ssh
路径:c:/用户/Administrator/.ssh 删除.ssh下面的所有文件
(2)生成密钥
ssh-keygen -t rsa -C 'heny@qq.com' // 回车之后记得根据提示按下yes
注意:如果提示ssh-keygen不是内部命令或者其他的报错,则需要以下配置
找到git/usr/bin目录下的ssh-keygen.exe,之后配置到Path环境变量;
- 生成密钥之后就可以去官网绑定了
二、项目初始化
- 在git官网新建一个git仓库之后;
如果没有使用readme初始化,执行以下四步
git init # 初始化
git add . # 添加当前项目文件夹下的所有文件, 如果是./*则是当前文件夹下
git commit -m '描述' # 给文件添加备注
git remote add origin 地址 # 添加远程仓库地址
git push -u origin master # 把本地添加的文件上传到git;
- 如果使用了readme初始化;
git clone 地址 # 克隆只需要操作一次
- 当修改了文件之后想要上传代码
如果git pull拉下来的代码有冲突则需要先解决冲突问题,解决之后需要再次git add 重复第一二次,如果没有则直接git pushgit add . git commit -m '添加描述' git pull git push
注意:push失败的情况
(1)文件为空
(2)创建文件之后没有commit
三、分支操作
分支常用命令
git branch
查看本地分支git branch -a
查看所有分支git branch -vv
查看本地分支写远程分支的对比git checkout <branch>
切换到一个分支,本地没有的分支远程有的话也可以直接切换git checkout -b dev
创建一个新分支git checkout -b dev origin/dev
切换到一个新的分支,并追踪到远程分支上;git push --set-upstream origin dev
将本地新分支推到远程git fetch
拉取最新远程信息git merge master
合并master内容git rebase dev2.0
融合dev2.0分支最新的内容
分支命名规范
master
:master分支为主分支,也是用于部署生产环境的分支,master分支一般由其他分支进行合并,任何时间都不能直接修改master分支;develop
:develop-4.0.0;分支为开发分支,一般开发新功能时,feature分支都是基于develop分支创建的;feature
:feature-user;开发新功能时,以develop为基础创建feature分支release
:release-4.0.0;release为预上线分支,发布提测hotfix
:hotfix-***;线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支,修复完成后,需要合并到master分支和develop分支
主分支master建议每次上线打上tag
git tag -a v0.1 -m '部署包版本名'
commit 提交消息类型
- feat:添加新特性
- fix:修复bug
- docs:仅仅修改了文档
- style:仅仅修改了样式,不改变代码逻辑
- refactor:代码重构,没有加新功能或者修复bug
- perf:增加代码进行性能测试
- test:增加测试用例
- chore:改变构建流程、或者增加依赖库、工具等;
清理本地分支
git remote show origin
git remote prune origin
删除分支
删除不能删除远程的分支
(1)删除单个分支
git branch -D dev
(2)批量删除:删除除去master分支:
git checkout master
git branch | grep -v 'master' | xargs git branch -D
rebase
git rebase会将当前分支的提交复制到指定的分支之上;
git rebase master
将一个分支的修改融入到另一个分支;
rebase可以保留一个漂亮的、线性的git历史记录;
同一分支的合并
当拉代码遇到冲突时,需要pull,这时,git log --oneline --graph
会发现多出了一个分叉,这时输入git rebase
即可合并当前的分叉,之后执行push提交代码;
也可以直接:git pull --rebase
;不需要pull之后再rebase;
不同分支之间的合并
# 当dev1分支修改后, 切换到dev2分支, 并rebase dev1分支
git checkout dev2
git rebase dev1
git checkout dev1
如果在rebase时,出现冲突,比如:代码修改
rebase冲突之后:git rebase --continue
;因为之前的rebase其实只完成了一半;
参考文献:Git rebase使用
删除中间的版本
git rebase -i commit-id
执行命令之后会弹出来一个vim编辑器,将要删除的版本的pick
改为drop
,之后保存,之后执行git push -f -u
强制推送远程
常见分支问题
- 在非目的分支上做了修改,想切换回目的分支
(1)无论有没有添加到暂存区都行(暂存区就是有commit代码)
git checkout -b new_branch # 建立临时分支, 这样改动会被带到新分支
git stash # 保存在栈区
git checkout 目标分支
git pull # 将代码拉下来, 避免解决冲突
git stash pop # 将栈区内容取出放到当前分支
(2)已提交到本地仓库
git reset HEAD^ # 撤销最近一次提交
ignoring broken ref refs问题
- 找到.git目录下refs/remotes/origin目录(子模块的这个目录是在主模块的.git目录下,因为子模块没有.git目录)
- 删除里面的HEAD文件或者所有文件
- 然后运行git fetch –all
分支介绍
所有分支针对
master
做比较,下图中,左边为落后master
分支数量,右边为超前master
分支数量;
四、暂存操作
为什么需要暂时:
- (1)当我们写代码时,发现写错分支了,此时需要将代码保存到暂存区,切换到正确的分支再拉下来
- (2)当我们修改了一些文件时,想查看修改的文件是否造成了其他问题,可以先保存在暂存区,测试完再拉下来
基础使用
git stash # 提交到暂存区 git stash pop # 拉下来
常用的git stash命令
git stash save 'message'
:执行存储时,添加备注,方便查找,git stash不方便查找git stash list
:查看stash了哪些存储git stash show
:显示做了哪些改动,默认show第一个存储,git stash show stash@{1}
: 显示第一个修改文件git stash apply
: 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个git stash apply stash@{1}
:应用第一个git stash pop
: 命令恢复之前的缓存工作目录,将缓存堆栈中的对应stash删除git stash pop stash@{1}
:应用指定的stashgit stash drop stash@{1}
:丢弃第几个存储,从列表中删除这个存储git stash clear
: 删除所有缓存的stash;
注意:新增的文件,直接执行stash
是不会被存储的,如果有新增文件的时候,需要首先执行git add添加新文件到git库中,不需要提交和commit
,然后再执行git stash
即可;
五、用户管理
git config --list
查看git配置
六、版本管理
状态查看
git status
查看文件add的状态,以及远程是否有更新
日志查看
git log
# 获取版本idgit reflog
# 查看所有的版本id,可以查看到回退之后的之前的版本
reflog可以查看到所有的操作信息,比如push、reset、commit等等;
比如:1-10的版本回退到1-8的版本,git log只能看到最新的8,reflog还可以看到10;
回退版本
- 软重置:
git reset --soft HEAD~2
或id;
执行软重置不会移除提交之后加入的修改,但是会修改git的历史记录,当使用了reset可以使用status查看修改内容,意味着可以重新修改重新提交;
- 硬重置:
git reset --hard id
不保留提交引入的修改,看不到之前的修改内容;
常用的回退版本命令:
git reset --hard id # 回退本地代码库
git push -f -u origin master # 推送到远程服务器
git pull # 重新拉取代码
回退上一个版本:git reset --hard head^
切换远程仓库地址
git remote -v # 查看本地仓库远程地址
git remote rm origin # 删除本地远程地址
git remote add origin 地址 # 添加远程仓库地址
git branch --set-upstream-to=origin/master master # 将本地分支追踪到远程master
七、git常见问题
描述出错怎么修改描述
(1)通过git log找到上一个提交的commit_id
(2)通过:git reset –soft commit_id,执行一遍,之后就可以重新git commit了;
项目名字被修改,地址被更换
# 第一种
git remote set-url origin url # 重新设置远程地址
# 第二种
git remote rm origin # 删除跟踪远程
git remote add origin url # 重新配置远程地址
放弃本地修改
没有git add .
的情况
- 放弃单个文件修改:
git checkout -- readme.md
- 放弃所有修改:
git checkout .
有git add .
的情况
- 放弃单个文件:
git reset HEAD readme.md
- 放弃所有:
git reset HEAD .
八、git统计代码量
修改since开始日期,和until到什么日期,如果不修改则是至今
如果单独查询某个用户,修改$name为用户邮箱
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --since =2020-03-30 --until=2020-04-02 --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
–since 限制显示输出的范围
--since
,--after
仅显示指定时间之后的提交--until
,--before
仅显示指定时间之前的提交--author
仅显示指定作者相关的提交
例子:
git log --until=1.minute.ago
// 一分钟之前的所有loggit log --since=1.day.ago
// 一天之内的loggit log --since=1.month.age --until=2.weeks.age
// 一个月之前到半月之前的log
指定时间
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --since ='2020-04-02 00:00:00' --until='2020-04-02 23:59:59' --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
九、git其他操作
在一行查看提交日志:git log --oneline --decorate --graph
git rm
git rm
:同时从工作区和索引中删除文件git rm -r --cached
:从索引中删除文件,但是本地文件还在常用的删除远程文件命令:
git rm -r --cached target # 删除target文件 git commit -m 'delete target' git push
打造自己的git bash
https://blog.csdn.net/Dancer__Sky/article/details/81632640
十、vscode操作git
vscode配置git环境
终端直接使用git方式,带有颜色
(1)将以下代码添加到vscode设置里面
路径:点击小齿轮–>设置–>点击以json文件编辑,并添加进去;
"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe"
(2)之后按ctrl+` 可以打开终端;
输入cmd可以转回原生的cmd终端
输入bash可以转回git终端;
vscode文件后面的字母意思
A: 你本地新增的文件(服务器上没有).
C: 文件的一个新拷贝.
D: 你本地删除的文件(服务器上还在).
M: 文件的内容或者mode被修改了.
R: 文件名被修改了。
T: 文件的类型被修改了。
U: 文件没有被合并(你需要完成合并才能进行提交)。
X: 未知状态(很可能是遇到git的bug了,你可以向git提交bug report)。
vscode上传代码
- 点击分支
- 点击对勾,之后弹出提示框,提示输入commit
- 点击推送,或者推送到(会提示选择分支);
- 之后去git里面查看是否已经提交了代码;
vscode切换分支
十一、vscode插件
gitlens
使用gitlens使开发更方便,代码管理更容易
- 搜索:gitlens 并安装,之后在每一行代码后面可以清晰的看见
- 侧边栏工具使用
- 右上角实时对比分支修改内容
git graph
方便查看git分支提交记录,可以直接基于一个log创建一个新的分支、
两种打开方式:
)