区域划分
git 初始化后。区域分为工作区,暂存区,版本库。
工作区:编写代码的区域。
暂存区:将代码暂时保存的区域,命令git add .
版本库:即本地仓库,代码在本地保存的地方。命令git commit -m 'xxx'
。
远程仓库:即线上仓库。一般关联后,通过git push
推送到远程仓库。通过git pull
从远端拉取。
新建仓库推送步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // 本地git初始化 git init
// 创建.gitignore文件 touch .gitignore
// 提交文件到暂存区 git add .
// 提交提交信息到版本库 git commit -m 'feat: first commit'
// 关联远程仓库 git remote add origin https://github.com/zaxtseng/xxx.git
// 本地分支改名或者不改也行 git branch -M main // 推送到远程分支(没改名) git push -u origin master // 改名了就推送到改名的分支 git push -u origin main
|
新建分支并推送
1 2 3 4
| // 创建并切换 git checkout -b newBranch // 推送到远程同名 git push origin newBranch:newBranch
|
切换分支
1 2 3 4 5
| git checkout dev # 2.23以后新版本命令 git switch dev # 创建并切换 git switch -c test
|
删除远程分支
1 2 3 4 5 6 7 8 9 10
| // 推送空分支到远程就删除了 git push origin :newBranch
//delete删除 git push origin --delete newBranch
// 对于不想改名,本地是master分支,远程是main分支的情况 // 直接推送到远程master分支就会新建一个master分支并且删除main分支了 // 推送到远程分支(没改名) git push -u origin master
|
删除本地分支
1 2 3 4
| // 只有推送后才会删除 git branch -d master // 强制删除 git branch -D master
|
查看所有分支
切换远程分支
git checkout -b 本地分支名 origin/远程分支名
1 2 3 4 5 6 7 8 9 10 11
| # 查看所有分支 git branch -a # 显示所有分支 * dev master remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/release/caigou_v1.0
# 切换到本地分支并且映射到远程指定分支 git checkout -b dev origin/release/caigou_v1.0
|
新建本地项目推送远程仓库
git 初始化
git 暂存提交
1 2
| git add . git commit -m 'first'
|
关联远程仓库
1 2 3 4
| git remote add origin git@github.com:xxx/xxx.git
# 当前分支关联远程分支 git branch --set-upstream-to=origin/dev dev
|
修改主分支名称
只有 github 是主分支 main,其他都是 master.
1 2
| //强制修改当前分支为main git branch -M main
|
推送到远程并设置对应关系
1 2 3 4
| git push -u origin main
// 强制执行(注意会覆盖之前的) git push -u origin master -f
|
如果之前创建了 Readme
大概率会推送失败,需要先拉取远程的 readme.md
1 2 3
| git pull origin main // 如果拉取报错 git pull origin main --allow-unrelated-histories
|
再执行上面的推送远程
撤销合并
1
| git merge --abort //回滚到合并之前
|
版本回退
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
1 2
| git reset --hard 版本名 // hash名通过git log查找
|
使用“git push -f”强制提交更改:
此时如果用“git push”会报错,因为我们本地库 HEAD 指向的版本比远程库的要旧.
此方法就可以用于被其他人覆盖代码导致代码消失.
版本删除
原理: git revert 是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们 commit 了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有 bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西
git 使用 dev 覆盖本地及远程 master 分支
1、切换到 dev 分支:
2、删除本地的 master 分支:
3、将 dev 分支复制到本地的 master 分支:
4、推送到远程并覆盖仓库的 master 分支:
1
| git push -u origin master --force
|
git 远程分支强制覆盖本地的分支
1、下载代码到本地
2、将 HEAD 指向最新下载的版本
1
| git reset --hard origin/分支名
|
git fetch
- git fetch 是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
- 而 git pull 则是将远程主机的最新内容拉下来后直接合并,即:
git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
git rebase
目的是改变提交的基底.从而实现之前的提交记录都是一条。
git rebase 和 git merge 区别
二者的目的都是将代码合并.但是 git rebase 的提交记录更整洁.
1 2 3 4
| # 从master的提交A创建了新分支feature,并有两条提交记录 D---E feature / A---B---C master
|
使用 merge
- 切换到 feature 分支: git checkout feature。
- 合并 master 分支的更新: git merge master。
- 新增一个提交 F: git add . && git commit -m “commit F” 。
- 切回 master 分支并执行快进合并: git chekcout master && git merge feature。
下面提交历史可以看到,提交历史有两条线,一条是 master 的提交记录,一条是 feature 的.
1 2 3 4 5 6 7 8 9 10
| * 6fa5484 (HEAD -> master, feature) commit F * 875906b Merge branch 'master' into feature |\ | | 5b05585 commit E | | f5b0fc0 commit D * * d017dff commit C * * 9df916f commit B |/ * cb932a6 commit A
|
使用 rebase
就是第二条命令换为 git rebase master.
而 rebase 的提交记录,只有一条线,rebase 保存了 DE 的修改,把基底从 A 挪到了 C,
实际上是复制了 DE 的提交,把之前的丢弃,再从 C 处重新新增的。所以 id 和之前的不一样。
本地仓库可以使用,线上仓库不要使用,因为id变化了,历史记录变化了,有可能有问题。
1 2 3 4 5 6
| * 74199ce (HEAD -> master, feature) commit F * e7c7111 commit E * d9623b0 commit D * 73deeed commit C * c50221f commit B * ef13725 commit A
|
具体操作
1 2 3 4 5 6 7
| git checkout feature # 修改基底为最新的master 的最新的提交 git rebase master # 提交 git add . && git commit -m "commit F" # 切换到master合并feature的代码 git chekcout master && git merge feature
|
git 撤销
git 版本撤销(回滚)
已经提交到线上仓库了。
可以使用git reset --hard HEAD
。
1 2 3 4 5 6
| # 回滚到上一个版本 git reset --hard HEAD^ # 回退到指定版本可以先通过git log查到某个版本的id git log # 指定回退的版本id git reset --hard HEAD abc123
|
git 撤销某个文件的修改
1 2
| git restore file.js git checkout -- file.js
|
git 撤销暂存区文件添加
相当于 git add 的反操作。
1 2 3 4
| # git@2.23之后新版本操作命令 git restore --staged file.js # 或者使用git reset git reset HEAD file.js
|
文件删除
对于工作区的删除与撤销删除。
下面命令只针对,删除文件的操作保存到暂存区了。
1 2 3 4 5 6 7 8 9 10 11
| # 删除某个文件 rm file3.js # 提交到暂存区 git add file3.js # 提交到版本库(本地仓库) git commit -m "删除file3"
# 撤销删除file3 git checkout -- file3.js # 新版本命令 git restore file3.js
|
git reflog(回流记录)
对于回滚后的记录,没有回滚之前的记录。想查看之前的使用这个命令。
查到对应的 ID,使用 git reset 回滚到对应的 id 版本。
git reset、checkout、revert
命令 |
范围 |
常见用例 |
git reset |
提交级别 |
丢弃私有分支中的提交或抛弃未提交的变更 |
git reset |
文件级 |
取消暂存文件 |
git checkout |
提交级别 |
在分支之间切换或检查旧快照 |
git checkout |
文件级 |
丢弃工作目录中的变更 |
git revert |
提交级别 |
撤销公共分支中的提交 |
git revert |
文件级 |
(不适用) |
常用
- stash:存储临时代码。
- reset –soft:软回溯,回退 commit 的同时保留修改内容。
- cherry-pick:复制 commit。
- revert:撤销 commit 的修改内容。
- reflog:记录了 commit 的历史操作。
git log
查看提交日志
git merge
默认合并是 Fast-forward 模式。没有 git log 记录。
可以使用--no--ff -m 'xxx'
添加记录。
场景:master 是主分支,dev 是开发分支。目前 dev 分支 commit 进度超过 master。master 需要将进度赶到 dev 的进度。
1 2 3 4 5 6 7
| # 从dev切换到master git switch master # 合并dev分支 git merge dev
# 合并时添加备注信息 git merge --no-ff -m '合并了功能1' dev
|
git stash
贮藏功能,相当于独立一块区域用于保存当前的开发内容。
场景:当前分支功能未开发完,需要修改线上开发 master 分支的 bug。
git stash apply,pop,drop,clear,list, push -m’xxx’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| # 当前master分支有bug,又有未开发完的功能在开发分支work
# 把当前开发的功能贮藏 git stash # 或者贮藏时加备注信息 git stash push -m 'xxx' // 贮藏信息为xxx # 通过list查看 git stash list # 切换到有bug的master分支 git checkout master # 创建一个修改bug的分支issue git checkout -b issue # 或者使用新版本代码创建 git switch -c issue # 修改后推送合并 git add . git commit -m '修改了功能1' # 切换到dev分支再合并 git switch master git merge --no-ff -m '合并了修复bug1的分支代码' issue
# 删除修复分支issue git checkout -D issue
# 切回原分支work git switch work
# 把修改好的代码拿到这个分支 git cherry-pick 分支id # 取回贮藏区的代码 git stash apply // 只取回,不删除,取回指定的就是在后面加上stash@{id} git stash pop // 取回并删除这一项 git stash drop // 删除第一项 git stash clear // 清空贮藏区
|
tag 标签
tag 的指针不会移动,master 的指针随着 commit 而移动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 给当前的commit打tag git tag v1.0 # 给以前的commit打tag git tag v0.9 id名 # 添加备注信息 git tag -a v0.9 -m '发布了0.9' id名 # 查看备注信息 git show v0.9 # 删除标签 git tag -d v0.9 # 推送到远程仓库有标签 git push origin v1.0 # 删除远程标签 git push origin :refs/tags/v1.0
|
commitlint
提交时的分类
必填项,用于说明本次提交做出哪种类型的修改,必须是以下任意一值:
- feat: A new feature(新功能)
- fix: A bug fix(bug 的修复)
- docs: Documentation only changes(修改项目中的文档)
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)(不影响代码逻辑下的样式修改,通常是风格修改,例如空格、格式、分号方面的修改等)
- refactor: A code change that neither fixes a bug nor adds a feature(重构,不包括修复 bug 和添加新功能)
- perf: A code change that improves performance(性能优化)
- test: Adding missing or correcting existing tests(添加或者修改测试代码)
- chore: Changes to the build process or auxiliary tools and libraries such as documentation generation(对构建过程或辅助工具和库(如文档生成)的更改)