Skip to content
On this page

Git

commit 类别

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

常用命令

git clone

git clone <仓库URL>                         // 拉取远程仓库全部分支(默认在本地的master分支)
git clone -b dev <仓库URL>                  // 拉取远程仓库全部分支,且本地在dev分支下
git clone -b dev --single--branch <仓库URL> // 获取指定分支的代码

git pull

git pull            // 拉取默认分支(当前在哪个分支就拉取哪个)
git pull origin dev // 拉取指定分支

git add

git add App.vue             // 将App.vue页面添加到暂存区(如果同时存在两个App.vue,其中一个是会有别名的,这里只添加没有别名的那个)
git add App.vue api         // 会将 App.vue 以及 App.vue api 一起提交到暂存区
git add App.vue api assets  // 会将 App.vue 以及 App.vue api 以及 App.vue api assets 一起提交到暂存区
git add .                   // 将所有修改添加到暂存区
git add -A                  // 和 git add .一样的效果,有什么差别吗
git add -u                  // 提交被修改和被删除的文件,不包括新文件(-u == --update)
git add *Controller         // 将以Controller结尾的文件的所有修改添加到暂存区(注意名字相同文件会有别名,会被这个所捕获)
git add Hello*              // 将所有以Hello开头的文件的修改添加到暂存区(如果是两个App.vue文件被修改,那么第二个App.vue会有别名,就不会被这里所拿到)

git commit

git commit -m                            // 提交暂存区所有文件到本地仓库
git commit [file1] [file2] -m            // 提交暂存区指定文件到仓库
git commit -a -m                         // 直接将工作区的修改提交到仓库
git commit --amend                       // 修改提交信息
git commit --amend -m '修改了最后一次提交'  // 快捷修改最后一次提交(只能修改最后一次的)

git push

git push origin main = git push origin main:main  // 这两个是相同的意思
git push origin dev:main                          // 如果当前在 dev 分支,但是想提交到 main 分支

git log & blame

git log            // 查看提交历史(commit历史)
git log -p <file>  // 查看指定文件的提交历史(不推荐用,内容会很多)
git blame <file>   // 以列表方式查看指定文件的提交历史(只能查看单个)

git reset 回滚提交

git reset                 // 暂存区所有文件回到工作区
git reset <file>          // 暂存区目标文件回到工作区
git reset --hard HEAD^    // 撤销到最近一次提交,工作区中所有未提交文件清空
git reset --hard <commit> // 撤销到某个特定版本,工作区中所有未提交文件清空
git reset --soft <commit> // 撤销到某个特定版本,工作区保留(内容会放在暂存区)

git reset --hard ORIG_HEAD
// 执行git pull和git merge,git reset操作时,git都会把执行操作前的HEAD放入ORIG_HEAD中,以防回滚操作
// 但是在pull 后再执行这个命令会把工作区的代码给重置,所以用 git reset --merge ORIG_HEAD

刚提交的commit想要回退到暂存区,用git reset --soft HEAD^
用reset误删后可以用git reflog查看全部的分支,然后再用 git reset --hard 1a0053e 回滚
  • hard(回滚后本地代码就是回退版本的代码)
    • 移动本地库HEAD指针
    • 重置暂存区
    • 重置工作区
  • soft(内容会放在暂存区,不影响工作区)
    • 移动本地库HEAD指针
  • mixed(默认参数,会将所有的改动放到工作区中,即使之前在暂存区中有改动也会一起放回工作区)
    • 移动本地库HEAD指针
    • 重置暂存区
  • keep(本地代码就是回退版本的代码,而暂存区是没有任何改变)(调试不通,暂不用)
    • 移动本地库HEAD指针
    • 暂存区不变
    • 重置工作区

git revert 撤销提交

建议加 -n 配置项,不让其自动提交(然后选择q来退出界面)

git revert <commit>        // 撤销某次历史提交(如果是比较久远的提交一般会产生冲突,届时就是与目标提交对比差异了)
git revert <HashA> <HashB> // 撤销多个历史提交
git revert A..B            // 撤销一连串历史提交(不包括A)
git revert A^..B           // 撤销一连串历史提交(包括A)
git revert --abort         // 取消撤销操作,撤回到合并之前到工作环境 

git cherry-pick 合并提交

建议加 -n 配置项,不让其自动提交(然后选择q来退出界面)

git cherry-pick <commit>        // 合并某次历史提交
git cherry-pick <HashA> <HashB> // 合并多个历史提交
git cherry-pick A..B            // 合并一连串历史提交(不包括A)
git cherry-pick A^..B           // 合并一连串历史提交(包括A)
git cherry-pick --abort         // 取消合并,撤回到合并之前到工作环境 

git remote 远端

git remote update origin -p                                    // 更新远程分支
git remote add origin git@github.com:M-cheng-web/git-demo.git  // 连接远程分支

git stash 临时储藏

比如说我们在处理一个bug过程中又来了一个紧急需求,把bug处理过程中 的文件更改储藏起来(工作区和暂存区会变干净),然后开始新需求的编写

git stash -m '存储代码'  // 储藏暂存区和工作区的代码
git stash pop          // 提取最近一次储藏的,会删除被提取的版本(当有冲突时不会删除被提取的版本)
git stash pop n        // 提取目标储藏的版本,n代表序列号,会删除被提取的版本
git stash apply        // 提取最近一次储藏的版本,但不会删除
git stash apply n      // 提取目标储藏的版本,n代表序列号,例如 0 1 2 3
git stash list         // 查看储藏的版本
git stash drop         // 删除最近一个储藏的版本
git stash drop n       // 删除目标储藏的版本,n代表序列号,例如 0 1 2 3
git stash clear        // 删除所有储藏的版本

git checkout 创建/切换分支

git checkout <file>     // 切换到指定分支或标签
git checkout -b <file>  // 创建并切换到指定分支或标签

git branch 分支

git branch -a      // 查看所有的分支,包括本地的和远程的(不加 -a 代表只查询本地的)
git branch -m dev  // 重命名当前分支为 dev (如果已存在dev分支会报错)
git branch -d dev  // 删除 dev 分支,如果目标分支有内容未合并则需要用 -D 强行删除

git tag 打标签

git checkout v0.0.3后如果想要基于此tag进行一些功能扩展,应该执行git checkout -b newBranch来创建一个新分支然后基于此分支开发,因为在tag上进行的commit会被丢弃

git tag                              // 列出所有本地标签
git tag -l 'v0.0.*'                  // 列出筛选后的标签
git show v0.0.1                      // 查看目标tag的信息
git tag v0.0.1                       // 创建标签(基于最新提交创建标签)
git tag -a 'v0.0.1' -m '备注说明'     // -a指定标签名称,-m附加备注信息
git tag -a v0.0.3 07289a6 -m 'tag-3' // 为指定的 commithash 创建tag
git push origin v0.0.3               // 将目标tag推送到远端
git push origin --tags               // 将所有tag推送到远端
git checkout v0.0.3                  // 切换到目标tag
git checkout -                       // 切换到目标tag后想切回来用这个命令
git tag -d v0.0.1                    // 删除标签
git push origin :refs/tags/v0.0.1    // 删除远程标签(只能这样删)

git merge 合并分支

建议加 -n 配置项,不让其自动提交(然后选择q来退出界面)

git merge <branch>        // 合并指定分支到当前分支
git merge --abort         // 取消当前合并,重建合并前状态
git merge dev -n -Xtheirs // 以合并dev分支到当前分支,有冲突则以dev分支为准
git rebase # 衍合指定分支到当前分支

强制覆盖分支,再强制提交分支

git checkout b    //切换到需要被覆盖的分支
git reset --hard a//把分支覆盖到b分支
git push origin b --force
``

## 操作场景
### 连接远程仓库
目的是将本地的项目文件链接到远程的仓库,这里以`github`为例

本地文件操作
```
git init  // 初始化

// 将此时所在的分支重命名为 main
// 这一步的目的是将本地的分支和远程分支设置相同名称(这里假设远程默认分支为main,如果是其他的这边也要相对应的更改)
git branch -m main

git remote add origin git@github.com:M-cheng-web/git-demo.git  // 连接远程分支

git remote update origin -p // 更新远程分支
```

做完上面的操作后就可以正常提交代码到远程

### 创建分支推送远程
两种方式
+ 本地创建后推送到远程
  1. git checkout -b dev
  2. git push origin dev
+ 远程创建后本地更新下来
  1. 远程手动创建分支(或者已由他人推送新分支)
  2. 本地更新远程分支信息: git remote update origin -p

### 合并历史 commit
场景详情:
我在本地历史 commit 中有一块功能,然而我目前工作区中把这个功能删掉了,我该怎么做才能把这块功能快速补回来

解决:
```
// 可以让目标 commit 历史和当前工作区合并(前提是当前工作区是干净的)
git cherry-pick <commit hash>
```

注意: 如果只想要获取历史某次提交的某几个文件,参照此文章的解决方案
[https://www.itranslater.com/qa/details/2103374620475786240](https://www.itranslater.com/qa/details/2103374620475786240)