平时看高玩们操作 git 时眼花缭乱的,可是非常羡慕的,git 不用工具,用命令行,在外人看来,这可是老高端的了,非常装逼,所以推荐大家学习,熟练掌握 git
这里我记录 git 中需要注意的部分,基础部分请 baidu
ps: 19.1.10 重新整理,上一篇已删除
工作区和版本库
工作区和版本库用文字描述不容易裂理解,大家看图
一张图,道尽所有~
撤销修改
撤销操作我们时不时会碰上,撤销包括:
- 撤销工作区的修改 -> 代码改了但是还没 add
git checkout -- app/src/main/java/com/bloodcrown/bw/screenauto/HeightActivity.kt
- 撤销暂存区的修改 -> add 了但是还没 commit
git reset HEAD app/src/main/java/com/bloodcrown/bw/screenauto/HeightActivity.kt
- 返回上一次提交 -> commit 了,回滚到上一次 commit
// 回滚一个版本
git reset --hard HEAD^
// 回滚任意个版本
git reset --hard HEAD~1
需要注意的是啊,撤销工作区和暂存区操作,具体到某一个文件时,该文件必须使用全路径名,我用文件名+后缀的方式,死活也跑步过去
checkout 还可以用来恢复被删除的文件,但是前提是这个文件得再暂存区或是版本库里面有才行
文件差异对比
我们有时会对比某个文件和版本库里面的差异
git diff HEAD -- app/src/main/java/com/bloodcrown/bw/screenauto/HeightActivity.kt
还是得注意,文件需要使用全路径名
![(https://img.haomeiwen.com/i1785445/cd53bd517ab32f70.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
--- 号:代表 HEAD 版本库中的代码
+++ 号:代表工作区中的代码
合并分枝的3种方式
- fast-forward 快速合并
- --no-ff 非快速合并
- --squash 压缩 commit 合并
下面有张图,解释的比较清楚:
fast-forward
git 直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建 commit
我们在 2 个分枝中修改是同一个文件,那么默认的 merge 合并就是 fast-forward 类型的
典型的特征是
git checkout -b dev后,在dev分支做了修改,提交了好几个commit。git checkout master,然后git merge dev。此时没有冲突,快速合并成功。
但是:我们在dev分支中的commit记录都没有了!!!
特别注意的是, fast-forward 方式其实明没有真正的合并代码,而是把一个分枝指向合并分枝的commit 操作,这样的坏处时,若我们再合并后把 dev 分枝删了,那么会影响 master 中的代码
--no-ff
git merge --no-ff -m '禁用fast-farword合并' dev
我们再合并时做一个提交,这样代码就在 master 分枝中保存了一份,我们就可以 删除 dev 分枝了,但是会把 dev 分钟的各种 commit 记录带到 master 中,我觉得 master 分枝不关心 dev 分枝中的具体 commit ,关心的是合并 commit ,就像代码封装一样,manage 管理类不必关心其中工具类的具体实现
squash
$ git merge --squash another
$ git commit -m "message here"
squash 方式,不会把 dev 分枝的 commit 记录带到 master 分枝中,使用 --squash 合并后,会把代码的不同合并之后添加到 暂存区,需要我们手动 commit 一次,这里我们写 dev 合并到 master 。好处是不影响 master 分枝的提交记录,这样在我们以后梳里提交历史时会很干净,不会有其他分提交历史干扰
我们看个例子:
-
先创建一个名叫 test 的分枝,提交2次,log 日志如下:
-
然后我们使用 squash 把 test 分枝合并到 master 分枝,然后 commit 此次合并,然后看 master 分枝的 log:
看的很清楚,test 分枝的提交记录不会再 master 分枝中看到,这种方式其实才是我们大部分时候需要的
分枝操作
查看分支,绿色的是当前分支
git branch -a
删除分支
git branch -d xxx
新建并切换到分支
git checkout -b xxx
切换分支
git checkout xxx
若是我们的本地仓库没有和远程仓库关联,使用 remote 命令关联远程仓库
git remote add origin https://github.com/WuXiaolong/WeWin.git
比如我们提交本地代码到 github 时,会涉及到 ssh 密钥一些替他问题,具体的请看:
此时我们的本地仓库已经和远程仓库关联起来了,比如远程仓库里面有一个分枝,我们想拉下来到本地
本地没有这个远程分枝时
git checkout origin/remoteName -b localName
本地有这个远程分枝时
git pull orign devolp:zhangbin
反过来我们要提交一个分枝到远程,远程此时没有这个分枝
git push orign zhangbin:devolp
删除远程分支,:左边的本地分支为空,那么将删除:右边的远程的分支
git push origin :test
打 tag
git tag v0.0.1 //创建本地tag
git tag -d v0.0.1 //删除本地tag
git tag -a v0.0.1 -m "version 0.0.1" // 创建tag并添加备注信息
git push origin v0.0.1:v0.0.1 //提交本地分支
reset 三种用法
reset HEAD 我们可以回滚版本,其实 reset 也是有多种限定符可用的
- git reset (–mixed) HEAD~1
回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响) - git reset –soft HEAD~1
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响) - git reset –hard HEAD~1
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
stash 保存暂存区
stash 命令也是我们常用的,比如领导让赶紧改一个 bug ,但是我们正在新的分枝开发代码呢,代码这时写到一半,我不想提交一个没意思的 commit 上去怎么办,那就得用 stash 来把暂存区保存下来
保存暂存区
git stash save "测试 stash"
查看暂存区保存记录
git stash list
恢复暂存区保存的代码
git stash pop
删除某一个暂存区保存记录,后跟这个记录对应的编号
git stash drop stash@{1}
删除某一个暂存区保存记录
git stash clear
网友评论