git规范操作从入门到精通

901 阅读8分钟

关于git,你知道多少

规范

开篇刚开始我们就要提一下规范的git习惯,并做持续更新。规范的习惯,让我们更加专业

如何维护commit

commit 规范

        'feat', // 新功能(feature)
        'fix', // 修复bug
        'upd', // 更新某功能
        'refactor', // 重构
        'docs', // 文档(documentation)
        'chore', // 构建过程或辅助工具的变动
        'style', // 格式(不影响代码运行的变动)
        'revert', // 撤销commit
        'perf', // 性能优化
        'test', // 测试(单元、集成测试)

https和ssh的转换

先看一下自己是通过什么方式clone的项目: git remote -v

  • https转ssh: git remote set-url origin @git.....
  • ssh转https: git remote set-url origin ....

保持commit提交记录的有效率

1. 当我们提交代码到本地仓库的时候,经常会遇到重复提交的情况。
场景: 
刚刚commit完毕,发现描述信息有误,需要修改一下描述信息再次提交;
commit信息没有错,但是修改了一下代码的格式,最后也需要重新提交。

这样无非在分析(仓库管理工具gitlab)提交记录增加了混淆度,
因此我们可以在提交到暂存区后使用git commit --amend ,这个命令的
作用是对上一次commit描述进行修改,因此就解决了重复commit的问题。

2.如果git commit --amend后,你git pull origin daily/0.0.1发现提示
`fatal: refusing to merge unrelated histories`
解决: git pull origin daily/0.0.1 --allow-unrelated-histories
但是正常情况下,都是在自己的分支上开发的,也就不会出现远程仓库领先于自己仓库
的情况,所以也就没有必要再次执行命令:git pull origin daily/0.0.1

3.撤回commit的命令:
git reset --soft commitID   绿
git reset --mixed commitID  红
git reset --hard commitID	  白
每一次的commitId肯定是不同的,所以再次commit然后git push时会报错:

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决: 可以 git push --force

stage/index > working/directory如下
git reset HEAD readme.txt	暂存区》工作区
git checkout readme.txt 	撤销工作区的更改
。。。。。。。

增删某条commit

  • 删除中间某一条commit
1.git log获取commit信息 

2.git rebase -i (commit-id) 

commit-id 为要删除的commit的下一个commit号 

3.编辑文件,将要删除的commit之前的单词改为drop 

4.保存文件退出大功告成 

5.git log查看

摘commit命令

git cherry-pick commitId 将某一条commit合并到当前所在分支 www.ruanyifeng.com/blog/2020/0…

准备工作

当你领到一台新电脑或者已有电脑重装系统了,你需要做哪些,来使用git。

  1. 生成ssh秘钥

1.1 mac版


ls -al ~/.ssh
Lists the files in your .ssh directory, if they exist


ssh-keygen -t rsa -C "your_email@example.com"

1.2 window

windows+R输入命令ssh-keygen -t rsa -C "asdf@163.com" 在这里插入图片描述 问题:我们需要的是公共秘钥,如果没有 .pub后缀的文件 原因:隐藏了已知文件类型的扩展名 解决: 在这里插入图片描述 在这里插入图片描述

  1. 登录github新建ssh key 在这里插入图片描述 在这里插入图片描述

  2. 验证ssh

>本地新建文件夹右键Git Bash Here
>git init
>git config user.name 'github名字'
>git config user.email 'github绑定的邮箱'
>本地仓库与远程仓库建立连接:
git remote add origin git@github.com:China_forrest/learngit.git     
git remote -v  查看连接情况
git remote  rm origin 断开与远程仓库的连接  
>把远程仓库源代码拉取到本地
git pull origin master   这里的master指的是远程仓库的分支名
>然后yes
>验证成功后,就会把远程分支master分支的代码拉取到我本地的文件夹,
同时在本地创建一个master分支
>建立本地分支与远程分支的连接
git branch --set-upstream-to origin daily/0.0.1
第一次推送的时候git push -u origin 分支名

至此新的电脑或新的系统:本地仓库重新建立了与远程仓库的连接

从远程库拉代码之git clone和git pull的区别

1.是否是需要本地是一个仓库

git clone 不需要本地仓库(.git文件夹)    在本地仓库文件夹内生成一个新的文件夹alibaba
git pull  需要先初始化本地文件夹为一个本地仓库(有.git文件夹)         直接将远程仓库文件夹内的文件拷贝到本地仓库(文件夹)

git clone 在这里插入图片描述 git pull

在这里插入图片描述

2.切换分支(仅限于刚拉下代码的时候) git clone git远程仓库已有的分支可以直接进行切换 在这里插入图片描述 git pull 不能直接切换远程仓库 已有的分支 在这里插入图片描述 3.推送远程库

  • git clone 直接指定分支可以推动到远端
git chekcout -b dev
git push --set-upstream origin dev
  • git pull 先指定源
git remote add origin git@github.com:rdmclin2/learngit.git,远程库的名字叫origin
git pull origin master   // 或者可以这样  git merge master  将master分支合并到当前分支

git push -u origin '分支名’

知道

关于git命令我们仅仅知道,git add,git commit, git push,是不能满足团队协作开发的。本文将对git命令作出系统的总结。

团队协作

在这里插入图片描述

  • 首先,可以试图使用git push origin branch-name 推送自己的修改
  • 如果推送失败,则因为远程分支比你的本地分支更新,需要用git pull试图合并
  • 如果合并有冲突,则解决冲突,并在本地提交;
  • 没有冲突或者解决冲突后,再用git push origin branch-name 推送就能够成功
  • 如果git pull 提示 "no tracking information",则说明本地分支和远程分支的链接关系没有创建,用git branch --set-upstream branch-name origin/branch-name

注意:不要直接在迭代分支上写代码:比如我们这次的迭代分支是dev,那么在dev上checkout出自己的开发分支,一个功能完成后提交MR到dev上,有其他同学来review,有问题的地方进行整改,全部ok后合并入dev。等dev也稳定之后合并入master.

关联本地和远程分支

  • 第一种,远程分支如dev,本地分支如dev, 用git branch --set-upstream dev origin/dev

  • 第二种,本地分支创建分支如dev,用git push -u origin dev,将本地分支上传到远程仓库,并关联起来,如果远程分支没有dev分支,会自动创建。

  • 第三种,抓取远程分支并在本地建立关联的分支, 用git chekcout -b local-branchname origin/remote_branchname

Commit提交规范

根据angular规范提交commit,这样history看起来更加清晰,还可以自动生成changelog。

<type>(<scope>:<subject>)
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

(1)type 提交commit 的类型,包括以下几种

  • feat:新功能
  • fix:修复问题
  • docs:修改文档
  • style:修改代码格式,不影响代码逻辑
  • refactor:重构代码,理论上不影响现有功能
  • pref:提升性能
  • test:增加修改测试用例
  • chore:修改工具相关(包括但不限于文档、代码生成等)
  • deps:升级依赖 (2)scope 修改文件的范围(包括但不限于doc,middleware,proxy,core,config) (3)subject 用一句话清楚的描述这次提交做了什么 (4)body 补充subject,适当增加原因、目的等相关因素,也可以不写 (5)footer
  • 当有非兼容修改时可以在这里描述清楚
  • 关联issue,如Close #1, Close #2 ,#3
  • 如果功能点有新增或这修改的,还需要关联 chair-handbook和chair-init的MR,如chair/doc!123

示例:

1  fix($compile) : couple of unit test for IE9
2 
3 Older IEs serialize html html uppercased, but IE9 does not ...
4 Would be better to expect case insensitive,unfortunately jasmine does
5 not allow to user regexps for throw expectations.
6
7 Document change on chair/doc!123
8
9 Cloes #392
10  Breaks foo.bar api, foo.baz should be used instead

具体查看文档点这里

提交Merge Request 如果你有仓库的开发者权限,而且希望贡献代码,那么你可以创建分支修改代码提交MR,让负责人review代码合并到主干。

//先创建开发分支开发,分支名应该有含义,避免使用update、tmp之类的
$ git checkout -b branch-name

//开发完成后跑下测试是否通过,必要时需要新增或修改测试用例
$ npm run test

//测试通过后提交代码,message建下面的规范

$ git add . //git add -u 删除文件
$ git commit -m "fix(role):role.use must xxx"
$ git push origin branch-name

提交后就可以在gitlab创建MR了。 由于谁也无法保证过了多久之后还记得多少,为了后期回溯历史的方便,请在MR时确保提供一下信息。

需求点(一般关联issue或者注释都算)
升级原因(不同于issue,可以简述一下为什么要处理)
框架测试点(可以关联到测试文件,不用详细描述,关键点即可)
关注点(针对用户而言,可以没有,一般是不兼容更新等,需要额外提示)

指令集合

设置
git config --global user.name  'Your Name'
全局设置用户名   "--global"代表所有仓库使用这一配置

全局设置邮箱
git config  --global  user.email "email@example.com"

.gitignore 编写
git config --global alias.  <new order> order为命令设置别名
$ git config --global alias.st status 告诉Git,以后st就表示status,下面列一些常用设置
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD' 撤销暂存区修改
$ git config --global alias.last 'log -1' 显示最近一次提交
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"  简直丧心病狂!
如果要修改别名,当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中,可以直接修改

基本操作


git init   初始化一个git 仓库 
git add <file>  添加文件到仓库,可以多次add 如:git add readme.txt 
git reset HEAD <file>  从暂存区撤销一个add 
git reset  HEAD test.tsx
git commit -m ""   快速提交代码,多次add 一次commit
git rm <file> 从版本库删除某文件

丢弃工作区的修改
git checkout --<file>
git checkout --readme.txt
git checkout .   丢弃所有本地修改
如果已经add,可以用git reset HEAD <file> 先撤销add,再丢弃更改
如果你已经commit了,可以用 git reset --hard  HEAD^  进行回退上一个版本<慎重操作>。
尽量使用: git reset --soft HEAD^ 或者  git reset --mixed HEAD^。
如果你已经推送远程分支了,也就凉凉了......
git status  仓库状态
git diff  <file>
git diff readme.txt  可以看到当前文件的改动
git diff 列出所有文件的改动
注意git diff会比较仓库中的文件和不在仓库中的同一文件的差异,也就是git add的文件A以及git add后改动的文件A,
如果没有改动的话,git diff 甚至智能地不自动匹配文件

git log  查看提交历史
$ 从最近到最远 可以加 --pretty=oneline 让git 显示得更清楚些
$ git log --graph --pretty=oneline --abbrev-commit  用--graph查看分支合并图
$ 版本回退
$ 如 git reset --hard HEAD^, HEAD代表当前版本,HEAD^代表上个版本,Head^^代表上上版本,HEAD-100代表往上100个版本
$ 不过过去了回不来怎么办, 只要命令行窗口没关闭,就可以找到你要回去的commit id,然后再用如 git reset --hard 3628164 回到该版本.
$ 如果第二天后悔了怎么办?用 git reflog 查看所有命令,再找到相应的commit id即可

分支管理

git branch   查看分支
git branch  <branch name>
git branch dev  创建分支
git branch -d dev  删除分支
git push origin : <branch name>  删除远程分支
git branch -D <branch name>强行删除分支
如git branch -D feature-vulcan 没有进行合并的分支用 -d参数会销毁失败
如果实在要丢弃一个没有合并过的分支,用-D进行强行销毁

修改本地分支名称 git branch -m <old_branch_name><new_branch_name>
git branch -m feature-a  feature-b

git checkout <branch name> 切换分支
git checkout -b issue-101  创建分支并切换
git merge <branch name>  合并分支(branch name)到当前所在分支
git merge --no-ff -m <message><branch name>

$ 禁用fast forward
$ 如 git merge --no-ff -m "merge with no-ff" dev
$ --no-ff表示禁用fast forward,在ff模式下删除分支后会丢掉分支信息,所以用--no-ff后
$ git就会在merge的时候生成一个新的commit,因为要有一个新的commit所以要加上-m参数
使用no-ff后,会多生成一个commit 记录,并强制保留dev分支的开发记录

git stash的使用场景

  1. 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
  2. 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
  3. 总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
git stash save "这里是注释内容" 储藏工作现场,可以把当前的工作现场储藏起来,等以后恢复现场后继续工作
git stash list 列出储藏的工作现场
git stash show 显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
git stash show -p  显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p
git stash apply 恢复现场,但stash内容不删除
git stash drop 删除现场
git stash pop 恢复现场的同时删除现场
git stash apply <stash id>多个现场时指定恢复某一现场(先用git stash list查看)
git rebase <branch name> 整合分支 变基 、 高危操作请清楚了解原理和后果后再操作

git rebase

远程仓库

ssh-keygen -t rsa -C "youremail@email"
创建ssh-key,将公钥添加到github等网站上
git  remote add origin <remote git repo>将本地仓库和远程仓库相关联,在本地仓库执行
如 git remote add origin git@github.com:rdmclin2/learngit.git,远程库的名字叫origin
可以添加多个远程仓库如git remote add rdmclin2 git@...  origin rdmclin2都是我们为远程仓库取的别名。
git remote set-url  origin <remote git repo>
修改origin 的地址,如:git remote set-url origin git@gitlab.artemisprojects.org:menchenglin/fcws.git

git push origin <branch name>
将本地内容推送到远程
如git push origin master,如果是第一次推送的话:git push -u origin master,
也就是第一次加上-u参数,可以吧本地分支和远程分支关联起来,以后就不要添加-u参数了

git clone <remote git repo>
从远程仓库克隆
如: git clone git@github.com:michaelliao/gitskills.git,非常常用的操作
clone时可以指定深度,git clone git://xx00  --depth  1

git remote
常看远程库信息,加上-v参数可以显示更加详细的信息

git pull
抓取远程分支最新提交并合并分支
如git tag v0.9 6224937,可以先用git log --pretty=oneline  --abbrev-commit 查看历史提交

git fetch
抓取远程分支最新提交(与pull的区别是fetch不直接合并)

git branch  ---set-upstream <local branch> <remote branch>
指定本地分支和远程分支的链接
如git branch --set-upstream dev origin/dev  指定本地div分支与远程origin/dev分支的链接

git tab <name>
打标签  如 git tag v1.0

git tag
查看所有标签,按字母排序

gitshow <tagname>
查看标签信息

git tag <name> <commit id>
给某次提交打上标签
如 git tag v0.9 6224937,可以先用git log  --pretty=oneline  --abbrev-commit 查看历史提交

git tag -a  <tagname> -m  <message> <commit id>
创建带有说明的标签
如 git tag -a v0.1 -m  "version 0.1 released"  3628164  , -a 指定标签名, -m 指定说明文字

git tag -s <tagname> -m <message> <commit id>
采用PGP签名一个标签
如git tag -s v0.2 -m "signed version 0.2 released "  fec145a ,  -s 用私钥签名一个标签
看这里http://www.ruanyifeng.com/blog/2013/07/gpg.html 了解如何安装gnupg

git tag -d <tagname>
删除标签 git tag -d v0.1

git push origin <tagname>
推送标签到远程
git push origin v1.0

git push origin --tags
一次性推送全部尚未推送到远程的本地标签

git push origin  :refs/tags/<tagname>
如: git push origin  :refs/tags/v0.9


现有工程中删除 .DS_Store

$ find . -name .DS_Store - print0 | xargs -0 git rm -f --ignore-unmatch

向顶层的.gitignore文件中增加 .DS_Store然后 gitadd.gitignore git add .gitignore git commit -m '.DS_Store banished'

下载github上单个文件夹

将 /tree/master换成/trunk/, 然后用svn checkout,例如: svn checkout github.com/Mooophy/Cpp…

gists介绍:

www.zhihu.com/question/21… www.worldhello.net/gotgithub/0…