Git

区域划分

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

查看所有分支

1
git branch -a

切换远程分支

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 初始化

1
git init

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 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西

1
git revert -n 版本名

git 使用 dev 覆盖本地及远程 master 分支
1、切换到 dev 分支:

1
git checkout dev

2、删除本地的 master 分支:

1
git branch -D master

3、将 dev 分支复制到本地的 master 分支:

1
git checkout -b master

4、推送到远程并覆盖仓库的 master 分支:

1
git push -u origin master --force

git 远程分支强制覆盖本地的分支
1、下载代码到本地

1
git fetch --all

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(对构建过程或辅助工具和库(如文档生成)的更改)