一、基础
- 命令行
- pwd——(print work directory)显示出当前工作目录的绝对路径
- mkdir myapp ——创建新目录
- cd ../——回到根目录
- cd ..——返回上一级目录
- cd myapp——打开文件
- Workspace工作区:就是你在电脑里能看到的目录。
- Index/Stage暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- Repository仓库区:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- Remote:远程仓库
生成密码:
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- ssh-keygen 参数
- -t:指定生成密钥的类型,默认使用SSH2d的rsa
- -f:指定生成密钥的文件名,默认id_rsa(私钥id_rsa,公钥id_rsa.pub)
- -P:提供旧密码,空表示不需要密码(-P ‘’)
- -N:提供新密码,空表示不需要密码(-N ‘’)
- -b:指定密钥长度(bits),RSA最小要求768位,默认是2048位;DSA密钥必须是1024位(FIPS 1862标准规定)
- -C:提供一个新注释
- -R hostname:从known_hosta(第一次连接时就会在.ssh目录下生产该密钥文件)文件中删除所有属于hostname的密钥
- ssh公钥地址:C:\Users....ssh\id_rsa.pub
二、配置与操作
1. 全局与局部配置
创建git账号密码设置签名:$ git config --global user.name "username"
$ git config --global user.email "username@gmail.com"
$ git config user.name "otherUsername"
$ git config user.email "otherUsername@gmail.com"
$ git config --global credential.helper store
记住账户密码:在.git-credentials
目录可查看用户名、邮箱:
$ git config --global credential.helper store
1.1 配置文件存储位置
~/.gitconfig
:具体到你的用户。通过传递—global 选项使Git 读或写这个特定的文件.git/config
:无论当前在用的库是什么,特定指向该单一的库。每个级别重写覆盖前一个级别的值- 增删配置:
2.创建版本库
- 当前目录新建一个Git代码库:
$ git init
- 添加文件到Git仓库,分两步:
- 添加当前目录的指定文件到暂存区:
$ git add <file1>...
- 提交暂存区的指定文件到仓库区:
$ git commit -m [message]
- 添加当前目录的指定文件到暂存区:
3.版本回退
- 查看当前分支的版本历史:
$ git log --pretty=oneline
- HEAD指向当前master,在版本的历史之间穿梭
$ git reset --hard commit_id
$ git reset --hard HEAD^
或$ git reset --hard HEAD~1
- 查看当前分支的提交历史,以便确定要回到未来的哪个版本:
$ git reflog
4.工作区和暂存区
显示修改变更后(待暂存、待提交仓库)的文件:$ git status
5.管理修改
- 例:第一次修改 -> git add -> 第二次修改 -> git commit
- 分析:Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,即第一次的修改被提交了,第二次的修改不会被提交。
- 总结:每次修改,如果不用git add到暂存区,那就不会加入到commit中。
- 显示暂存区和工作区的差异:
$ git diff
6.撤销修改
- 丢弃工作区的修改:
$ git checkout -- <file>
- checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
- 撤销暂存区的暂存:
$ git reset HEAD <file>
- 再丢弃工作区的修改:
$ git checkout -- <file>
7.删除文件
- 删除工作区文件:
$ rm <file>
- 撤销误删:
$ git checkout -- <file>
- 从来没有被添加到版本库就被删除的文件,是无法恢复的!
- 删除工作区文件,并且将这次删除放入暂存区:
$ git rm <file>
- 提交暂存区到仓库区:
$ git commit -m "..."
8.添加远程库
- 关联远程库:
$ git remote add origin git@server-name:path/repo-name.git
- 例如
$ git remote add origin git@github.com:hesetiema/learngit.git
- 远程库的名字就是origin。可通过 $
git remote -v
查看
- 例如
- 第一次推送master分支到远程:
$ git push -u origin master
- 本地分支master与远程master关联
- 把本地master分支的最新修改推送至远程库:
$ git push origin master
- 分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,当有网络的时候,再把本地提交推送一下就完成了同步。
9.从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆:
$ git clone git@server-name:path/repo-name.git
- Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
10.分支管理
1. 分支分类
- 分支:每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支
- 主分支即master分支,head指向master,master指向提交,每次提交master分支都会向前移动一步,随着不断提交master分支的线也越来越长。
- 开发分支即develop分支,用来生成代码的最新隔夜版本(nightly)。如果想正式对外发布,就在Master分支上,对Develop分支进行”合并”(merge)。
2. 分支操作
- 创建分支:
git branch <name>
- 创建develop分支并切换:
$ git checkout -b dev
- git-checkout命令加上-b参数表示创建分支并切换
- 查看当前分支:
$ git branch
- 列出所有分支,当前分支前面会标一个*号
- 在当前分支dev上提交:
$ git add
、$ git commit -m ""
- 切换回主Master分支:
$ git checkout master
- 把dev分支的工作成果合并到master分支上:
$ git merge dev
- git merge命令用于合并指定分支到当前分支
- 删除dev分支:$ git branch -d dev
3. 分支冲突及策略
- 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log —graph命令可以看到分支合并图:$ git log --graph --pretty=online
- 分支策略:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并
合并分支时,加上—no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
//$ git merge --no-ff -m "merge with no-ff" dev
4. bug与feature
- Bug分支:
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场**git stash**
一下,然后去修复bug,修复后,再**git stash pop**
,回到工作现场。//你可以多次stash,恢复的时候,先用**git stash list**
查看,然后恢复指定的stash
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
- feature分支:
- 开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
5. 远程相关
推送分支:
- 查看远程库信息:
$ git remote -v
要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:$ git push origin master
、$ git push origin dev
抓取分支:
- 在本地创建和远程分支对应的分支:
$ git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致 - 建立本地分支和远程分支的关联:
$ git branch --set-upstream-to=origin/<branch-name> <branch-name>
- 从远程抓取分支,使用:
$ git pull
多人协作:
- 首先,可以试图推送自己的修改:
$ git push origin <branch-name>
- 如果推送失败,则因为远程分支比你的本地更新,需要先试图把最新的提交从origin/dev抓下来自动合并:
$ git pull
$ git fetch
:是从远程获取最新版本到本地,不会自动merge;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建:
$ git branch --set-upstream-to=origin/<branch-name> <branch-name>
- 没有冲突或者解决掉冲突后,再用:
$ git push origin <branch-name>
11.标签
- 新增标签:
- 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
- 命令git tag -a -m “blablabla…”可以指定标签信息;
- 命令git tag可以查看所有标签。//标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签
- 操作标签
- 命令git push origin 可以推送一个本地标签;
- 命令git push origin —tags可以推送全部未推送过的本地标签;
- 命令git tag -d 可以删除一个本地标签;
- 命令git push origin :refs/tags/可以删除一个远程标签。
12. git忽略
git status --ignored
查看被忽略的文件
13. fatal: Authentication failed
出现此类问题在于认证失败,凭据错误或未输入登录相应仓库的正确用户名密码。
删除已过期凭据:如果以前使用过 git 拉取其他仓库托管平台的代码,则git的凭据已经有了,克隆时会默认拿之前的凭据,因此需要删除系统里原来的 git 凭据。可使用以下两种方式:
- windows系统在控制面板>用户账户>凭据管理器找到 git 对应的windows 普通凭据,删除掉;
- 输入以下命令
git config --system --unset credential.helper
输入正确的账号密码
- 保存你的新凭据
git config credential.helper store
14.如何保存 Detached head 的更改到特定分支
分离的 HEAD意味着它不附加到任何分支,即它直接指向某个历史记录中的一个提交(在这种情况下是 HEAD 之前的提交,即 HEAD^)。 git cherry-pick:将代码从一个分支的某几次提交转移到另一个分支
1. 新建临时分支
- git branch temp
- git checkout master
- git merge temp
2. 使用cherry pick
- git checkout master
- git reflog
- git cherry-pick
…
16. 常用实用技巧
1. 快速切换到上一个分支
git checkout -
2. 查看本地分支关联远程仓库
git branch -vv
3. 查看某段代码是谁写的
git blame <file-name>
4. 修改待提交信息记录
git commit --amend --only -m 'xxxxxxx'
5. 修改待提交作者名
git commit --amend --author='Author Name <email@address.com>'
6. 把暂存的内容添加到上一次的提交
git commit --amend
7. 把未暂存的内容移动到另一个已存在的分支
git stash
git checkout my-branch
git stash pop
17. Commitizen: 替代 git commit
可以使用 commitizen/cz-cli 中的 cz-cli 工具代替 git commit。借助它提供的 git cz 命令替代 git commit 命令。此外,为使 commitizen 按照我们指定的规范帮助我们生成 commit message,需指定一个 Adapter 比如: cz-conventional-changelog (一个符合 Angular团队规范的 preset). 或 @commitlint/cz-commitlint
全局安装
npm install -g commitizen cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
全局安装后使用 git cz 代替 git commit就可以了。
项目安装
安装:
yarn add -D commitizen cz-conventional-changelog
#or
yarn add -D commitizen @commitlint/cz-commitlint
配置 package.json,path 选择 “
node_modules/cz-conventional-changelog
“ 或@commitlint/cz-commitlint
```javascript script”: { …, “commit”: “git-cz”, }, “config”: { “commitizen”: { “path”: “@commitlint/cz-commitlint” } }
<a name="RlJIP"></a>
## 18. Lint-staged: 检测暂存区文件格式
pre-commit Hook 脚本
- 安装:
```shell
npm install -D lint-staged
- 配置:在package.json 中添加以下代码,匹配暂存区所有的js,vue,jsx,tsx等文件,并执行命令 ```javascript
“scripts”: { “lint-staged”: “lint-staged”, }
“lint-staged”: { “.{js,jsx,less,md,json}”: [ “prettier —write” ], “.ts?(x)”: [ “prettier —parser=typescript —write”, “eslint —fix” ] }
<a name="LGz1C"></a>
## 19. Commitlint: 校验 message
commitlint: **@commitlint/cli可以帮助我们 lint commit messages**, 如果我们提交的不符合指向的规范, 直接拒绝提交。同样的, 它也需要**一份校验的配置, 这里推荐 @commitlint/config-conventional (符合 Angular团队规范)**.
- 安装
```shell
npm i -D @commitlint/config-conventional @commitlint/cli
配置:在项目目录下创建配置文件 .commitlintrc.js, 写入:
module.exports = {
extends: [
'@commitlint/config-conventional'
],
rules: {
}
};
20. husky/yokie: 管理Git Hooks
1. 常用 gitHooks
pre-commit:钩子在键入提交信息前运行。
- prepare-commit-msg:钩子在启动提交信息编辑器之前,默认信息被创建之后运行。
- commit-msg:钩子接收一个参数,存有当前提交信息的临时文件的路径。 如果该钩子脚本以非零值退出,Git 将放弃提交,因此,可以用来在提交通过前验证项目状态或提交信息。
- post-commit:钩子在整个提交过程完成后运行
2. 安装husky与配置
安装:
npm i husky -D
配置:
低版本husky:package.json 中添加
"husky": {
"hooks": {
...,
"pre-commit": "lint-staged",
"commit-msg": "commitlint -e $GIT_PARAMS"
}
},
高版本 husky
- 准备:执行
npx husky install
,创建 .husky/ 目录并指定该目录为git hooks所在的目录。 要在安装后自动启用Git钩子,编辑package.json
npm set-script prepare "husky install"
添加钩子到 husky 中
npx husky add .husky/pre-commit "yarn lint-staged --allow-empty '$1'"
npx husky add .husky/commit-msg "yarn commitlint --edit '$1'"
添加钩子到git中去:
git add .husky/pre-commit
git add .husky/commit-msg
3、在yorkie中使用
安装 yorkie:
yarn add yorkie -D
配置 package.json: ```javascript
- 准备:执行
“gitHooks”: { “pre-commit”: “lint-staged”, “commit-msg”: “commitlint —edit” } ```