跟著R哥來到了新公司(一個(gè)從硬件向互聯(lián)網(wǎng)轉(zhuǎn)型中的公司)劫狠,新公司以前的代碼基本是使用SVN做版本控制打掘,所以R哥叫HG做了一次Git分享菱农,準(zhǔn)備把公司所有的代碼用Git作版本控制。平時(shí)自己雖然天天使用Git拆火,但是總感覺知識(shí)有些零散,于是匯總了一些常用的Git命令涂圆。
常用配置
--system #系統(tǒng)級(jí)別
--global #用戶全局
--local #單獨(dú)一個(gè)項(xiàng)目
git config --global user.name "xxxx" #用戶名
git config --global user.email "xxxx@xxx.com" #郵箱
git config --global core.editor vim #編輯器
git config --global alias.st status #按這種方法们镜,配置別名
git config -l #列舉所有配置
Git中3種狀態(tài)的一些操作
#將工作區(qū)的修改提交到暫存區(qū)
git add <file>
git add .
#------------------------------------------
#將暫存區(qū)的內(nèi)容提交到版本庫(kù)
git commit <file>
git commit .
git commit -a #包括git add/ git rm /git commint 這三個(gè)操作,所有一般在操作工作區(qū)的時(shí)候乘综,直接刪除了文件憎账,而不是使用git rm的,最后提交是可以用這個(gè)卡辰,如下
#git commit -am "提交信息"
git commit -amend #修改最后一次提交的信息
#------------------------------------------
# 拋棄工作區(qū)修改(使用當(dāng)前暫存區(qū)的內(nèi)容狀態(tài)去覆蓋工作區(qū)胞皱,從而達(dá)到拋棄工作區(qū)修改的作用)
git checkout <file>
git checkout .
#------------------------------------------
#改變暫存區(qū)的修改(其實(shí)是重置HEAD,將指定版本庫(kù)的內(nèi)容狀態(tài)去覆蓋暫存區(qū)九妈,從而達(dá)到暫存區(qū)的改變)
git reset <file> #從暫存區(qū)恢復(fù)到工作區(qū)(不指定版本id反砌,則默認(rèn)為最后一次提交的版本id)
git reset . #從暫存區(qū)恢復(fù)到工作區(qū)
git reset $id # 恢復(fù)到指定的提交版本,該$id之后的版本提交都恢復(fù)到工作區(qū)
git reset --hard $id #恢復(fù)到指定的提交版本萌朱,該$id之后的版本提交全部會(huì)被拋棄宴树,將不出現(xiàn)在工作區(qū)
#注:如果不小心使用了錯(cuò)誤的HEAD重置,會(huì)發(fā)現(xiàn)HEAD指向了重置的版本id晶疼,該版本之后的版本提交都不見了酒贬,使用git log也無法找到又憨,那么怎么恢復(fù)呢?使用下面兩個(gè)命令
git reflog show master | head #會(huì)顯示所有的版本記錄
git reset --hard $id #重新重置锭吨,至于--hard蠢莺,請(qǐng)根據(jù)你時(shí)候?qū)⒏淖兊膬?nèi)容放到工作區(qū)還是直接拋棄進(jìn)行選擇
#------------------------------------------
#恢復(fù)某次提交(其實(shí)是某提提交的回滾操作,不影響其他的提交零如,所產(chǎn)生的效果創(chuàng)建一個(gè)新版本提交去回滾將指定的提交刪除躏将,包括產(chǎn)生的差異文件不會(huì)出現(xiàn)在工作區(qū),而是直接被拋棄)
git revert <$id>
git revert HEAD
#這里有一個(gè)很好的講解revert與reset的差異:git reset 是把HEAD向后移動(dòng)了一下考蕾,而git revert是HEAD繼續(xù)前進(jìn)祸憋,只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容肖卧。
#------------------------------------------
#刪除文件的幾種方法(貌似Git2.0后有了變化)
#第一種直接在工作區(qū)刪除
rm your_file #直接在工作區(qū)刪除文件
git add -u . #將有改動(dòng)的都提交到暫存區(qū)(包括修改的蚯窥,刪除的等操作),貌似git2.0 不加 -u 參數(shù)也可以
git commint -m "message" #提交版本庫(kù)
#第二種方法直接在工作區(qū)刪除
rm your_file #直接在工作區(qū)刪除文件
git commit -am "message" #這個(gè)在前面提過喜命,直接可以提交版本庫(kù)沟沙,-a會(huì)包括包括git add/ git rm /git commint 這三個(gè)操作
#第三種方法使用git rm
git rm <file> #不僅在工作區(qū)將文件刪除,同時(shí)將該刪除操作提交到暫存區(qū)
git commint -m "message" #提交版本庫(kù)
#關(guān)于git rm的其他補(bǔ)充
git rm --cached <file> #從暫存區(qū)中除去該文件壁榕,git將不再跟蹤該文件的變更矛紫,但仍然在工作區(qū)內(nèi),在需要.gitignore時(shí)經(jīng)常用到
文件直接比較差異Diff
git diff
git diff <file> #比較工作區(qū)與暫存區(qū)文件的差異
git diff --cached # 比較暫存區(qū)和版本庫(kù)差異
git diff <$id1> <$id2> # 比較兩次提交之間的差異
git diff <branch1>..<branch2> # 在兩個(gè)分支之間比較
分支
git branch -r #查看遠(yuǎn)程分支
git branch new_branch_name #新建一個(gè)分支
git branch --merged #查看已經(jīng)被合并到當(dāng)前分支的分支
git branch --no-merged #查看未被合并到當(dāng)前分支的分支
git checkout branch_name #切換分支
git checkout -b branch_name #創(chuàng)建分支并切換
git branch -d branch_name #刪除分支
git branch -D branch_name #強(qiáng)制刪除分支
git push origin :branch-name #刪除遠(yuǎn)程分支(先在本地刪除該分支)牌里,原理是把一個(gè)空分支push到server上颊咬,相當(dāng)于刪除該分支。
#從遠(yuǎn)程clone一個(gè)項(xiàng)目牡辽,雖然遠(yuǎn)程上該項(xiàng)目是有分支的喳篇,但clone下來后發(fā)現(xiàn)只有master分支,解決:
git checkout -b not_master_branch origin/not_master_branch #本地創(chuàng)建一個(gè)分支态辛,指向?qū)?yīng)的遠(yuǎn)程分支
git pull origin not_master_branch #將遠(yuǎn)程的not_master_branch分支pull下來
git push origin not_master_branch #將修改后的not_master_branch分支push到遠(yuǎn)程的not_master_branch
Tag
git tag v1.0.0 [SHA] #打一個(gè)輕量級(jí)的tag麸澜,只是一個(gè)commit的指向引用,[SHA]是可選擇值(某個(gè)commit的SHA),指定為哪個(gè)commit打tag奏黑,如果沒寫則直接為最后一個(gè)commit打tag
git tag -a v1.0.0 -m "你的附注信息" [SHA] #一個(gè)帶附注信息的tag炊邦,不是一個(gè)簡(jiǎn)單的引用,而是單獨(dú)的一個(gè)對(duì)象熟史,[SHA]是可選擇值(某個(gè)commit的SHA)馁害,指定為哪個(gè)commit打tag,如果沒寫則直接為最后一個(gè)commit打tag
git tag #列出所有的tag
git show v1.0.0 #打印指定tag的信息
git tag -d v1.0.0 #刪除本地指定tag
git push origin :refs/tags/v1.0.0 #刪除遠(yuǎn)程tag
遠(yuǎn)程
git remote -v # 查看遠(yuǎn)程服務(wù)器地址和倉(cāng)庫(kù)名稱
git remote show origin # 查看遠(yuǎn)程服務(wù)器倉(cāng)庫(kù)狀態(tài)
git remote add origin git@github:robbin/robbin_site.git # 添加遠(yuǎn)程倉(cāng)庫(kù)地址
git remote set-url origin git@github.com:robbin/robbin #修改遠(yuǎn)程地址
git remote rm #刪除遠(yuǎn)程創(chuàng)庫(kù)地址
從遠(yuǎn)程拉取內(nèi)容,提交內(nèi)容到遠(yuǎn)程
git pull #=git fetch + git merge
git fetch #拉取
git merge #合并
git push # push所有分支
git push origin master # 將本地主分支推到遠(yuǎn)程主分支
git push -u origin master # 將本地主分支推到遠(yuǎn)程(如無遠(yuǎn)程主分支則創(chuàng)建蹂匹,用于初始化遠(yuǎn)程倉(cāng)庫(kù))
git push origin <local_branch> # 創(chuàng)建遠(yuǎn)程分支碘菜, origin是遠(yuǎn)程倉(cāng)庫(kù)名
git push origin <local_branch>:<remote_branch> # 創(chuàng)建遠(yuǎn)程分支
git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),然后再push刪除遠(yuǎn)程分支
暫存管理
git stash #將工作區(qū)做的修改暫存到一個(gè)git棧中
git stash list #查看棧中所有暫存
git stash apply <暫存編號(hào)> #回復(fù)對(duì)應(yīng)編號(hào)暫存到工作區(qū),如果不指定編號(hào)為棧頂?shù)娜绦ィ⒁猓哼@些暫存還在棧中
git stash pop #將棧頂?shù)臅捍嫜鎏梗謴?fù)到工作區(qū),并從棧中彈出
git stash clear #清空暫存棧
創(chuàng)建遠(yuǎn)程庫(kù)
git clone --bare git_url_path #clone的時(shí)候吊骤,將其創(chuàng)建成遠(yuǎn)程創(chuàng)庫(kù)
git --bare init #初始化項(xiàng)目的時(shí)候缎岗,創(chuàng)建成遠(yuǎn)程創(chuàng)庫(kù)
部分參考Robbin Fan大神的博客《Git常用命令備忘》