新增分支
git branch XXX
切換分支
git checkout XXX
新建并切換分支
git checkout -b XXX
基于遠(yuǎn)程master分支切除一個(gè)新分支
git checkout -b new_feature origin/master
刪除分支
git branch -d XXX
出于安全考慮乏矾,沒有被合并到master過的branch在刪除是會(huì)失斆峡埂(因?yàn)榭赡軙?huì)誤刪掉未完成的branch)
如果確認(rèn)要?jiǎng)h除這個(gè)branch(例如某個(gè)未完成的功能被團(tuán)隊(duì)確認(rèn)永久斃掉了)
可以用下述命令永久刪除
git branch -D XXX
刪除遠(yuǎn)程倉庫的branch分支
git push origin -d XXX
branch的意義
推送本地分支
git push origin feature
這里的git push 多了origin feature 這個(gè)連個(gè)參數(shù)
origin 是遠(yuǎn)程倉庫的別名,是在git clone時(shí)git自動(dòng)起的
feature 是遠(yuǎn)程倉庫中目標(biāo)branch的名字
即:我要push到origin這個(gè)倉庫的feature分支
在git中钻心,默認(rèn)情況下凄硼,git push 只能上傳那些之前從遠(yuǎn)端clone下來的或者pull下來的分支
而如果需要push本地自己創(chuàng)建的分支,則需要手動(dòng)指定目標(biāo)倉庫和目標(biāo)分支(并且目標(biāo)分支的名稱必須和本地分支完全相同)
遠(yuǎn)程倉庫中HEAD是永遠(yuǎn)指向他的默認(rèn)分支的(master)捷沸,并不會(huì)隨著默認(rèn)分支的移動(dòng)而移動(dòng)
pull內(nèi)部操作其實(shí)是把遠(yuǎn)程倉庫取到本地后(使用fetch)摊沉,再用一次merge來把遠(yuǎn)端倉庫的新commits合并到本地
merge:合并commits
merge負(fù)責(zé):從目標(biāo)commit和commit(即HEAD所指向的commit)分叉的位置起,把目標(biāo)commit的路徑上所有commit的內(nèi)容一并應(yīng)用到當(dāng)前commit痒给,然后自動(dòng)生成一個(gè)新的commit
git merge feature
Feature Branching 最流行的工作流
這種工作模型的限制:使用這種工作模型時(shí)说墨,每個(gè)人的代碼在被大家看到的時(shí)候,就是它進(jìn)入正式的生產(chǎn)庫的時(shí)候
這種工作流的核心內(nèi)容總結(jié):
1苍柏、任何新功能(feature)或bug修復(fù)全部新建一個(gè)branch來寫尼斧;
2、branch寫完后试吁,合并到master棺棵,然后刪除這個(gè)branch
解決了團(tuán)隊(duì)開發(fā)的兩個(gè)關(guān)鍵問題:
1、代碼分享
2熄捍、一人多任務(wù)
查看歷史
git log
查看詳細(xì)歷史
-p是 --patch的縮寫烛恤,可以看到具體每個(gè)commit的改動(dòng)細(xì)節(jié)
git log -p
精簡歷史
如果你只想大致看一下改動(dòng)內(nèi)容,但并不想深入每一行的細(xì)節(jié)(例如你想回顧一下自己是在哪個(gè) commit 中修改了 games.txt 文件)余耽,那么可以把選項(xiàng)換成 --stat
git log --stat
查看任意一個(gè)commit
在 show 后面加上這個(gè) commit 的引用(branch 或 HEAD 標(biāo)記)或它的 SHA-1 碼:
git show 5e68b0d8
看指定 commit 中的指定文件
在 commit 的引用或 SHA-1 后輸入文件名:
git show 5e68b0d8 shopping\ list.txt
直接輸入gitk
命令缚柏,可以在可視化窗口中查看歷史
rebase
由于merge后就會(huì)出現(xiàn)分叉,顯得混亂碟贾;
如果不希望出現(xiàn)分叉船惨,可以用rebase來代替merge
為了避免和遠(yuǎn)端倉庫發(fā)生沖突柜裸,一般不要從master向其他branch執(zhí)行rebase操作
而如果是master以外的branch之間的rebase(比如branch1和branch2)直接rebase就好
git checkout branch1
git rebase master
剛剛提交的代碼,發(fā)現(xiàn)寫錯(cuò)了怎么辦粱锐? 對(duì)最新一條commit進(jìn)行修正
amend是修正的意思
git會(huì)把當(dāng)前commit里的內(nèi)容和暫存區(qū)(stageing area)里的內(nèi)容合并起來后創(chuàng)建一個(gè)新的commit
用這個(gè)新的commit把當(dāng)前commit替換掉
所以commit --amend做的事是:對(duì)最新一條commit進(jìn)行修正
注:commit --amend 并不是直接修改原 commit 的內(nèi)容疙挺,而是生成一條新的 commit
git commit --amend
寫錯(cuò)的不是最新的提交,而是倒數(shù)第二個(gè)怜浅?
rebase -i:交互式rebase
rebase -i 是 rebase -interactive 的縮寫形式铐然,即 交互式rebase
git rebase -i HEAD^^
上面這行代碼表示,把當(dāng)前 commit ( HEAD 所指向的 commit) rebase 到 HEAD 之前 2 個(gè)的 commit 上
說明:在 Git 中恶座,有兩個(gè)「偏移符號(hào)」: ^ 和 ~搀暑。
^ 的用法:在 commit 的后面加一個(gè)或多個(gè) ^ 號(hào),可以把 commit 往回偏移跨琳,偏移的數(shù)量是 ^ 的數(shù)量自点。例如:master^ 表>示 master 指向的 commit 之前的那個(gè) commit; HEAD^^ 表示 HEAD 所指向的 commit 往前數(shù)兩個(gè) commit脉让。
~ 的用法:在 commit 的后面加上 ~ 號(hào)和一個(gè)數(shù)桂敛,可以把 commit 往回偏移,偏移的數(shù)量是 ~ 號(hào)后面的數(shù)溅潜。例如:HEAD~5 >表示 HEAD 指向的 commit往前數(shù) 5 個(gè) commit术唬。
操作步驟:
1/git rebase -i HEAD^^
2/git add .
3/git commit --amend
4/ git rebase --continue
比錯(cuò)還錯(cuò),想直接丟棄剛寫的提交滚澜?
reset --hard 丟棄 最新的提交
即撤銷這條 commit
一旦回退到上個(gè)版本粗仓,除非記住該版本的commit標(biāo)記,否則不能再找到之后的版本了
慎用
git reset --hard HEAD^
想丟棄的也不是最新的提交设捐?
用交互式 rebase 撤銷提交
git rebase -i HEAD^^
運(yùn)行命令后借浊,直接刪除不要的 commit即可
用 rebase --onto 撤銷提交
下次再看,亂
代碼已經(jīng) push 上去了才發(fā)現(xiàn)寫錯(cuò)萝招?
1. 出錯(cuò)的內(nèi)容在你自己的 branch
強(qiáng)制提交覆蓋本地的分支
-f 是 --force 的縮寫巴碗,意為「忽略沖突,強(qiáng)制 push」
git push origin branch1 -f
2. 出錯(cuò)的內(nèi)容已經(jīng)合并到 master
千萬不能在master上強(qiáng)制push
在 revert 完成之后即寒,把新的 commit 再 push 上去橡淆,這個(gè) commit 的內(nèi)容就被撤銷了。它和前面所介紹的撤銷方式相比母赵,最主要的區(qū)別是逸爵,這次改動(dòng)只是被「反轉(zhuǎn)」了,并沒有在歷史中消失掉凹嘲,你的歷史中會(huì)存在兩條 commit :一個(gè)原始 commit 师倔,一個(gè)對(duì)它的反轉(zhuǎn) commit。
git checkout branch 的本質(zhì)
git checkout branch名 的本質(zhì)周蹭,其實(shí)是把 HEAD 指向指定的 branch趋艘,然后簽出這個(gè) branch 所對(duì)應(yīng)的 commit 的工作目錄疲恢。所以同樣的,checkout 的目標(biāo)也可以不是 branch瓷胧,而直接指定某個(gè) commit:
git checkout HEAD^^s
git checkout master~5
git checkout 78a4bc
git checkout 78a4bc^
臨時(shí)打包類型
stash:臨時(shí)存放工作目錄的改動(dòng)
把當(dāng)前工作目錄暫時(shí)清理干凈
git stash
需要的時(shí)候在重新復(fù)位
git stash pop
注意:沒有被 track 的文件(即從來沒有被 add 過的文件)不會(huì)被 stash 起來显拳,因?yàn)?Git 會(huì)忽略它們。如果想把這些文件也一起 stash搓萧,可以加上 -u
參數(shù)杂数,它是 --include-untracked
的簡寫。就像這樣:
git stash -u