好用的git指令

git教程

git簡介

git是一個(gè)開源的分布式版本控制系統(tǒng)禀梳,用于敏捷高效的處理任何大小的項(xiàng)目。

git工作流程相關(guān)概念

首先要理解git是如何工作的闭专,我們先要理解git工作區(qū)洒嗤,暫存區(qū)御板,版本庫的概念。

工作目錄:就是你在電腦里當(dāng)前工作的環(huán)境目錄虚吟。

暫存區(qū)域:英文叫stage, 或index寸认。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區(qū)有時(shí)也叫作索引(index)稍味。

git倉庫:工作區(qū)有一個(gè)隱藏目錄.git废麻,這個(gè)不算工作區(qū),而是Git的版本庫模庐。

git工作流程

1.在工作目錄中修改文件烛愧。

2.暫存文件,將文件的快照放入暫存區(qū)域掂碱。

3.提交更新怜姿,找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到git倉庫目錄疼燥。

這里針對(duì)的git操作分別為:git add fileName 或者git add *沧卢,這是git工作的第一步,將工作目錄中的變化添加到緩存區(qū),相當(dāng)于形成下一次將要提交的快照醉者。

然后通過git commit -m "cms框架搭建"完成第二步但狭,將文件的快照提交到暫存區(qū)域,也就是實(shí)際提交改動(dòng)撬即,此時(shí)你的結(jié)果已經(jīng)提交到head立磁,指向你最后一次提交的結(jié)果。

最后通過git push origin cms將暫存區(qū)的文件剥槐,更新到遠(yuǎn)程的git倉庫中唱歧。

git基本操作

1.查看遠(yuǎn)程分支

git branch -a

2.創(chuàng)建分支

git branch  branchName.比如:創(chuàng)建cms分支,git branch cms

3.刪除分支(本地)

git branch -d  branchName.比如:刪除cms分支粒竖,git branch -d cms

4.刪除分支(遠(yuǎn)程)

git push origin --delete branchName.比如:刪除遠(yuǎn)程cms分支, git push origin --delete branchName.

5.切換分支

git checkout branchName

6.合并分支到當(dāng)前分支

git merge  branchName颅崩,比如把cms分支合并到當(dāng)前分支(加入為agent),那么一定要注意更新本地分支蕊苗。

7.回滾日志沿后,回退

git reset --hard commit_id ,注意:git reset --hard是回退到當(dāng)前最新版本號(hào)岁歉。

8.根據(jù)版本號(hào)創(chuàng)建tag

git tag -a  tag name   versionid  -m  comments

9.提交tag到遠(yuǎn)程庫

git push origin --tag

10.獲取遠(yuǎn)程tag

git fetch origin tag  tagname 

11.刪除遠(yuǎn)程tag

git push origin --delete tag   tagname

12.查看日志

git log

13.暫存當(dāng)前工作

多人協(xié)作時(shí)得运,當(dāng)你正在agent分支上編輯某文件A膝蜈,但你需要切換到另一個(gè)分支上去,此時(shí)你本地正在編輯的文件又不想編輯熔掺,這個(gè)時(shí)候饱搏,如果是git checkout cms是無法實(shí)現(xiàn)分支切換的。這時(shí)置逻,你需要git stash來暫存當(dāng)前正在進(jìn)行的工作推沸。然后切換到cms分支修改bug,但是記得你在cms分支修改完bug之后券坞,切換到agent分支時(shí)鬓催,一定要記得git stash pop,取消暫存的區(qū)域恨锚,然后才能接著編輯文件A宇驾。

14.放棄當(dāng)前修改

git fetch origin

git reset --hard origin/master

創(chuàng)建代碼倉庫

git init 創(chuàng)建一個(gè)新的git倉庫,它用來將已存在但還沒有版本控制的項(xiàng)目轉(zhuǎn)換成一個(gè)git倉庫猴伶,或者創(chuàng)建一個(gè)新的git倉庫课舍。執(zhí)行了這個(gè)命令之后,會(huì)在當(dāng)前的目錄下增加一個(gè).git文件夾他挎,這就是你的git倉庫筝尾,才開始記錄項(xiàng)目版本情況了。

git clone giturl 克隆項(xiàng)目办桨。

git高級(jí)—子項(xiàng)目操作

1.使用場景

基于公司的項(xiàng)目會(huì)越來越多筹淫,常常需要提取一個(gè)公共的類庫提供給多個(gè)項(xiàng)目使用,但是這個(gè)library怎么和git在一起方便管理呢呢撞?

我們需要解決下面幾個(gè)問題:

  • 如何在git項(xiàng)目中導(dǎo)入library庫?
  • library庫在其他的項(xiàng)目中被修改了可以更新到遠(yuǎn)程的代碼庫中?
  • 其他項(xiàng)目如何獲取到library庫最新的提交?
  • 如何在clone的時(shí)候能夠自動(dòng)導(dǎo)入library庫?

解決以上問題损姜,可以考慮使用git的 Submodule來解決。

2.什么是Submodule殊霞?

git Submodule 是一個(gè)很好的多項(xiàng)目使用共同類庫的工具薛匪,他允許類庫項(xiàng)目做為repository,子項(xiàng)目做為一個(gè)單獨(dú)的git項(xiàng)目存在父項(xiàng)目中,子項(xiàng)目可以有自己的獨(dú)立的commit脓鹃,push,pull古沥。而父項(xiàng)目以Submodule的形式包含子項(xiàng)目瘸右,父項(xiàng)目可以指定子項(xiàng)目header,父項(xiàng)目中會(huì)的提交信息包含Submodule的信息岩齿,再clone父項(xiàng)目的時(shí)候可以把Submodule初始化太颤。

3.在項(xiàng)目中使用Submodule

使用git命令可以直接添加Submodule:

git submodule add <repo> <destpath>

git submodule add git@github.com:jjz/pod-library.git pod-library

使用 git status命令可以看到

git status

 On branch master
    Changes to be committed:
    
        new file:   .gitmodules
        new file:   pod-library

可以看到多了兩個(gè)需要提交的文件:.gitmodules和 pod-library

.gitmodules 內(nèi)容包含Submodule的主要信息,指定reposirory,指定路徑:

 [submodule "pod-library"]
        path = pod-library
        url = git@github.com:jjz/pod-library.git

可以看到記錄了子項(xiàng)目的目錄和子項(xiàng)目的git地址信息盹沈。

pod-libray內(nèi)容只保護(hù)子項(xiàng)目的commit id龄章,就能指定到對(duì)于的git header上,例如:

Subproject commit 4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5

4ac42d2f8b9ba0c2f0f2f2ec87ddbd529275fea5就是子項(xiàng)目的commit id吃谣,父項(xiàng)目的git并不會(huì)記錄Submodule的文件變動(dòng),它是按照commit git指定Submodule的git header做裙。

另外,這兩個(gè)文件都需要提交到父項(xiàng)目的git中岗憋。

還可以這樣使用命令添加Submodule

git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init

4.修改Submodule

首先需要確認(rèn)有對(duì)Submodule的commit權(quán)限。

進(jìn)入Submodule目錄里面:

cd pod-library/

修改其中的一個(gè)文件看下文件的可以用git status查看變動(dòng):

git status

modified:   pod-library/UseAFHTTP.h

提交Submodule的更改內(nèi)容:

git commit -a -m'test submodule'

然后push 到遠(yuǎn)程服務(wù)器:

git push

然后再回到父目錄,提交Submodule在父項(xiàng)目中的變動(dòng):

cd ..

然后看一下父目錄有啥變化:

git status

modified: pod-library (new commits)

可以看到pod-library中已經(jīng)變更為Submodule最新的commit id:

Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f

需要把Submodule的變動(dòng)信息推送到父項(xiàng)目的遠(yuǎn)程服務(wù)器:

git commit -m'update submodule'
git push

這樣就把子模塊的變更信息以及子模塊的變更信息提交到遠(yuǎn)程服務(wù)器了锚贱,從遠(yuǎn)程服務(wù)器上更新下來的內(nèi)容就是最新提交的內(nèi)容了仔戈。

總之一句話,提交的時(shí)候先提交到子項(xiàng)目拧廊,然后再提交到父項(xiàng)目中监徘。

5.更新Submodule

有兩種方式:一種是父目錄下直接更新,一種是先更新子目錄吧碾,再更新父目錄凰盔。

  • 父目錄直接更新
    git submodule foreach git pull
  • 子目錄下更新
    >cd pod-library
    git pull
    >cd ..
    git pull
    可以看到在Submodule的目錄中,使用git和單獨(dú)的一個(gè)項(xiàng)目是一樣的,注意更新Submodule的時(shí)候如果有新的commit id產(chǎn)生,需要在父項(xiàng)目產(chǎn)生一個(gè)新的提交倦春,pod-libray文件中的 Subproject commit會(huì)變?yōu)樽钚碌腸ommit id户敬。

6.clone Submodule

clone Submodule有兩種方式 一種是采用遞歸的方式clone整個(gè)項(xiàng)目,一種是clone父項(xiàng)目溅漾,再更新子項(xiàng)目山叮。

  • 采用遞歸參數(shù) --recursive
    git clone git@github.com:jjz/pod-project.git --recursive

輸出結(jié)果:

 loning into 'pod-project'...
    remote: Counting objects: 57, done.
    remote: Compressing objects: 100% (45/45), done.
    remote: Total 57 (delta 13), reused 49 (delta 8), pack-reused 0
    Receiving objects: 100% (57/57), 18.79 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (13/13), done.
    Checking connectivity... done.
    Submodule 'pod-library' (git@github.com:jjz/pod-library.git) registered for path 'pod-library'
    Cloning into 'pod-library'...
    remote: Counting objects: 34, done.
    remote: Compressing objects: 100% (25/25), done.
    remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
    Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (8/8), done.
    Checking connectivity... done.
    Submodule path 'pod-library': checked out '330417cf3fc1d2c

可以看到init Submodule 會(huì)自動(dòng)被clone下來。

  • 先clone父項(xiàng)目添履,再初始化子項(xiàng)目submodule
    git clone git@github.com:jjz/pod-project.gitcd pod-project
    初始化submodule
    git submodule init
    更新submodule
    git submodule update
    運(yùn)行結(jié)果:
    Cloning into 'pod-library'...
    remote: Counting objects: 34, done.
    remote: Compressing objects: 100% (25/25), done.
    remote: Total 34 (delta 8), reused 30 (delta 7), pack-reused 0
    Receiving objects: 100% (34/34), 12.95 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (8/8), done.
    Checking connectivity... done.
    Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'
    7.刪除Submodule
    git 并不支持直接刪除Submodule,而是需要手動(dòng)刪除對(duì)應(yīng)的文件:
    cd pod-project

        git rm --cached pod-library
        rm -rf pod-library
        rm .gitmodules
    
        更改git的配置文件config:
        vim .git/config
    

    可以看到Submodule的配置信息:
    [submodule "pod-library"]
    url = git@github.com:jjz/pod-library.git
    刪除submodule相關(guān)的內(nèi)容,然后提交到遠(yuǎn)程服務(wù)器:
    git commit -a -m 'remove pod-library submodule'

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屁倔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暮胧,更是在濱河造成了極大的恐慌锐借,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往衷,死亡現(xiàn)場離奇詭異钞翔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)席舍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門布轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人来颤,你說我怎么就攤上這事汰扭。” “怎么了福铅?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵萝毛,是天一觀的道長。 經(jīng)常有香客問我滑黔,道長笆包,這世上最難降的妖魔是什么环揽? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮庵佣,結(jié)果婚禮上歉胶,老公的妹妹穿的比我還像新娘。我一直安慰自己秧了,他們只是感情好跨扮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著验毡,像睡著了一般衡创。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晶通,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天璃氢,我揣著相機(jī)與錄音,去河邊找鬼狮辽。 笑死一也,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喉脖。 我是一名探鬼主播椰苟,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼树叽!你這毒婦竟也來了舆蝴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤题诵,失蹤者是張志新(化名)和其女友劉穎洁仗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體性锭,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赠潦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了草冈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片她奥。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怎棱,靈堂內(nèi)的尸體忽然破棺而出方淤,到底是詐尸還是另有隱情,我是刑警寧澤蹄殃,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站你踩,受9級(jí)特大地震影響诅岩,放射性物質(zhì)發(fā)生泄漏讳苦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一吩谦、第九天 我趴在偏房一處隱蔽的房頂上張望鸳谜。 院中可真熱鬧,春花似錦式廷、人聲如沸咐扭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝗肪。三九已至,卻和暖如春蠕趁,著一層夾襖步出監(jiān)牢的瞬間薛闪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工俺陋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豁延,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓腊状,卻偏偏與公主長得像诱咏,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缴挖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照袋狞,而是把代碼倉庫完整的鏡像下來。這樣一來醇疼,任何一處協(xié)同...
    __silhouette閱讀 15,855評(píng)論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照硕并,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,905評(píng)論 0 11
  • 本文作者陳云峰,轉(zhuǎn)載請(qǐng)注明秧荆。 這篇文章記錄個(gè)人常用的一些命令倔毙,和記不住的一些命令,轉(zhuǎn)載了并不斷更新乙濒。 Git官網(wǎng) ...
    陳云峰閱讀 2,806評(píng)論 0 24
  • 1陕赃,查看所有遠(yuǎn)程分支:%git branch -r 2, 拉取遠(yuǎn)程分支并創(chuàng)建本地分支git checkout -...
    will666閱讀 2,055評(píng)論 0 18
  • 從紙上的廈門到沙上的廈門, 只有親身體驗(yàn)才終生難忘颁股。 廈門這姑娘已經(jīng)不能用美形容么库, 她能牽起你的手在海邊漫步, 看...
    海南不下雪閱讀 301評(píng)論 2 1