參考
https://github.com/geeeeeeeeek/git-recipes/wiki
git push [遠(yuǎn)程倉庫名] [本地分支名] : [遠(yuǎn)程分支名]
push本地develop分支到遠(yuǎn)程origin倉庫的dev分支无午。
git push origin develop:dev
如果終端所在的當(dāng)前分支就是要push到遠(yuǎn)程倉庫的本地分支的話瘪阁,一般省略掉本地分支名沦寂,直接用以下命令,將本地當(dāng)前分支push到遠(yuǎn)程的dev分支上去掐暮。
git push origin dev
如果想指定將本地分支上的某個(gè)commit push到遠(yuǎn)程分支上的話馅扣,比如將最新一次commit push到遠(yuǎn)程去,可以用:
git push origin HEAD:dev镐侯。
以此類推奕巍,push 最新一次commit的前一次可以用:
git push origin HEAD^:dev
刪除掉遠(yuǎn)程dev分支可用以下命令吟策,該命令可以理解為將本地的空push到遠(yuǎn)程分支上,即的止,刪除遠(yuǎn)程分支檩坚。
git push origin : dev
push后面加參數(shù)-u:
git push -u origin develop : dev
加上該參數(shù),除了push之外诅福,還做了一件事(由-u參數(shù)控制):
Branch develop set up to track remote branch dev from origin
即匾委,創(chuàng)建了track。
這樣以后氓润,就可以直接使用“git pull”了赂乐,該命令會(huì)自動(dòng)pull遠(yuǎn)程的dev分支到本地的develop分支上。
若在push時(shí)不加-u參數(shù)咖气,則在“git pull”時(shí)挨措,將會(huì)提示:
There is no tracking information for the current branch. Please specify which branch you want to merge with.
也就是,在使用“git pull”時(shí)崩溪,需要明確指明是從哪個(gè)遠(yuǎn)程分支上去拉:
git pull origin dev
也可以set tracking information for this branch:
git branch --set-upstream-to=origin/dev develop
push后面加參數(shù)-f:
git push -f origin HEAD:dev
-f參數(shù)即force之意浅役,執(zhí)行強(qiáng)制push,這樣會(huì)沖掉遠(yuǎn)程已提交的版本伶唯。
git remote add <shortname> <url>
給本地倉庫添加一個(gè)遠(yuǎn)程倉庫觉既,<shortname> 給遠(yuǎn)程倉庫起一個(gè)簡(jiǎn)潔的名字,默認(rèn)用origin這個(gè)名字來代表遠(yuǎn)程倉庫抵怎,<url>遠(yuǎn)程倉庫的地址奋救。
like this:
git remote add origin https://github.com/Zouyiran/learngit
git remote 列出當(dāng)前這個(gè)本地倉庫下所有的遠(yuǎn)程倉庫的名字,比如如果只有origin反惕,那就會(huì)顯示origin這個(gè)遠(yuǎn)程倉庫,如果想看倉庫具體的url地址的話演侯,用如下命令:
git remote -v
git checkout -b [本地跟蹤分支名] [遠(yuǎn)程倉庫名]/[遠(yuǎn)程分支名]
checkout是與當(dāng)前工作區(qū)有關(guān)的操作命令姿染,用于更新工作區(qū)。
git checkout -b develop origin/dev
以上命令做了兩件事:
首先,創(chuàng)建(由-b參數(shù)控制)本地分支track(跟蹤)遠(yuǎn)程分支悬赏,Branch develop set up to track remote branch dev from origin.
其次狡汉,切換(checkout)到該本地分支上,Switched to a new branch 'develop'.
git checkout -b develop
以上命令闽颇,單純的在本地創(chuàng)建develop分支盾戴,并切換到這個(gè)分支上去。
git checkout develop
以上命令兵多,針對(duì)本地已經(jīng)存在develop分支的情況尖啡,直接將工作區(qū)的內(nèi)容切為develop分支。
git checkout HEAD
以上命令剩膘,將工作區(qū)的內(nèi)容切為當(dāng)前分支的最新commit衅斩。
這個(gè)操作適用于,基于最新的commit怠褐,本地工作區(qū)又做了一些更改畏梆,且想放棄這些更改,回到最新commit的狀態(tài)奈懒。
以此類推奠涌,
git checkout HEAD^
以上命令,將工作區(qū)的內(nèi)容切為當(dāng)前分支的最新commit的上一次commit磷杏。
git checkout -- <某些文件>
以上命令溜畅,將工作區(qū)中某些文件的修改拋棄掉,讓這些文件與暫存區(qū)或者版本庫保持一致茴丰。
其中达皿,如果暫存區(qū)有,就回到與暫存區(qū)一致的狀態(tài)贿肩,否則峦椰,回到到版本庫中最新的commit一致的狀態(tài)。
git reset <commit version>
reset是與版本庫有關(guān)的操作命令汰规。
它會(huì)將版本庫的HEAD指針定位到某個(gè)commit版本上汤功。
比如:HEAD^ 前一個(gè)commit,HEAD^^ 前前一個(gè)commit溜哮,以此類推...
重點(diǎn)介紹三個(gè)參數(shù):
- --soft 只有版本庫變了滔金,暫存區(qū)和工作區(qū)都不會(huì)被改變。
- --mixed (默認(rèn))版本庫和暫存區(qū)變了茂嗓,工作區(qū)不會(huì)被改變餐茵。
- --hard 版本庫、暫存區(qū)和工作目錄都被改變述吸,都變成定位到的那個(gè)commit版本了忿族。
我一般用默認(rèn)和--hard這兩個(gè)比較多。
git revert <commit version>
git revert 比 git reset 要安全,同樣是針對(duì)本地版本庫的操作道批,它會(huì)將撤銷commit的操作作為新的commit错英,添加到之前最新commit之后。
所以隆豹,可以這樣去理解:
- git revert:把撤銷已有的commit作為新的commit椭岩。
- git reset:純粹的撤銷已有的commit。
git rebase
理解rebase的關(guān)鍵點(diǎn)在于:
rebase會(huì)為當(dāng)前分支上每一個(gè)提交創(chuàng)建一個(gè)新的提交璃赡,重寫了項(xiàng)目歷史判哥。
看圖說話:
可以看出,通過rebase命令鉴吹,原feature分支上的三次提交都被重新改寫了
(圖中姨伟,通過在每個(gè)commit點(diǎn)中間畫※號(hào)來表示提交的內(nèi)容跟原來不一樣)。
去看diff的話豆励,就可以發(fā)現(xiàn)夺荒,rebase之后的diff跟rebase之前的同一次commit的diff不一樣了。
這很好理解良蒸,比如就拿feature分支的第一次commit來說技扼,rebase之前的這次commit是基于第二個(gè)白色點(diǎn)的,而rebase之后的這次commit是基于第二個(gè)藍(lán)色點(diǎn)的嫩痰。所以diff當(dāng)然不一樣了剿吻。
合并多個(gè)commit
看這里
git rebase -i xxxx
修改歷史commit信息
修改最近一次commit信息,很簡(jiǎn)單:
git commit --amend
但是如果要修改歷史commit中的某一次提交信息怎么操作串纺?
比如丽旅,我想要修改倒數(shù)第四次commit中的提交信息。
首先纺棺,
git rebase -i HEAD~4
以上命令執(zhí)行之后榄笙,會(huì)出現(xiàn):
pick 762eb478 id: xxx cause: xxx solution: xxx
pick ba5a91a3 id: xxx cause: xxx solution: xxx
pick 82911374 id: xxx cause: xxx solution: xxx
pick b06e264b id: xxx cause: xxx solution: xxx
這里,我要修改倒數(shù)第四次的commit信息祷蝌,
因此將以上出現(xiàn)信息的第一行中的pick改為edit茅撞。然后保存退出。
這時(shí)巨朦,通過git log米丘,可以發(fā)現(xiàn)最后一次commit已經(jīng)變成之前的倒數(shù)第四個(gè)了。
再使用:
git commit --amend
來對(duì)commit信息進(jìn)行修改糊啡。
修改完成之后拄查,怎么回到當(dāng)初呢?
使用:
git rebase --continue
搞定棚蓄。