# git_note **Repository Path**: cailijun/git_note ## Basic Information - **Project Name**: git_note - **Description**: Git的一些笔记 - **Primary Language**: Unknown - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-07 - **Last Updated**: 2022-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. **Git 原理详解及实用指南:**https://juejin.cn/book/6844733697996881928 **Git 问题和操作清单汇总:**https://juejin.cn/post/6844903921425580045 ![img](https://cdn.nlark.com/yuque/0/2022/jpeg/358257/1648608063746-c28aa1b6-47d7-4fb7-83e4-49fb97c5970a.jpeg) ## 下载&安装 git 官网: https://git-scm.com/ 从官网中下载对应版本,并安装。安装时可以完全使用默认设置即可! 随便某个文件下右键如果有 `Git Bash Here` 就安装成功! ## 全局设置 随便某个文件下右键选择 `Git Bash Here` 唤起 git 命令行工具 ```git git config --list // 全局信息 git config --global user.name "username" // 全局用户名 git config --global user.email "email.com" // 全局邮箱 // 查看全局 git config user.name git config user.email ``` ## 仓库设置 对于特定的仓库,不用全局设置的`config`,可以对此仓库单独设置`name`和 `email`,在此仓库目录中: ```git git config user.name "username" git config user.email "email.com" ``` ## commit规范 : //`feat: 新增xx功能` - `type`:类型,说明commit类型; - `subject`:简述,commit的简短说明,不超过50字。 type只允许以下类型: | 类型 | 说明 | 案例 | | ------ | -------------------------------- | ----------------------- | | feat | 新功能 feature | `feat: 新增xxx功能` | | fix | 修复bug | `fix: 修复xxxbug` | | up | 更新/优化了一个功能 | `up: 更新/优化xxx功能` | | chore | 开发工具变动(构建,脚手架工具等) | `chore: 升级xxx依赖包` | | revert | 代码回退 | `revert: 回退到xxx版本` | | style | 代码格式(空格,分号等格式修复) | `style: 单引号变双引号` | | docs | 文档注释 | `docs: 添加请求注释` | ## Git 工作流程 ### 初始化 在文件夹中初始化 git,将会生成`.git`隐藏文件夹,内放置 git 相关信息 **勿删** ```git git init ``` ### 暂存区 写完代码后,将修改的代码放入暂存区 ```git // 将所有的修改都添加到暂存区 . 是 all 的简写 git add . // 或者单独文件 git add a.html ``` ### 版本库 暂存区的文件,通过 commit 提交到版本库中 ```git git commit -m "本次提交的信息" ``` ### 远端 如果多人协作/备份代码,可以设置远程仓库 ```git // 添加远程 git remote add origin https://github.com/xxxx/xxx.git //设置远程仓库(origin) // 推送代码 git push -u origin master // -u 是设置后期使用 push将默认推送到 origin 远端,可以不设置 // 拉取代码 git pull origin master // 或者 git pull 将默认从 origin/master中拉取 ``` ## 分支操作 ### 查看分支 ```git git branch // 查看所有分支 ``` ### 创建分支&切换分支 创建分支和切换分支可以通过一行命令,所以分在一起 ```git // 创建分支 git branch new_branch // 切换分支 git checkout new_branch // 创建分支并切换到此放分支 git checkout -b new_branch ``` ### 同步远端分支 1、远程先开好分支然后拉到本地 2、本地先开好分支然后推送到远程 ```git // 1、远程先开好分支然后拉到本地 git checkout -b new_branch origin/new_branch // origin远端中的new_branch分支 // 2、本地先开好分支然后推送到远程 git checkout -b new_branch // 本地创建分支并切换到此分支 git push origin new_branch:new_branch // 推送本地的new_branch(冒号前面的)分支到远程origin的new_branch(冒号后面的)分支(没有会自动创建) ``` ### 合并分支 通常是将分支合并到 master 主分支中,当然也可以一个分支合并另一个分支 ```git // 此案例以master为主分支 // 1、切换到需要合并到的分支上 git checkout master // 2、合并分支 git merge new_branch // new_branch是你所要合并的分支名字 // 3、解决冲突 git将会自动处理不同的代码,但是出现冲突需要自己手动解决 ``` ### 删除分支 ```git // 已经合并的分支 git branch -d new_branch // 如果没有合并的分支,上述命令行将会产生提示 // 但是分支没用了,可以强制删除 -D git branch -D new_branch // 删除远程分支 git push origin -d new_branch ``` ### 克隆分支 ```git // dev 是远端分支名 git clone -b dev https://example.com/example.git ``` ## 标签管理 标签(tag)和 branch 很像,但是标签是不会移动的,而 branch 会根据修改进行移动的 ### 查看 tag ```git git tag ``` ### 新建 tag ```git // 本地创建 git tag v1.0 // v1.0为tag名 // 推送到远程 git push origin v1.0 // 推送到origin远程v1.0的tag // 一次推送所有的tags git push origin --tags ``` ### 删除 tag ```git // 先删除本地tag git tag -d // 删除远程tag git push origin --d tag ``` ## 实用场景 ### 修正 commit #### 修正上一个 commit `amend`:'修正',当 commit 添加上`--amend`,用这个新的 commit 把当前 commit 替换掉 ```git git commit --amend ``` #### 修正不是上一个 commit rebase -i 是 rebase --interactive 的缩写形式,意为「交互式 rebase」 [详细介绍](https://juejin.cn/book/6844733697996881928/section/6844733698055602190) ```git // 回退到倒数第二个 git rebase -i HEAD^^ ``` ### 丢弃 commit #### 丢弃上一个 commit 1、reset --hard :丢弃上一个 commit 2、reset 参数解析 a、`reset --hard`:重置工作目录,工作目录里的内容会被完全重置为和 `HEAD` 的新位置相同的内容 b、`reset --soft`:保留工作目录,保留工作目录和暂存区中的内容,并把重置 `HEAD` 所带来的新的差异放进暂存区 c、reset 不加参数:保留工作目录,并清空暂存区 ```git // 丢弃上一个commit git reset --hard HEAD^ ``` #### 丢弃不是上一个 commit 同样是使用 rebase: **git rebase -i HEAD^^** ```git // 回退到倒数第二个 git rebase -i HEAD^^ ``` #### 恢复已丢弃的commit `git reflog`:所有HEAD的历史,包括eset,checkout等操作 ```git // 查看记录 git reflog // 恢复指定的commit git reset --hard 98abc5a ``` ### 修改 push 后的代码 #### 自己的分支 对于自己能完全掌控的仓库,可以使用上面的方法,再强制推送 ```git // -f 表示强制推送 git push origin branch1 -f ``` #### 协作的分支 下面代码就会增加一条新的 commit,它的内容和倒数第二个 commit 是相反的,从而和倒数第二个 commit 相互抵消,达到撤销的效 ```git git revert HEAD^ ``` ### 合并多次commit 合并本地多次commit,使用 `git rebase`,文档:[变基](https://git-scm.com/book/zh/v2/Git-分支-变基) 案例:合并最新三条commit 1、交互式变基到最新三次提交 ```git git rebase -i HEAD~3 # 或者 git rebase -i HEAD^^^ ``` 2、对commit历史进行修改 ```git pick 422c8a5 add html pick 5c33d66 add css pick 8f2167b add js # 一般使用pick 和 squash pick 422c8a5 add html s 5c33d66 add css s 8f2167b add js ``` vim编辑命令: - `p, pick <提交>` = 使用提交 - `r, reword <提交>` = 使用提交,但编辑提交说明 - `e, edit <提交>` = 使用提交,但停止以便在 shell 中修补提交 - `s, squash <提交>` = 使用提交,但挤压到前一个提交 - `f, fixup [-C | -c] <提交>` = 类似于 "squash",但只保留前一个提交的提交说明,除非使用了 -C 参数,此情况下则只保留本提交说明。使用 -c 和 -C 类似,但会打开编辑器修改提交说明 - `x, exec <命令>` = 使用 shell 运行命令(此行剩余部分) - `b, break` = 在此处停止(使用 'git rebase --continue' 继续变基) - `d, drop <提交>` = 删除提交 - `l, label