Git常用命令總結(jié)

timg.jpg

基礎(chǔ)命令

用戶設(shè)置

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

初始化倉庫

 git init

把文件添加到倉庫

git add filename

把文件提交到倉庫

git commit -m "comment message"

添加文件到Git倉庫

分兩步:

  1. 第一步昭伸,使用命令git add,注意绊序,可反復(fù)多次使用煎谍,添加多個(gè)文件攘蔽;

  2. 第二步,使用命令git commit呐粘,完成。

運(yùn)行g(shù)it status命令看看結(jié)果

git status

但如果要看看具體修改了什么內(nèi)容

git diff filename
  • 要隨時(shí)掌握工作區(qū)的狀態(tài)转捕,使用git status命令作岖。

  • 如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容

版本控制系統(tǒng)肯定有某個(gè)命令可以告訴我們歷史記錄五芝,在Git中痘儡,我們用git log命令查看

git log

git log --pretty=oneline

首先,Git必須知道當(dāng)前版本是哪個(gè)版本枢步,在Git中沉删,用HEAD表示當(dāng)前版本渐尿,也就是最新的提交,上一個(gè)版本就是HEAD^ ,上上一個(gè)版本就是HEAD^^矾瑰, 當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過來砖茸,所以寫成HEAD~100.

git reset --hard HEAD^

git reset --hard 3628164

Git提供了一個(gè)命令git reflog用來查看歷史

git reflog
  • HEAD指向的版本就是當(dāng)前版本,因此殴穴,Git允許我們在版本的歷史之間穿梭凉夯,使用命令git reset --hard commit id。

  • 穿梭前采幌,用git log可以查看提交歷史劲够,以便確定要回退到哪個(gè)版本。

  • 要重返未來休傍,用git reflog查看命令歷史征绎,以便確定要回到未來的哪個(gè)版本。

工作區(qū)(Working Directory):就是你在電腦里能看到的目錄磨取,比如我的learngit文件夾就是一個(gè)工作區(qū)人柿。

版本庫(Repository):工作區(qū)有一個(gè)隱藏目錄“.git”,這個(gè)不算工作區(qū)寝衫,而是Git的版本庫顷扩。

Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)慰毅,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master隘截,以及指向master的一個(gè)指針叫HEAD。

前面講了我們把文件往Git版本庫里添加的時(shí)候汹胃,是分兩步執(zhí)行的:

第一步是用“git add”把文件添加進(jìn)去婶芭,實(shí)際上就是把文件修改添加到暫存區(qū);

第二步是用“git commit”提交更改着饥,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支犀农。

git checkout -- file 可以丟棄工作區(qū)的修改

git checkout -- filename

git checkout -- file命令中的“--”很重要,沒有“--”宰掉,就變成了“創(chuàng)建一個(gè)新分支”的命令.

用命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage)呵哨,重新放回工作區(qū)

git reset HEAD  filename

git reset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)轨奄。當(dāng)我們用HEAD時(shí)孟害,表示最新的版本。

場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容挪拟,想直接丟棄工作區(qū)的修改時(shí)挨务,用命令git checkout -- file。

場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí)谎柄,想丟棄修改丁侄,分兩步,第一步用命令git reset HEAD file朝巫,就回到了場景1鸿摇,第二步按場景1操作。

確實(shí)要從版本庫中刪除該文件捍歪,那就用命令git rm刪掉户辱,并且commit

git rm test.txt
git commit -m remove test.txt

另一種情況是刪錯(cuò)了,因?yàn)榘姹編炖镞€有呢糙臼,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本

git checkout -- test.txt

git checkout其實(shí)是用版本庫里的版本替換工作區(qū)的版本庐镐,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”变逃。

命令git rm用于刪除一個(gè)文件必逆。如果一個(gè)文件已經(jīng)被提交到版本庫,那么你永遠(yuǎn)不用擔(dān)心誤刪揽乱,但是要小心名眉,你只能恢復(fù)文件到最新版本,你會(huì)丟失最近一次提交后你修改的內(nèi)容凰棉。

遠(yuǎn)程倉庫

要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫损拢,使用命令

git remote add origin git@server-name:path/repo-name.git

關(guān)聯(lián)后,使用命令第一次推送master分支的所有內(nèi)容

git push -u origin master

此后撒犀,每次本地提交后福压,只要有必要,就可以使用命令git push origin master推送最新修改或舞;

用命令git clone克隆一個(gè)本地庫

Git本身的源代碼你既可以用 git://協(xié)議來訪問

git clone  git://git.kernel.org/pub/scm/git/git.git

也可以通過http 協(xié)議來訪問:

git clone http://www.kernel.org/pub/scm/git/git.git

git 分支

查看分支:git branch

創(chuàng)建分支:git branch name

切換分支:git checkout name

創(chuàng)建+切換分支:git checkout -b name

合并某分支到當(dāng)前分支:git merge name

刪除分支:git branch -d name

在 當(dāng)前分支下荆姆,要把dev分支的內(nèi)容合并

git merge dev

當(dāng)Git無法自動(dòng)合并分支時(shí),就必須首先解決沖突映凳。解決沖突后胆筒,再提交,合并完成诈豌。

用git log --graph命令可以看到分支合并圖仆救。

在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:

首先矫渔,master分支應(yīng)該是非常穩(wěn)定的派桩,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活蚌斩;

那在哪干活呢?干活都在dev分支上,也就是說送膳,dev分支是不穩(wěn)定的员魏,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí)叠聋,再把dev分支合并到master上撕阎,在master分支發(fā)布1.0版本;

你和你的小伙伴們每個(gè)人都在dev分支上干活碌补,每個(gè)人都有自己的分支虏束,時(shí)不時(shí)地往dev分支上合并就可以了。

Git還提供了一個(gè)stash功能厦章,可以把當(dāng)前工作現(xiàn)場“儲(chǔ)藏”起來镇匀,等以后恢復(fù)現(xiàn)場后繼續(xù)工作:

git stash

現(xiàn)在,用git status查看工作區(qū)袜啃,就是干凈的(除非有沒有被Git管理的文件)汗侵,因此可以放心地創(chuàng)建分支來修復(fù)bug。

首先確定要在哪個(gè)分支上修復(fù)bug群发,假定需要在master分支上修復(fù)晰韵,就從master創(chuàng)建臨時(shí)分支:

轉(zhuǎn)換到master分支

git checkout master

創(chuàng)建并轉(zhuǎn)換到的名字為 issue-101 的分支

git checkout -b issue -101

查看存儲(chǔ)的工作 用git stash list

git stash list

工作現(xiàn)場還在,Git把stash內(nèi)容存在某個(gè)地方了熟妓,但是需要恢復(fù)一下雪猪,有兩個(gè)辦法:

一是用git stash apply恢復(fù),但是恢復(fù)后起愈,stash內(nèi)容并不刪除只恨,你需要用git stash drop來刪除;

另一種方式是用git stash pop告材,恢復(fù)的同時(shí)把stash內(nèi)容也刪了:

修復(fù)bug時(shí)坤次,我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并斥赋,最后刪除缰猴;

當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場git stash一下疤剑,然后去修復(fù)bug滑绒,修復(fù)后,再git stash pop隘膘,回到工作現(xiàn)場.

如果要丟棄一個(gè)沒有被合并過的分支疑故,可以通過git branch -D name強(qiáng)行刪除。
;

當(dāng)你從遠(yuǎn)程倉庫克隆時(shí)弯菊,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對應(yīng)起來了纵势,并且,遠(yuǎn)程倉庫的默認(rèn)名稱是origin。

要查看遠(yuǎn)程庫的信息钦铁,用git remote或者用git remote -v顯示更詳細(xì)的信息:

推送分支

推送分支软舌,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫。推送時(shí)牛曹,要指定本地分支佛点,這樣,Git就會(huì)把該分支推送到遠(yuǎn)程庫對應(yīng)的遠(yuǎn)程分支上.

git push origin master

如果要推送其他分支黎比,比如dev超营,就改成

git push origin dev

但是,并不是一定要把本地分支往遠(yuǎn)程推送阅虫,那么演闭,哪些分支需要推送,哪些不需要呢书妻?

  • master分支是主分支船响,因此要時(shí)刻與遠(yuǎn)程同步;

  • dev分支是開發(fā)分支躲履,團(tuán)隊(duì)所有成員都需要在上面工作见间,所以也需要與遠(yuǎn)程同步;

  • bug分支只用于在本地修復(fù)bug工猜,就沒必要推到遠(yuǎn)程了米诉,除非老板要看看你每周到底修復(fù)了幾個(gè)bug;

  • feature分支是否推到遠(yuǎn)程篷帅,取決于你是否和你的小伙伴合作在上面開發(fā)史侣。

總之,就是在Git中魏身,分支完全可以在本地自己藏著玩惊橱,是否推送,視你的心情而定箭昵!

抓取分支

多人協(xié)作時(shí)税朴,大家都會(huì)往master和dev分支上推送各自的修改。

現(xiàn)在家制,模擬一個(gè)你的小伙伴正林,可以在另一臺電腦(注意要把SSH Key添加到GitHub)或者同一臺電腦的另一個(gè)目錄下克隆:

git clone git://git.kernel.org/pub/scm/git/git.git

指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接

git branch --set -upstream dev origin/dev

git pull

因此颤殴,多人協(xié)作的工作模式通常是這樣:

  1. 首先觅廓,可以試圖用git push origin branch-name推送自己的修改;

  2. 如果推送失敗涵但,則因?yàn)檫h(yuǎn)程分支比你的本地更新杈绸,需要先用git pull試圖合并帖蔓;

  3. 如果合并有沖突,則解決沖突蝇棉,并在本地提交讨阻;

  4. 沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功篡殷!

如果git pull提示“no tracking information”,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建埋涧,用命令git branch --set-upstream branch-name origin/branch-name板辽。

這就是多人協(xié)作的工作模式,一旦熟悉了棘催,就非常簡單劲弦。

  • 查看遠(yuǎn)程庫信息,使用git remote -v醇坝;

  • 本地新建的分支如果不推送到遠(yuǎn)程邑跪,對其他人就是不可見的;

  • 從本地推送分支呼猪,使用git push origin branch-name画畅,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交宋距;

  • 在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支轴踱,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致谚赎;

  • 建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)淫僻,使用git branch --set-upstream branch-name origin/branch-name;

  • 從遠(yuǎn)程抓取分支壶唤,使用git pull雳灵,如果有沖突,要先處理沖突闸盔。

tag 標(biāo)簽

命令git tag name就可以打一個(gè)新標(biāo)簽悯辙,可以用命令git tag查看所有標(biāo)簽

新建標(biāo)簽

git tag v1.0

給commit id 為25656e2的歷史版本打標(biāo)簽

git tag v1.0 25656e2

查看標(biāo)簽

git show tagname

用git show tagname查看標(biāo)簽信息

git show v1.0
  • 命令git tag name用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD蕾殴,也可以指定一個(gè)commit id笑撞;

  • -a tagname -m "blablabla..."可以指定標(biāo)簽信息;

  • -s tagname -m "blablabla..."可以用PGP簽名標(biāo)簽钓觉;

  • 命令git tag可以查看所有標(biāo)簽茴肥;

推送某個(gè)標(biāo)簽到遠(yuǎn)程,使用命令git push origin tagname荡灾,或者瓤狐,一次性推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽

git push origin v1.0

git push origin --tags

刪除標(biāo)簽

分兩步瞬铸,

  1. 刪除本地;
  2. 刪除遠(yuǎn)程础锐。

刪除本地

git tag -d v0.9

刪除遠(yuǎn)程

git push origin :refs/tags/v0.9
  • 命令git push origin tagname可以推送一個(gè)本地標(biāo)簽嗓节;

  • 命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽;

  • 命令git tag -d tagname可以刪除一個(gè)本地標(biāo)簽皆警;

  • 命令git push origin :refs/tags/tagname可以刪除一個(gè)遠(yuǎn)程標(biāo)簽拦宣。

ignore 文件

不需要從頭寫.gitignore文件,GitHub已經(jīng)為我們準(zhǔn)備了各種配置文件信姓,只需要組合一下就可以使用了鸵隧。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore

忽略文件的原則是:

  1. 忽略操作系統(tǒng)自動(dòng)生成的文件,比如縮略圖等意推;
  2. 忽略編譯生成的中間文件豆瘫、可執(zhí)行文件等,也就是如果一個(gè)文件是通過另一個(gè)文件自動(dòng)生成的菊值,那自動(dòng)生成的文件就沒必要放進(jìn)版本庫外驱,比如Java編譯產(chǎn)生的.class文件;
  3. 忽略你自己的帶有敏感信息的配置文件腻窒,比如存放口令的配置文件昵宇。

配置別名

如果敲git st就表示git status

git config --global alias.st status
git config global alias.co checkout
git config global alias.ci commit 
git config global alias.br branch

git config --global alias.unstage 'reset HEAD'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市定页,隨后出現(xiàn)的幾起案子趟薄,更是在濱河造成了極大的恐慌,老刑警劉巖典徊,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杭煎,死亡現(xiàn)場離奇詭異,居然都是意外死亡卒落,警方通過查閱死者的電腦和手機(jī)羡铲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡毕,“玉大人也切,你說我怎么就攤上這事⊙澹” “怎么了雷恃?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長费坊。 經(jīng)常有香客問我倒槐,道長,這世上最難降的妖魔是什么附井? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任讨越,我火速辦了婚禮两残,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘把跨。我一直安慰自己人弓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布着逐。 她就那樣靜靜地躺著崔赌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滨嘱。 梳的紋絲不亂的頭發(fā)上峰鄙,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音太雨,去河邊找鬼。 笑死魁蒜,一個(gè)胖子當(dāng)著我的面吹牛囊扳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兜看,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼锥咸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了细移?” 一聲冷哼從身側(cè)響起搏予,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弧轧,沒想到半個(gè)月后雪侥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡精绎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年速缨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代乃。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旬牲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搁吓,到底是詐尸還是另有隱情原茅,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布堕仔,位于F島的核電站擂橘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贮预。R本人自食惡果不足惜贝室,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一契讲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滑频,春花似錦捡偏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绘搞,卻和暖如春彤避,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夯辖。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工琉预, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒿褂。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓圆米,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啄栓。 傳聞我的和親對象是個(gè)殘疾皇子娄帖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容