这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
课堂重点
今天没有课,但是小组项目开发的时候离不开git,于是想来复习一下
笔记
常用git后缀词
上传本地项目
git init // 初始化本地 Git 仓库,会生成一个 .git 隐藏文件夹
git remote add origin https://xxxx // 将本地项目关联远程仓库,后面的 https://xxxx 就是复制的远程仓库的链接
git pull --rebase origin master // 上传之前更新一下,确保没有冲突,master 为分支名称,--rebase 后面有介绍
git add . // 添加目录下所有发生改变的文件
git commit -m 'xxx' // 添加注释信息
git push -u origin master // 提交到 master 分支
git-remote-可以快速查看当前已经关联的远程仓库列表
git commit -am 'xxxx' 相当于git add. 加上git commit -m 'xxx'
git commit --amend 相当于上一次commit到本地仓库后但又有一个小文件更新要交上去,且不想重新commit一次记录,则可用这个方法
git merge test --squash --squash 表示合并,但是不生成 commit 记录,通常用于把本地分支合入远程分支
git merge --abort 取消合并
pull 和 fetch 都是下载远程分支,区别是 pull 会和当前分支合并,fetch 不会
# 查看所有本地分支
git branch
# 查看所有远程分支
git branch -r
# 查看本地和远程所有分支
git branch -a
# 删除本地 test 分支
git branch -d test
# 删除远程主机的 master 分支
git push origin -d master
合并分支
# 先切换到 master 分支
git checkout master
# 拉一下,看有没有更新
git pull
# 把 test 分支合进来
git merge test
# 查看状态,看有没有冲突的,有就打开 IDE 解决一下
git status
# 然后 add、commit、push 几个命令来一轮就 ok 了
git commit 说明规范
feat:添加新功能fix:修复问题/BUGstyle:注意不是指CSS,而是修改了如空格、缩进、逗号等代码风格相关,且不影响运行结果的perf:优化相关的,比如功能优化、性能提升、提升体验等refactor:代码重构,没有加新功能或者修复 bugrevert:撤消编辑,回滚到上一个版本、撤销上一次的 commit 之类的test:测试相关,比如单元测试、集成测试等docs:修改文档/注释,比如 README、CHANGELOG、CONTRIBUTE 等chore:依赖更新/脚手架配置修改等,比如有改变构建流程、或者增加依赖库、工具之类的workflow:工作流程改进ci:持续集成types:类型定义文件更改
git checkout test.js 撤销上次对test.js提交之后的所有更改
git checkout HEAD^ - test.js 只把 test.js 还原成上一个版本的,HEAD^表示上一个版本,HEAD^^上上一个版本
git rebase 和 git merge 的区别
git merge会新建一条新的 commit,然后两个分支以前的 commit 记录都指向这个新 commit 记录。这种方法会保留之前每个分支的 commit 历史。git rebase会先找到两个分支的第一个共同的 commit 祖先记录,然后将提取当前分支这之后的所有 commit 记录,放到目标分的最新提交后面。经过这个合并后,两个分支合并后的 commit 记录就变为了线性的记录了。
如下,需要把本地 test 分支合入 dev
# 为方便理解,字母表示commit记录,数字表示提交时间顺序,可以理解为1就是1点提交的
dev -> A1 -> B3 -> 这一行是远程 dev 分支的commit记录,A1/B3是你同事提交的
↘ X2 -> Y4↗ 这一行是拉取了 dev 分支后在本地的 test 分支 commit 记录
# 现在需要把你本地的分支合并到远程的分支去
# 用merge合并后,dev 分支看到的记录是这样的,M为merge记录的commit
dev -> A1 -> X2 -> B3 -> Y4 -> M
# 用rebase合并后,dev 分支看到的记录是这样的,注意顺序,且没有合并记录的commit
# 简单说就是直接把 test 分支的所有新的 commit 拿出来直接拼到 dev 分支末尾,不管提交时间先后
dev -> A1 -> B3 -> X2 -> Y4
合并冲突
合并时、或者拉取时等,发现有冲突,可能是其他同事提交的,自己不知道怎么冲突怎么选择,或者其他原因,总之不想合并了,都可以用 --abort 取消,比如合并的时候发现有冲突不想合并了
git merge --abort 取消合并即可
解决冲突 面试答法,先用git stash保存自己本地修改,然后git pull把远程的内容拉下来,然后git stash pop 把自己暂存的代码取出来,系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突,自行修改然后提交,同时得清空暂存区 stash clear
有的时候合并分支冲突是由于本地主分支没有更新导致,或者有时 git pull 的时候冲突,只需要掉本地主分支,再重新拉一下远程分支就好了。
有的时候冲突就只能解决冲突,使用 git status 看由于冲突导致没有合并成功的文件是哪些,然后去编辑器打开冲突的文件即可,也可用 cat <文件路径> 查看指定文件里冲突的部分,直接去编辑器改
或者就是用命令,比如把 test 分支,合入 master 分支时产生冲突。
# 只保留 test 的修改
git checkout --theirs test.js
# 只保留 master 的修改
git checkout --ours test.js
# 都保留
git checkout --ours/theirs test.js
# 查看冲突,都行
git diff --theirs
git diff --ours