克隆项目
git clone 远程仓库地址: 克隆远程仓库数据到本地仓库
更新本地仓库
git fetch: 到远程仓库中拉取所有你本地仓库中还没有的数据(个人理解,clone一般只有最最开始会使用,之后与远程仓库进行同步,是使用fetch)
查看分支
git branch: 查看本地分支
git branch -a: 查看所有分支(包含本地分支和远程分支)
git branch -r: 查看所有的远程分支
创建分支
git branch 分支名:基于目前所在的分支拷贝一份相同的代码到新建的这个分支,同时仍创建时所在的分之
git checkout - b 分支名:基于所在分支,新建一个分支(拷贝所在分支的代码),同时切换到新建的分支
git checkout -b 分支名 所要拷贝的分支名: 基于所要拷贝的分支拷贝一份到新建的分支,同时切换到新建的分支
删除本地分支
git branch -d 分支名:
git branch -D 分支名:
删除远程分支
git push origin :分支名: 首先注意origin 与冒号之间有一个空格,实现:推送一个空分支到远程分支,其实就相当于删除远程分支,
git push origin --delete 分支名: origin 与--之间也有空格,删除对应分支名的远程分支
切换分支
git checkout 分支名: 切换到分支名对应的分支
git checkout -: 切换到当前的前一次所在分支
推送本地分支到远程
git push origin 分支名: 推送当前分支到一个已经存在的对应的远程分支上
git push --set-upstream origin 分支名: 用于没有对应当前分支名的远程分支,会在远程先创建一个同名远程分支然后将本地同名分支推送到远程分支
git push:推送到与当前所在分支同名的远程分支上,如果没有相对应的远程分支,控制台会提示上面那条对应的命令
将文件从工作区提交到暂存区
git add . : 将当前子目录下所有更改过的文件提交到暂存区
git add 文件名: 提交指定的文件到暂存区
将暂存取文件提交到仓库区
git commit -m "描述信息": 提交
git commit -am "描述信息": 将add 与 commit 二者合为一
git commit --amend -m "描述信息": 合并上一次提交(用于反复提交)
Commitizen简单使用介绍
首先:全局安装commitizen node模块 (sudo)npm install -g commitizen
提交代码: git cz 或者 cz
- 选择 提交type,即commit 类型 feat: 新特性
fix: 修改问题
refactor: 代码重构
docs: 文档修改
style: 代码格式修改, 注意不是 css
修改 test: 测试用例修改
chore: 其他修改, 比如构建流程, 依赖管理.
scope: commit 影响的范围, 比如: route, component, utils, build...
subject: commit 的概述,
body: commit 具体修改内容, 可以分为多行,
footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接. - 指明更改范围
- 添加本次提交的描述信息
- 添加详细信息:按照自己小组的开发规则填写
- 是否有重大更改
- 此次更改是否影响其他问题
合并分支
git merge 需要合并到目前所在分支的分支名: 将需要的分支代码合并到本地目前所在分支,相当于将所需分支代码copy一份到本地所在分支,同时这个分支无论是本地还是远程均可
冲突解决
由于无法知道是那一部分产生了冲突,所以我们要将我们想要合入的分之,与本地合并
git merge 即将合并的分支
然后在本地进行冲突解决,完成之后,再发送merge请求
git merge 与 git rebase 区别总结
共同点:都是将更改从一个分支集成到另一个分支
不同点:集成的方式不同
开发情景:空心圆表示当前位置,然后当前懂master分之切出了两个分支,learn-rebase(红色) learn-merge (蓝色),这两个分支分别进行了两次commit ,然后最终希望将两个分支的内容都合并到master上
首先合并learn-merge 分支
只看蓝色的部分,learn-merge 分支与 master 分支的最新 commit 在同一条线上,这说明 learn-merge 分支的历史记录包含 master 分支所有的历史记录
git merge
git merge learn-merge
只需要通过把 master 分支的位置移动到 learn-merge 的最新分支上,Git 就会合并。这样的合并被称为 fast-forward(快进)合并。(fast-forward 模式下是不可能出现冲突的)
接下来需要合并 learn-rebase 分支
此时可以看到 master 的最新 commit 已经和 learn-merge 保持一致了,与 learn-rebase 分支不在一条直线上,那此时就不能进行 fast-forward 合并
此时两种方式merge 或者rebase
Merge
git merge learn-rebase
可以合并两个修改并生成一个新的提交。(此时可能会出现冲突的情况,因为 learn-rebase 分支可能与 learn-merge 分支修改同一个文件)
如上图所示:会在master分支上创建一个新的 merge commit,会将两个分支的历史联系在一起。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”
优点:是一个非破坏性的操作,现有分支不会以任何方式更改
缺点:在每次需要合并上游的更改的时候,该分支都会有一些额外无关的merge commit,所以如果master分支非常活跃,就可能会污染该功能分支的提交历史
Rebase
与 merge 会保留修改内容的历史记录不同,rebase 是在原有提交的基础上将差异内容反映进去
git checkout learn-rebase
git rebase master
最终master结果:
git checkout master
如上图所示:相当于将learn-rebase分支移到了master分支顶端,Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
rebase 的步骤分为两步,第一步将 learn-rebase 分支的历史记录添加在 master 分支的后面。这个时候可能会有冲突,当出现冲突时,解决冲突后的提交不是使用 commit 命令,而是执行 rebase 命令指定 --continue 选项。若要取消 rebase,指定 --abort 选项
git rebase --continue
git rebase --skip
git rebase --abort
优势:就是可以创造更线性的提交历史。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
缺点:
简单总结:
merge 保持了修改内容的历史记录,但是历史记录会很复杂;而 rebase 后的历史记录简单,是在原有提交的基础上将差异内容反映进去
查看tag
git tag
查看日志
git log
保存更改
应用场景:正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可以使用git stash命令先把当前进度保存起来,然后切换到另一个分支去修改bug,修改完提交后,再切回dev分支,使用git stash pop来恢复之前的进度继续开发新功能
git stash: 保存当前工作进度,会把暂存区和工作区的改动保存起来(也就是add了还没有commit 以及还没有add 的修改),执行了这个命令之后,执行 git status会显示当前是一个干净的工作区,没有任何改动
git stash save "描述信息": 实现功能与上面命令相同,只是添加了一些注释信息
git stash list : 显示保存进度的列表,也就表明,git stash 命令可以多次执行
git stash pop : 恢复最新的进度到工作区,git 默认会把工作区和暂存区的改动都恢复到工作区
git stash pop --index:恢复最新的进度到暂存区和工作区,也就是会将原来暂存区的内容还恢复到暂存区
git stash pop stash@{1}:恢复指定的进度到工作区。stash_id是通过git stash list命令得到的 通过git stash pop命令恢复进度后,会删除当前进度
git stash apply: 除了不删除恢复的进度之外,其余和git stash pop 以及其相关命令都是一样
git stash drop: 删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。
git stash clear: 删除所有存储的进度
版本回滚
处理自己的分支
本地分支版本回退
——自己在本地做了错误的提交,不过还没有push 到远程
git log : 查看分支提交历史,确认需要回退的版本
git reset --hard commit_id :进行版本回退
自己远程分之版本回退
——已经push 到了自己的远程分支
首先回退本地分支
git log : 查看分支提交历史,确认需要回退的版本
git reset --hard commit_id :进行版本回退
强制推送远程分支
git push -f
因为:本地分支回滚之后,版本将落后于远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程
处理公共远程分支
自己提交到了远程的公共分支eg: A1 - A2 -B1 ;发现自己提交的A2其实有错误,我们就需要撤销A2这次的提交
git revert 命令意思是撤销某次提交。它会产生一个新的提交,虽然代码回退了,但是版本依然是向前的,所以,当你用revert回退之后,所有人pull之后,他们的代码也自动的回退了
注:
-
revert 是撤销一次提交,所以后面的commit id是你需要回滚到的版本的前一次提交
-
使用revert HEAD是撤销最近的一次提交,如果你最近一次提交是用revert命令产生的,那么你再执行一次,就相当于撤销了上次的撤销操作,换句话说,你连续执行两次revert HEAD命令,就跟没执行是一样的
-
使用revert HEAD~1 表示撤销最近2次提交,这个数字是从0开始的,如果你之前撤销过产生了commi id,那么也会计算在内的。
-
如果使用 revert 撤销的不是最近一次提交,那么一定会有代码冲突,需要你合并代码,合并代码只需要把当前的代码全部去掉,保留之前版本的代码就可以了.
reset 与revert
reset是用来"回退"版本,而revert是用来"还原"某次或者某几次提交
在确认要回滚的版本之后,如果别人没有最新提交,那么就可以直接用reset命令进行版本回退,否则,就可以考虑使用revert命令进行还原修改,不能影响到别人的提交
如图有四个版本:当前处于D版本,发现B版本出现错误
Reset
适用:恢复到之前的某个版本,且该版本之后提交的版本都不要了
git log 查看版本号
git reset --hard B的版本号
git push -f 强制push
结果:B版本之后提交的C D版本都会删除(并非物理删除)
revert
适用:我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程
git log 查看版本号
git revert -n B的版本号
可能会产生冲突,修改之后
git add
git commit -m “ ”
git push
结果:会重做B版本,然后产生新的提交版本