一 Git 流程图(原理图)
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
二 日常使用命令
# 查看工作区和暂存区的状态
$ git status
# 将工作区的文件提交到暂存区
$ git add .
# 提交暂存区的代码到本地仓库
$ git commit -m "本次提交说明"
# add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)
$ git commit -am "本次提交说明"
# 将本地分支和远程分支进行关联
$ git push -u origin branchName
# 将本地仓库的文件推送到远程分支
$ git push
# 拉取本地当前分支所对应的远程分支的代码
$ git pull
# 拉取远程分支的代码(指定拉取的分支)
$ git pull origin branchName
# 合并分支 (例:dev分支合入master,branchName 就是dev,当前分支需要在master分支)
$ git merge branchName
# 查看本地拥有哪些分支
$ git branch
# 查看所有分支(包括远程分支和本地分支)
$ git branch -a
# 切换分支
$ git checkout branchName
# 新建分支并切换到新建的分支上
$ git checkout -b branchName
# 临时将工作区文件的修改保存至堆栈中 (应用场景: 比如此时正在开发功能A,但是临时需要拉取别人已经提交在原端仓库的代码,但是本地刚刚开发了一小部分,还不想提交;如果不提交直接拉取,提示会有冲突,当前可能会被重写,所以此时先将自己改的 暂存起来,然后拉取,拉取后,在将自己刚刚暂存的取出来,这时vdcode就会提示哪些文件有冲突,在解决冲突即可)
$ git stash
# 将之前保存至堆栈中的文件取出来
$ git stash pop
三 代码冲突的2种情况
冲突的核心: 修改了同一个文件;
3.1 第1种情况:
在同一个分支开发(例:dev) ,同事A改了 main.js文件 ,提交到远端, 然后你在本地也修改了main.js文件,当你拉取代码时,就会提示会有冲突;
又分为2种情况:
第1种,修改了同一个文件,但是没有修改同一个内容;
vdcode会自动合并冲突,因为并未改动同一个地方,所以自动合并(automerge).
第2种,修改了同一个文件,而且修改同一个内容;
vscode会提示 冲突的区域,至于是如何保留,就看自己和同事协商来解决!
3.2 第2种情况
将不同分支的代码进行合并时,会出现冲突
例: 平时是将dev代码合并到master分支,并不会冲突; 此时,在master分支新建一个分支 merge,merge分支代码和master分支代码 保持一致;
将开发的dev代码,合并至merge分支,将会有冲突(冲突的原因具体没有去细究,实际中是遇到了,重点讲解冲突了如何解决);
解决方法: 将本地代码推到远端 dev分支,分别下载一份远端dev和远端merge 分支代码,使用去重软件(compare),进行比对,将不同的代码选择合入到 merge分支,即可解决冲突;
应用场景: 开发3个功能,其中2个功能不需要再本次上线,只需要上1个.
如果是只有dev 和master分支, 本地开发3个功能代码,如果只提交上线的那1个功能的代码,然后合并至master ,看上去是可以的(这只是提交代码是可以的,未涉及发布).
但是面临一个问题,上线肯定是需要打包的,打包是在本地dev打包的(这一步会将另外不需上线的2个功能也打包进去),打包完成之后将dev代码提交到远端dev的(不上线的2个功能也提交到远端dev了),然后合并远端dev到master,上线 master分支. 造成的问题就是: 3个功能都上线了.
解决方法: 新建一个merge分支, 每次将需要上线的功能代码提交至 远端dev,不需要的就留在本地不进行提交;
然后将远端dev分支 合并至 merge 分支(注意:1merge分支代码需要和master分支保持一致 2解决远端dev合并至merge分支的冲突,使用前面讲到的使用compare软件将上线的代码合入merge分支) , 合并至merge分支后,在merge分支进行打包, 将打包后的merge分支 合并至master 分支, 上线master分支即可;
四 命令行统计一段时间内的代码量
git bash 执行如下命令统计代码量:
git log --author}="" --pretty=tformat: --since =2021-2-1 --until=2021-2-28 --numstart | awk '{ add +=$s1;subs += $2; loc +=$1- $2} END {printf "added lines :%$, removed lines :%$,total lines:%$\n",add,subs,loc }'
其中的 since 是日期的起始, until 是日期的终止;