Git 操作进阶使用
1.引言
最近跳槽啦,入职啦一家新的公司,5个人协同办公,共同维护一个项目。因为自己git 用的不是很熟悉,导致,自己提交之后的代码,把服务器上的代码弄乱啦。折腾了一俩天。给自己带来麻烦的同时也麻烦啦我的同事。所以今天花啦一整天学习下git的进阶使用。我是在Linux上写的这篇博客
2.正题
2.1 概念
暂存区
:通过git add. 将文件提交的区域
本地区
:本地git仓库保存的区域
工作区
:对本地区代码进行修改,保存的区域
2.2 git 中的关联关系:
- 本地仓库和远程仓库的关系
git add remote origin <远程仓库的地址> 本地仓库和远程仓库建立连接
git remote -v 查看远程仓库的地址
- 本地分支和远程分支的关系
git checkout -b <本地分支名> origin/<远程服务器分支名称> 将远程分支拉到本地。此时远程分支和本地分支没有建立联系
git branch -u origin/ <远程分支名字,不带origin> 本地分支和远程分支建立联系(ps: 默认是当前的本地分支)
- 查看本地分支 和远程分支 的对应关系
git branch -vv
2.3 场景分析
2.31 本地commite 合并
多人本地协同办公,为了保证日志的清晰,每个人提交一次,只能有一个结点。也就是说本地有多个commite打话,必须要合并成一个commite。commite的合并 用到git rebase -i [startCommiteId]
。此条指令的意思是,将startCommiteId 之后的提交合并成一个。
示例:
现在要将”本地的三次提交" 合并成一次。选择”本地第一次提交" 前的一次commitId 作为startCommiteId,也就是 commit:e21b9a743c 那次提交。
执行:git rebase -i e21b9a743c,进入如下界面
image.png
将"pick " 改成 s 就行。s是 squash的 缩写。 修改完毕:Ctrl+X 退出编辑界面,进入到 ”合并日志填写界面”
image.pngCtrl+X 退出之后,就会提示保存成功
注意:
git rebase -i
是将最新的一次提交,压缩到"前一个提交"上,因此我们不能把 将 "前一个提交"前打"Pick" 改成 "s"。 否则会提示:
Git: 在转换时出现"没有前一个提交不能进行'squash'"
2.32 减少 冲突合并生成结点
合并是无时无刻存在的,单纯的使用 git pull 将会发生合并操作。导致本地新生成一个 "合并结点"。然后提交到服务器上,就会有这条合并记录。日志上会很难看,且容易出现混乱。(ps:我本人就是因为这样的操作,导致混乱)。正确的方式是:
git pull --rebase origin 远程分支名
之后,通过 git status 查看 冲突 ,更改冲突完毕之后
git add .
git rebase --continue
这样就不会生成一个新的结点。前提啥:本地分支已经提交
2.33 分支选择性合并
当前分支为A,还有一个分支为B。现在想将B分支的一次提交,合并到A分支上。使用
git cherry-pick commiteId
有提示冲突:git status 查看,并修改,之后,git commit -s 提交 这次的合并
以上就是我最近一天遇到的关于git使用的痛点。通过这些天的摸索,也逐渐学会啦一些其他打命令。
git reset + commitId 回退版本,commitId 之后的改动,会在工作区中保存
git reset --soft +commitId 回退版本,commitId 之后的改动,会在工作区中保存
git reset --hard +commitId 回退版本到指定版本,commitId 之后的改动就会被丢弃( 慎用)
git branch -vv 经常需要查看当前head 是否在分支上,以及本地分支对应打远程分支
git push origin HEAD:远程分支名 "HEAD" 必须完全大写。假如不指定远程分支,git push 默认是在远程服务器新建立一个 和 本地分支名称一样的,远程分支
git pull --rebase origin 远程分支名 (不要用origin/远程分支名)
目前还有这些内容待总结:
- Choreographer 学习
- ViewGroup 自定义不执行onDraw().通过设置 setWillNotDraw(false);
- ArgbEvaluator 类 可以实现字体颜色/背景的渐变效果
- 给控件设置ele 阴影,发现没得反映 需要调用下:setOutlineProvider()
- focusSeach 进一步深入理解
- TvRecycleView的bug 。设置了拦截子view 焦点的 模式,导致子view requestFOcus 失败
- android tv 有些view setOnClick/setlongClick 无反应。(原因是父布局dispathEvent返回true,更加深一层的原因是 view焦点占据,所以不响应事件)
- Git rebase Git revert Git stash ,Git commit -s 等等操作练习
革命尚未成功,同志们还任需努力!
补充:
git stash:
将当前分支下,工作区的代码(改动的)存入栈中。方面进行git pull 操作
git stash pop:
将当前栈中改动的代码,移出并且删除,移出的意思是与当前分支进行合并。既然是合并就会产生冲突。解决冲突之后,git add . 一下 就 ok了。
git stash show :
查看是否栈中有缓存的代码
git stash clear:
删除 栈中的代码