1.引言
最近跳槽啦,入職啦一家新的公司,5個(gè)人協(xié)同辦公,共同維護(hù)一個(gè)項(xiàng)目。因?yàn)樽约篻it 用的不是很熟悉,導(dǎo)致,自己提交之后的代碼,把服務(wù)器上的代碼弄亂啦。折騰了一倆天。給自己帶來麻煩的同時(shí)也麻煩啦我的同事。所以今天花啦一整天學(xué)習(xí)下git的進(jìn)階使用。我是在Linux上寫的這篇博客
2.正題
2.1 概念
暫存區(qū):通過git add. 將文件提交的區(qū)域
本地區(qū):本地git倉(cāng)庫(kù)保存的區(qū)域
工作區(qū):對(duì)本地區(qū)代碼進(jìn)行修改,保存的區(qū)域

2.2 git 中的關(guān)聯(lián)關(guān)系:
- 本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)的關(guān)系
git add remote origin <遠(yuǎn)程倉(cāng)庫(kù)的地址> 本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)建立連接
git remote -v 查看遠(yuǎn)程倉(cāng)庫(kù)的地址
- 本地分支和遠(yuǎn)程分支的關(guān)系
git checkout -b <本地分支名> origin/<遠(yuǎn)程服務(wù)器分支名稱> 將遠(yuǎn)程分支拉到本地。此時(shí)遠(yuǎn)程分支和本地分支沒有建立聯(lián)系
git branch -u origin/ <遠(yuǎn)程分支名字,不帶origin> 本地分支和遠(yuǎn)程分支建立聯(lián)系(ps: 默認(rèn)是當(dāng)前的本地分支)
- 查看本地分支 和遠(yuǎn)程分支 的對(duì)應(yīng)關(guān)系
git branch -vv
2.3 場(chǎng)景分析
2.31 本地commite 合并
多人本地協(xié)同辦公,為了保證日志的清晰,每個(gè)人提交一次,只能有一個(gè)結(jié)點(diǎn)。也就是說本地有多個(gè)commite打話,必須要合并成一個(gè)commite。commite的合并 用到git rebase -i [startCommiteId]。此條指令的意思是,將startCommiteId 之后的提交合并成一個(gè)。
示例:

現(xiàn)在要將”本地的三次提交" 合并成一次。選擇”本地第一次提交" 前的一次commitId 作為startCommiteId,也就是 commit:e21b9a743c 那次提交。
執(zhí)行:git rebase -i e21b9a743c,進(jìn)入如下界面

將"pick " 改成 s 就行。s是 squash的 縮寫。 修改完畢:Ctrl+X 退出編輯界面,進(jìn)入到 ”合并日志填寫界面”

Ctrl+X 退出之后,就會(huì)提示保存成功
注意:
git rebase -i 是將最新的一次提交,壓縮到"前一個(gè)提交"上,因此我們不能把 將 "前一個(gè)提交"前打"Pick" 改成 "s"。 否則會(huì)提示:
Git: 在轉(zhuǎn)換時(shí)出現(xiàn)"沒有前一個(gè)提交不能進(jìn)行'squash'"

2.32 減少 沖突合并生成結(jié)點(diǎn)
合并是無時(shí)無刻存在的,單純的使用 git pull 將會(huì)發(fā)生合并操作。導(dǎo)致本地新生成一個(gè) "合并結(jié)點(diǎn)"。然后提交到服務(wù)器上,就會(huì)有這條合并記錄。日志上會(huì)很難看,且容易出現(xiàn)混亂。(ps:我本人就是因?yàn)檫@樣的操作,導(dǎo)致混亂)。正確的方式是:
git pull --rebase origin 遠(yuǎn)程分支名
之后,通過 git status 查看 沖突 ,更改沖突完畢之后
git add .
git rebase --continue
這樣就不會(huì)生成一個(gè)新的結(jié)點(diǎn)。前提啥:本地分支已經(jīng)提交
2.33 分支選擇性合并
當(dāng)前分支為A,還有一個(gè)分支為B?,F(xiàn)在想將B分支的一次提交,合并到A分支上。使用
git cherry-pick commiteId
有提示沖突:git status 查看,并修改,之后,git commit -s 提交 這次的合并
以上就是我最近一天遇到的關(guān)于git使用的痛點(diǎn)。通過這些天的摸索,也逐漸學(xué)會(huì)啦一些其他打命令。
git reset + commitId 回退版本,commitId 之后的改動(dòng),會(huì)在工作區(qū)中保存
git reset --soft +commitId 回退版本,commitId 之后的改動(dòng),會(huì)在工作區(qū)中保存
git reset --hard +commitId 回退版本到指定版本,commitId 之后的改動(dòng)就會(huì)被丟棄( 慎用)
git branch -vv 經(jīng)常需要查看當(dāng)前head 是否在分支上,以及本地分支對(duì)應(yīng)打遠(yuǎn)程分支
git push origin HEAD:遠(yuǎn)程分支名 "HEAD" 必須完全大寫。假如不指定遠(yuǎn)程分支,git push 默認(rèn)是在遠(yuǎn)程服務(wù)器新建立一個(gè) 和 本地分支名稱一樣的,遠(yuǎn)程分支
git pull --rebase origin 遠(yuǎn)程分支名 (不要用origin/遠(yuǎn)程分支名)
目前還有這些內(nèi)容待總結(jié):
- Choreographer 學(xué)習(xí)
- ViewGroup 自定義不執(zhí)行onDraw().通過設(shè)置 setWillNotDraw(false);
- ArgbEvaluator 類 可以實(shí)現(xiàn)字體顏色/背景的漸變效果
- 給控件設(shè)置ele 陰影,發(fā)現(xiàn)沒得反映 需要調(diào)用下:setOutlineProvider()
- focusSeach 進(jìn)一步深入理解
- TvRecycleView的bug 。設(shè)置了攔截子view 焦點(diǎn)的 模式,導(dǎo)致子view requestFOcus 失敗
- android tv 有些view setOnClick/setlongClick 無反應(yīng)。(原因是父布局dispathEvent返回true,更加深一層的原因是 view焦點(diǎn)占據(jù),所以不響應(yīng)事件)
- Git rebase Git revert Git stash ,Git commit -s 等等操作練習(xí)
革命尚未成功,同志們還任需努力!
補(bǔ)充:
git stash: 將當(dāng)前分支下,工作區(qū)的代碼(改動(dòng)的)存入棧中。方面進(jìn)行g(shù)it pull 操作
git stash pop: 將當(dāng)前棧中改動(dòng)的代碼,移出并且刪除,移出的意思是與當(dāng)前分支進(jìn)行合并。既然是合并就會(huì)產(chǎn)生沖突。解決沖突之后,git add . 一下 就 ok了。
git stash show : 查看是否棧中有緩存的代碼
git stash clear: 刪除 棧中的代碼