青铜玩家
一般情况下,单人项目开发过程的git流程也就是下面的4步:
1. 克隆远端项目或本地初始化项目
首先通过git clone从远程仓库拉取项目代码,当然如果远程仓库没有项目时可以git init,直接本地初始化项目;
2.提交文件到暂存区
本地写了一些代码,啪,准备提交了,git add .简单粗暴,提交所有修改的文件及内容到暂存区;
3. 将暂存区的文件提交到本地仓库
通过git commit -m '提交的一些备注写在这'将暂存区的内容提交到本地仓库;
4.本地仓库同步到远程仓库
通过git push将本地分支代码推送到与远程仓库;
到此,一个简单的代码修改后上传到git仓库的流程就结束了(适合单人开发),先去吃点东西补充下能量。
// 克隆项目 或 本地初始化git仓库
git clone 或 git init
// 提交所有的文件变更到暂存区
git add .
// 提交暂存区的所有代码到本地仓库
git commit -m '代码备注'
// 提交本地仓库代码到远程仓库
git push
白银玩家
那么问题来了,遇到多人开发时,总不能大家都在master分支上开发代码吧,如果2个人同时提交代码,且变更到同一个文件,总会有各式各样的冲突,每次提交代码都有冲突,那不是很🥚 疼,对于开发效率来说是极低的,所以多个分支是很有必要的;
新建分支
// 创建了自己的本地开发分支dev
git branch dev
// 查看所有本地分支
git branch
// 查看所有远程分支
git branch -r
// 查看所有分支(本地+远程)
git branch -a
// 删除dev分支
git branch -D dev
// 重命名分支
git branch -m <老名字> <新名字>
切换分支
// 切换到本地dev分支
git checkout dev
// 创建本地dev分支并切换到该分支上
git checkout -b dev
// 切换到本地dev分支
git switch dev
git checkout -b dev 其实就是git branch dev 和git checkout dev的结合体;
当切换分支时本地有一些文件的变更,但是又不想要了 该如何废弃那些变更呢?
// 当未进行git add提交到本地暂存区时
git checkout -- filename // 重置filename文件
git checkout . // 重制本地所有改动的文件
// 当进行了git add 提交,未进行git commit提交时,此时文件在暂存区
git reset HEAD filename // 重置filename文件
git reset HEAD // 重制本地所有改动的文件
// 当进行了git commit提交时,此时已有commmitid
git reset --hard HEAD^ // 回退到上一个commit状态
git reset --hard commit id //通过git log查看commit信息,回退到指定的commit id
合并分支
git merge <分支名>
提交文件到暂存区
// 提交所有文件
git add .
// 提交单个文件
git add <文件名>
提交暂存区文件到本地仓库
// 提交时会打开电脑自带编辑器以增加备注
git commit
// 提交
git commit -m '提交备注'
// git add . 和 git commit -m的结合体
git commit -am '提交备注'
// 上一版提交的commit信息不满意,可以修改上一版的commit备注信息,但也会修改commitId
git commit --amend
拉取代码
// 拉取远端的更改信息 不会更改本地代码
git fetch <远程主机名> <分支名>
// 相当于git fetch 和 git merge的结合体
git pull <远程主机名> <远程分支>:<本地分支>
不一会儿,又消耗了不少脑细胞,再找点东西去!
黄金玩家
这几种git操作学会了可以大大提升你的开发效率;
git push -u origin master // 绑定本地分支和远程分支的追踪关系
git stash // 暂存不想提交的代码
git log //查看commit的日志
git tag // 查看tag的版本
git status // 查看当前状态
git push -u origin master
// 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,
// 这样后面就可以不加任何参数使用git push
git push -u origin master
git push -u origin master 不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式,如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置
git stash
本地开发了一些代码,此刻有个问题,必须切换到其他分支修复,但刚刚的代码还没开发完不想提交,此时可以暂存到git栈中,然后切到其他分支去修复,最后回到这个分支再pop下来就可以继续开发了,真香
git stash //把本地的改动暂存起来
git stash save "message" 执行存储时,添加备注,方便查找。
git stash pop // 应用最近一次暂存的修改,并删除暂存的记录
git stash apply // 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即 stash@{0},如果要使用其他个,git stash apply stash@{$num} 。
git stash list // 查看 stash 有哪些存储
git stash clear // 删除所有缓存的 stash
git log
git log --oneline // 这个命令简化git log的默认的输出,仅仅输出commit hash 前7个字符串和commit message.
git log --oneline --number // 每条log只显示一行,显示number条.
git log --oneline --graph // 可以图形化地表示出分支合并历史.
git log --oneline branch1 ^branch2 // 可以查看在分支1,却不在分支2中的提交.^表示排除这个分支(Window下可能要给^branch2加上引号).
git log --stat // 在git log 的基础上输出文件增删改的统计数据。
git log -p // 控制输出每个commit具体修改的内容,输出的形式以diff的形式给出。
git show // git show命令同git log -p输出类似,只不过它只显示一个commit的内容,如果不指定commit hash, 它默认输出HEAD指向commit的内容.
git shortlog // 用于输出汇总信息,以作者进行分类
git shortlog -s // 可以用来统计每个作者的commit数量
git shortlog -n // 可以用来对统计的量进行倒序排列
git log <分支名> // 可以显示特定分支的log.
git log --author=<author name> // 可以指定作者的提交历史.
git log --since --before --until --after // 根据提交时间筛选log.
git log --after '9-3-2021'// 根据时间筛选log
git log --no-merges // 可以将merge的commits排除在外.
git log --merges // 显示白包括merge的log
git log --decorate // 会显示出对应commit的tag信息和分支信息.
git log --grep=<commit信息> // 根据commit信息过滤log
git tag
git tag // 查看tag版本
git tag -r // 查看远程tag版本
git tag <name> // 创建tag版本
git tag -d <name> // 删除tag版本
git push origin <name> // 创建远程tag版本
git push origin --tags // 本地tag上传到远程
git pull origin --tags // 合并远程tag到本地
git push origin :refs/tags/<name> // 删除远程版本
git status
git status -v, --verbose 冗长输出
git status -s, --short 以简洁的格式显示状态
git status -b, --branch 显示分支信息
git status --show-stash 显示贮藏区信息
git status --ahead-behind 计算完整的领先/落后值
git status --long 以长格式显示状态(默认)
git status -z, --null 条目以 NUL 字符结尾
东西越来越多,先去吃顿大餐,回来继续!
白金玩家
这个级别主要考虑的是分支上的代码有些问题,必须回退或者删除,此时一行一行去修改代码的话岂不是很让人头疼,下面的几个命令可以深入了解一下,那么我们来两两进行对比看看;
git reset // 代码重置
git revert // 代码回退
git merge // 代码合并
git rebase // 代码变基
回滚和重置
想想某一天,产品有需求变更,此时你在某个dev1分支上改了一段代码,准备上线,突然产品要求那个需求暂时不上,后面小版本上,心里🐎🐎🐎🐎🐎🐎🐎🐎。。。但是改了那段代码后又多了很多次的commit提交,改动量也不小,有些都忘记了改了哪里了,咋办?第一种方式:老老实实去找那个提交所有改动的内容,然后对比一一原样改回来,当然这种方式还是比较麻烦的,费时费力,第二种方式:回滚某次的commit提交即可,在那次commit提交前后的提交都不会影响,一行命令就解决了,完美!
git revert // 撤销某次操作,此操作不会修改原本的提交记录,而是会新增一条提交记录来抵消某次操作。
git revert <commit-id> // 针对普通 commit
git revert <commit-id> -m // 针对 merge 的 commit
// revert也可以回滚多个commit提交
git revert [commit-id1] [commit-id2] ...` 注意这是一个前开后闭区间,即不包括 commit1 ,但包括 commit2 。
回滚我们的提交有二种方式,一种是上文提到的git revert命令外,还可以使用 git reset 命令,那么它们两者有什么区别呢?
git revert 会新建一条 commit 信息,来撤回之前的修改。
git reset 会直接将提交记录退回到指定的 commit 上。
对于个人的 feature 分支而言,可以使用 git reset 来回退历史记录,之后使用 git push --force 进行推送到远程,但是如果是在多人协作的集成分支上,不推荐直接使用 git reset 命令,而是使用更加安全的 git revert 命令进行撤回提交。这样,提交的历史记录不会被抹去,可以安全的进行撤回。
git merge和get rebase的区别
这个我就不多介绍了,看大佬这篇文章就够了,写的很详细,我也学习到了不少干货;
钻石玩家
高深莫测的技术还需要不断的去探索发现。。。