git branch 为什么会进入编辑状态_最好的Git分支管理教程
Git最難學(xué)習(xí)的就是Git的多分支問題,不同操作會(huì)對(duì)當(dāng)前分支造成什么影響,比如相同初始狀態(tài),類似操作,rebase和merge的不同結(jié)果。
rebase(左),merge(右)教程簡(jiǎn)介
推薦一個(gè)非常通俗易懂的Git多分支教程:
Learn Git Branching?learngitbranching.js.org學(xué)習(xí)時(shí)長(zhǎng):0.5-1天
教程特點(diǎn):
- 將各個(gè)知識(shí)點(diǎn)劃分成關(guān)卡,像打游戲一樣學(xué)習(xí)。
- 所有操作均產(chǎn)生動(dòng)態(tài)變化過程(可視化),十分容易理解。
- 每個(gè)知識(shí)點(diǎn)都帶練習(xí),看完講解后親手輸命令看結(jié)果,加深印象。
教程平臺(tái)自己的命令:
- 左邊console輸入levels命令,調(diào)出關(guān)卡頁(yè)。
- reset:reset習(xí)題為初始狀態(tài)。
- undo:undo上一條git命令。
更多命令及設(shè)置:教程GitHub頁(yè)
上手教程
初接觸Git的朋友需要簡(jiǎn)單了解下Git的基礎(chǔ)知識(shí),即可輕松上手這個(gè)教程。
Git分為local和remote,一個(gè)典型的Git工作流:
圖片來(lái)源
教程要點(diǎn)
A 圖例
如下圖,一個(gè)節(jié)點(diǎn)(狀態(tài))對(duì)應(yīng)一次commit。節(jié)點(diǎn)的標(biāo)識(shí)(i.e. c0)表示commit記錄的hash值,可用git log查看。
c1->c0表示c1是在c0基礎(chǔ)上的commit。當(dāng)你只有l(wèi)ocal或remote時(shí),只有左邊實(shí)線狀態(tài)圖;兩者都有時(shí),則用實(shí)線表示local狀態(tài)(左),虛線表示remote狀態(tài)(右)。
local的master, o/master,remote的master都是branch name,其中o/是origin/,教程中用o/簡(jiǎn)寫。
默認(rèn)local master跟蹤o/master,o/master跟蹤remote master。(跟蹤track見教程)local的HEAD表當(dāng)前狀態(tài),若HEAD和某個(gè)branch(i.e. master)相同時(shí),則省略HEAD,并在該branch上加*,表該branch是當(dāng)前狀態(tài)(i.e. master*)。
B 主要命令匯總
1 創(chuàng)建、移動(dòng)分支
branch, checkout
創(chuàng)建:
git branch <branch> git checkout -b <branch>移動(dòng):
git checkout <branch> # 切換到<branch>分離HEAD:
git log # 查看commit記錄 git checkout <commit記錄hash前幾位> # 將HEAD指向一個(gè)狀態(tài)相對(duì)引用:^和~
- ^表上一節(jié)點(diǎn),^<num>表第<num>個(gè)父節(jié)點(diǎn)。
- ~也表上一節(jié)點(diǎn),~<num>表往上<num>個(gè)節(jié)點(diǎn)。
- ^ ~支持鏈?zhǔn)讲僮?#xff0c;如^2~3:第二個(gè)父節(jié)點(diǎn)往上3個(gè)節(jié)點(diǎn)。
強(qiáng)制移動(dòng)branch:
git branch -f master HEAD~3 # 強(qiáng)制移動(dòng)master到當(dāng)前節(jié)點(diǎn)往上三個(gè)節(jié)點(diǎn)的位置bugFix*表HEAD指向bugFix,故HEAD~3為bugFix~3。2 撤銷變更
reset, revert
- 這里是git reset,區(qū)別平臺(tái)自己的reset命令。
- reset:回滾到之前某一狀態(tài)。
- revert:增加新節(jié)點(diǎn),復(fù)制之前某一狀態(tài)。
reset后并不是直接刪除,git log查到c2記錄,還可以checkout或branch -f恢復(fù)c2。
git revert c03 合并/整理記錄
merge, rebase
先來(lái)看下兩個(gè)命令各自的效果:
初始(左)HEAD指向master,將master整理/合并到o/master上:
- git rebase o/master(中)
- git merge o/master(右)
可以看出,相比merge,rebase:
- 優(yōu)點(diǎn):rebase使?fàn)顟B(tài)圖變得很干凈,所有commit都在一條線上。
- 缺點(diǎn):rebase修改了狀態(tài)圖歷史。
rebase還支持交互式操作,只需加上-i (--interactive)參數(shù)。
pick就是下面omit刪除后,重新拾回。e.g.
git rebase -i HEAD~44 遠(yuǎn)程相關(guān)
pull, push
pull和push對(duì)應(yīng)。因?yàn)閜ull = fetch + merge,pull –rebase = fetch + rebase,故先解釋下fetch:
fetch的使用場(chǎng)景是當(dāng)clone后remote又有了非local的新的commit:
remote有了新commit(左),fetch后(右)具體來(lái)說(shuō),fetch完成了兩步操作:
pull = fetch + merge:
git pull先f(wàn)etch c3到local,并移動(dòng)o/master指向local c3;然后將當(dāng)前狀態(tài)(master*)和o/master merge 。
git pullpull –rebase = fetch + rebase:
上例用pull –rebase的話
push和pull對(duì)應(yīng),是將remote沒有的local狀態(tài)上傳,并更新相關(guān)指針。
git pushpush和pull都有兩種帶參數(shù)的形式:
下面的<remote>就是remote repo,默認(rèn)是origin。push <remote> <local branch>將<local branch>上remote沒有的狀態(tài)上傳,并更新相關(guān)指針。
push <remote> <local狀態(tài)>:<remote branch>和第一條的區(qū)別:(1)只要是<local狀態(tài)>就行,即使沒branch指向。(2)上傳到指定<remote branch>,若remote無(wú)<remote branch>,則會(huì)自動(dòng)新建。
pull <remote> <remote branch> pull <remote> <remote狀態(tài)>:<local branch>?其實(shí)無(wú)參數(shù)的push和pull就是同步所有變化。e.g.
初始狀態(tài):
git push origin foogit push origin c5:foo5 其他
cherry-pick,PR問題
cherry-pick也是用于整理記錄的,可實(shí)現(xiàn)pick部分狀態(tài)到當(dāng)前branch上。
e.g.
git cherry-pick c2 c4PR問題:以remote master分支為例,若remote將master鎖定,則git push時(shí)會(huì)返回
! [遠(yuǎn)程服務(wù)器拒絕] master -> master (TF402455: 不允許推送(push)這個(gè)分支; 你必須使用pull request來(lái)更新這個(gè)分支.)即不允許直接push到master。
解決:新建一個(gè)分支,push這個(gè)分支,并提交pull request。
總結(jié)
以上是生活随笔為你收集整理的git branch 为什么会进入编辑状态_最好的Git分支管理教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Petuum - Careers
- 下一篇: 总链接