git常用命令整理

前言

本文主要記錄自己平時(shí)經(jīng)常使用的git命令和收集別人博客中一些常用命令维哈,方便初學(xué)者理解和使用例隆。

本文先簡單介紹git工作原理阔逼,然后詳細(xì)介紹git的各種使用方法论巍。

1. git工作原理

一開始的時(shí)候烛谊,master分支是一條線,Git用master指向最新的提交嘉汰,再用HEAD指向master丹禀,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn):

image

每次提交鞋怀,master分支都會(huì)向前移動(dòng)一步双泪。

當(dāng)我們創(chuàng)建新的分支,例如dev時(shí)密似,Git新建了一個(gè)指針叫dev焙矛,指向master相同的提交,再把HEAD指向dev残腌,就表示當(dāng)前分支在dev上:

image

Git創(chuàng)建一個(gè)分支很快村斟,因?yàn)槌嗽黾右粋€(gè)dev指針,改改HEAD的指向抛猫,工作區(qū)的文件都沒有任何變化邓梅!

對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后邑滨,dev指針往前移動(dòng)一步日缨,而master指針不變:

image

假如我們?cè)赿ev上的工作完成了,就可以把dev合并到master上掖看。Git怎么合并呢匣距?最簡單的方法,就是直接把master指向dev的當(dāng)前提交哎壳,就完成了合并:

image

所以Git合并分支也很快毅待!就改改指針,工作區(qū)內(nèi)容也不變归榕!

合并完分支后尸红,我們可以刪除dev分支。刪除dev分支就是把dev指針給刪掉刹泄,刪掉后外里,我們就剩下了一條master分支:

image

關(guān)于HEAD:

當(dāng)前版本: HEAD
上一個(gè)版本: HEAD^,
上上一個(gè)版本: HEAD^^
之前100個(gè)版本: HEAD~100
準(zhǔn)確定位某次提交:commit_id

首先特石,我們?cè)趃itub上創(chuàng)建了自己的倉庫盅蝗,然后需要把github上的代碼拉到本地。

2. 拉代碼

2.1 克履氛骸(第一次拉取代碼)

第一次拉代碼墩莫,叫克隆clone芙委。點(diǎn)擊“clone or download”,復(fù)制狂秦。如我的地址是 https://github.com/imutlxy/blog_code.git灌侣。

切換到你想放項(xiàng)目的目錄下,然后執(zhí)行:

git clone 項(xiàng)目地址(如:https://github.com/imutlxy/blog_code.git)

2.2 檢出分支

就是把遠(yuǎn)程分支的代碼checkout到本地

git checkout 分支名

2.3 從遠(yuǎn)端拉取最新代碼

前提條件:已經(jīng)clone了某個(gè)倉庫到本地裂问,并且已經(jīng)檢出某個(gè)分支到本地侧啼,當(dāng)該分支遠(yuǎn)端分支更新時(shí),我們可以通過git pull 來拉取最新代碼到本地愕秫。

git pull  

3. 查看有哪些分支慨菱,查看當(dāng)前位于哪個(gè)分支

//只顯示本地分支
git branch

//顯示本地和遠(yuǎn)端的所有分支
git branch -a 

結(jié)果如下:

image

帶*號(hào)的 master表示:當(dāng)前位于master分支。

remotes/origin/master表示:遠(yuǎn)端只有一個(gè)master分支戴甩。

帶remotes的都是遠(yuǎn)端分支符喝。

4. 在本地新建分支,并推送到遠(yuǎn)端

一般master是主分支甜孤,放著線上的代碼协饲。我們開發(fā)一般用developer分支,所以缴川,我們先來新建一個(gè)分支茉稠,并且把它推送到遠(yuǎn)端。

4.1 在本地新建分支

在本地新建分支:

git branch 分支名(比如這里是 developers)

執(zhí)行 git branch -a 查看一下有沒有建成功:

image

好了把夸,已經(jīng)ok了而线,然后我們需要切換到developer分支上

4.2 切換分支

git checkout developer

結(jié)果如下:

image

也可以直接下面這條命令來實(shí)現(xiàn)創(chuàng)建分支并切換到該分支:

git checkout -b 新建分支名

4.3 將本地新建分支推送到遠(yuǎn)端

git push origin developer

看結(jié)果,已經(jīng)有了一個(gè)remotes/origin/developer分支恋日。

image

5. 刪除分支

5.1 刪除本地分支

從這節(jié)開始就不上圖了膀篮,除非有必要。大家可以自己去敲驗(yàn)證的命令岂膳。

如果你新建了一個(gè)分支還沒上傳到遠(yuǎn)端誓竿,現(xiàn)在想刪除它。例如

git branch --delete 分支名(這里是test)

git branch -d 分支名

5.2 強(qiáng)行刪除本地分支

注意:如果當(dāng)前分支還沒有被合并谈截,刪除失敗筷屡,git會(huì)提示你。如果想強(qiáng)行刪除:

git branch -D 分支名

5.3 刪除遠(yuǎn)端分支

如果分支已經(jīng)推送到了遠(yuǎn)端:

git push origin --delete 分支名(這里是test) 

6. 提交代碼到遠(yuǎn)端

當(dāng)我們修改了一些內(nèi)容后簸喂,想提交到遠(yuǎn)端毙死,可以依次執(zhí)行:

git status

git add .

git commit -m "注釋:表示此次提交是完成了哪些功能"

git push origin 分支名

下面逐個(gè)講解這些命令的含義和使用方法。

6.1 查看有哪些文件修改了

git status

如下圖娘赴,紅色的文件就是有改動(dòng)的规哲。BuildConfig.java,Manifest.java诽表,R.java唉锌,這三個(gè)文件被刪除,delete竿奏,README.md和MainActivity.java被修改袄简,modify。

image

6.2 git add

git add命令主要用于把修改了的文件存到暫存區(qū)中泛啸。

添加一個(gè)文件到暫存區(qū):(注意:需要進(jìn)入到該文件所在的目錄)

git add 文件名

添加全部改動(dòng)的文件到暫存區(qū):

git add .

當(dāng)添加完后绿语,被添加的文件變?yōu)榱司G色。用 git status就可以看到候址,這里不貼圖吕粹。

6.3 將索引庫中的文件添加到本地倉庫中

git commit -m "注釋:表示這次提交什么功能"

6.2我們將需要提交的文件添加到了索引庫中,然后我們需要將這些文件提交到本地倉庫岗仑。執(zhí)行完 git commit 后匹耕,再用 git status 查看文件狀態(tài),發(fā)現(xiàn) git add 的那些文件都沒有了荠雕。

6.4 將本地倉庫中的文件推送到遠(yuǎn)端

git push origin 分支名

如果這個(gè)分支是本地新建的稳其,還沒有推送到遠(yuǎn)端,用這個(gè)命令也可以同時(shí)把本地分支提交到遠(yuǎn)端炸卑,同時(shí)提交本地修改既鞠。

這時(shí)候,你的所有改動(dòng)就都push到遠(yuǎn)端了盖文,你可以在github上看到提交記錄嘱蛋。

7 合并分支

7.1 合并指定分支到當(dāng)前分支

上面我們?cè)趖est分支上完成了功能,此時(shí)我們需要把test分支修改的東西合并到developer分支上五续。

  • 我們先切換到developer分支:

      git checkout developer
    
  • 然后 再merge

      git merge 分支名(這里是test)
    

此時(shí)洒敏,我們就看之前提交到test分支上的內(nèi)容,在developer分支也能看到了返帕。

7.2 解決沖突再合并

如果沒有沖突桐玻,那當(dāng)然是最好的,但很多時(shí)候merge時(shí)會(huì)有沖突荆萤,我們需要先解決沖突再合并镊靴。

比如:我現(xiàn)在在test分支上,README文件內(nèi)容是這樣的:


image

然后我們修改成這樣:

image

此時(shí)我們依次執(zhí)行

git add README.md

git commit -m "修改README"

git checkout developer

git merge test

看結(jié)果:

image

README出現(xiàn)conflict了链韭,merge failed偏竟。

我們?cè)賮砜纯碦EADME內(nèi)容:

image

吶,<<<<<<<指的是改動(dòng)之前的內(nèi)容敞峭,======作為分隔符踊谋,>>>>>>>指的是改動(dòng)之后的內(nèi)容。我們?cè)摻鉀Q沖突了旋讹,這里留下后面改動(dòng)的殖蚕,刪掉之前的內(nèi)容轿衔。然后再將修改后的文件重新提交即可。


8. 查看提交記錄

//查看當(dāng)前分支的提交記錄
git log

//查看指定分支的提交記錄
git log 分支名

9. 查看忽略的文件

通常有些文件無需納入 Git 的管理睦疫,也不希望它們總出現(xiàn)在未跟蹤文件列表害驹。通常都是些自動(dòng)生成的文件,比如日志文件蛤育,或者編譯過程中創(chuàng)建的臨時(shí)文件等宛官。我們可以創(chuàng)建一個(gè)名為 .gitignore 的文件,列出要忽略的文件模式瓦糕。android studio創(chuàng)建project時(shí)會(huì)自動(dòng)生成一個(gè).gitignore 的文件底洗。

查看忽略文件:

cat .gitignore

如下圖:

image

我們可以自己編輯 gitignore 文件,添加別的需要忽略的文件咕娄。

10.關(guān)于撤銷

10.1 撤銷工作區(qū)的修改

場(chǎng)景一:

我修改了README.md文件亥揖,但是還沒有執(zhí)行 git add,此時(shí)谭胚,我不想要這些修改了徐块,我要放棄這些修改,也就是回到之前沒有任何修改的狀態(tài)灾而。

//放棄單個(gè)文件
git checkout 文件名

//放棄全部修改
git checkout .

10.2 撤銷暫存區(qū)的修改

場(chǎng)景二:

  1. 接著上面的問題胡控,如果我已經(jīng)把這些修改的文件都添加到了暫存區(qū)中,也就是我執(zhí)行了git add旁趟,但還沒執(zhí)行 git commit昼激,這時(shí)如果想撤銷這些修改,重新放回工作區(qū)锡搜,可以執(zhí)行:

    //撤銷某個(gè)文件
    git reset HEAD 文件名

    //撤銷全部文件橙困,全部放回工作區(qū)
    git reset HEAD

  1. 如果徹底不想要這些暫存區(qū)中的文件,也就是撤銷此次所有修改耕餐,并且不放回工作區(qū)凡傅,可以執(zhí)行:

    git reset --hard

10.3 撤銷本地倉庫的提交

場(chǎng)景三:

我修改了文件,然后依次執(zhí)行了 git add 肠缔,git commit夏跷,但我還沒執(zhí)行 git push,此時(shí)我發(fā)現(xiàn)自己提交錯(cuò)了文件明未,我想撤銷此次提交槽华,回到上次提交的狀態(tài)√送祝可以執(zhí)行:

git reset --hard HEAD^

我們來實(shí)際模擬一下場(chǎng)景猫态。

  1. 用git log看一下提交記錄,我們看到,最近一次提交記錄是“初次提交工程”亲雪,再前一次是“test勇凭。
image
  1. 然后我們修改README文件,并且提交到本地倉庫匆光,也就是執(zhí)行g(shù)it commit -m "修改README--1"套像,如下:
image

再看一下提交記錄:

image
  1. 撤銷剛才的提交記錄酿联,回到上一次提交記錄终息,即"初次提交工程"。
image

看到了嗎贞让,之前的提交竟然消失了周崭!README內(nèi)容也回到之前的樣子。

  1. 如果你又想再回到剛才撤銷記錄的狀態(tài)喳张,怎么辦续镇?

    git reset --hard 剛才提交記錄的版本號(hào)(這里是1883cb1df1bd670088e1cf82de18967076d1754f).到這里大家可能會(huì)問,怎么拿到這個(gè)記錄的版本號(hào)呢销部?

     git reflog
    
image

看到?jīng)]摸航,git會(huì)記錄你的每一次記錄!在git舅桩,是有后悔藥的=椿ⅰ!擂涛!

11. 比較提交

11.1 比較兩個(gè)分支的差異

git diff master..test

11.2 查看當(dāng)前分支工作區(qū)與緩沖區(qū)的差異

會(huì)詳細(xì)列出修改內(nèi)容

git diff

11.3 查看緩存區(qū)和上次提交的差異

顯示你當(dāng)前的索引和上次提交間的差異(這次git add 和 上次git commit的差異)读串,也是下次提交時(shí)要提交的內(nèi)容(staged,添加到索引中):

git diff --cached

//可以具體定位到某一個(gè)文件
git diff --cached filename
image

11.4 查看當(dāng)前分支與其他指定分支的差異

git diff 指定分支名

//也以加上路徑限定符,來只 比較某一個(gè)文件或目錄撒妈。
git diff HEAD -- ./lib

11.5 查看有哪些文件有改動(dòng)(只簡單列出改動(dòng)的文件名)

如果不是查看每個(gè)文件的詳細(xì)差別恢暖,而是統(tǒng)計(jì)一下有哪些文件被改動(dòng),有多少行被改動(dòng)狰右,就可以使用‘--stat' 參數(shù)杰捂。

git diff --stat

如下圖,BuildConfig.java棋蚌,Manifest.java嫁佳,R.java,README.md附鸽,MainActivity.java這幾個(gè)文件被改動(dòng)脱拼。

image

11.6 查看某兩個(gè)版本之間的差異

git diff 版本號(hào)1 版本號(hào)2

11.7 查看某兩個(gè)版本的某個(gè)文件之間的差異

git diff 版本號(hào)1:filename 版本號(hào)2:filename

12 把當(dāng)前目錄變成Git可以管理的倉庫

當(dāng)你在本地新建了一個(gè)倉庫,可以通過以下命令把它變成git管理倉庫:

git init

參考:

廖雪峰:Git教程

Git

Git Community Book 中文版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坷备,一起剝皮案震驚了整個(gè)濱河市熄浓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖赌蔑,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俯在,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡娃惯,警方通過查閱死者的電腦和手機(jī)跷乐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾浅,“玉大人愕提,你說我怎么就攤上這事∶笊冢” “怎么了浅侨?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長证膨。 經(jīng)常有香客問我如输,道長,這世上最難降的妖魔是什么央勒? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任不见,我火速辦了婚禮,結(jié)果婚禮上崔步,老公的妹妹穿的比我還像新娘稳吮。我一直安慰自己,他們只是感情好刷晋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布盖高。 她就那樣靜靜地躺著,像睡著了一般眼虱。 火紅的嫁衣襯著肌膚如雪喻奥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天捏悬,我揣著相機(jī)與錄音撞蚕,去河邊找鬼。 笑死过牙,一個(gè)胖子當(dāng)著我的面吹牛甥厦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寇钉,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刀疙,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了扫倡?” 一聲冷哼從身側(cè)響起谦秧,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后疚鲤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锥累,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年集歇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桶略。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诲宇,死狀恐怖际歼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焕窝,我是刑警寧澤蹬挺,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站它掂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溯泣。R本人自食惡果不足惜虐秋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垃沦。 院中可真熱鬧客给,春花似錦、人聲如沸肢簿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽池充。三九已至桩引,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間收夸,已是汗流浹背坑匠。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卧惜,地道東北人厘灼。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像咽瓷,于是被迫代替她去往敵國和親设凹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 初始化配置 #配置使用git倉庫的人員姓名 git config --global user.name "Your...
    賤精先玍丶閱讀 327評(píng)論 0 0
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,661評(píng)論 9 163
  • 三大區(qū)域: 工作區(qū) → 緩存區(qū) → 本地倉庫 一 茅姜、 使用 git config 命令進(jìn)行配置: git ...
    Manchangdx閱讀 2,842評(píng)論 0 2
  • 去看新家房子蓋的怎樣了闪朱,穿過圍擋時(shí),被鐵皮剌了兩道在大拇指這兒,血慢慢冒出來了监透。開始沒啥感覺桶错,回走到小區(qū)大...
    畫水何音閱讀 274評(píng)論 0 0
  • 生活有百般滋味,每種都是自己選擇胀蛮,不要抱怨院刁,老天對(duì)誰都是公平,有因就會(huì)有果粪狼,怎樣過上自己喜歡的生活退腥,達(dá)到幸福的彼岸...
    GfC閱讀 442評(píng)論 0 50