git常用命令整理

前言

本文主要記錄自己平時經常使用的git命令和收集別人博客中一些常用命令,方便初學者理解和使用。

本文先簡單介紹git工作原理,然后詳細介紹git的各種使用方法。

1. git工作原理

一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:

image

每次提交,master分支都會向前移動一步。

當我們創建新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:

image

Git創建一個分支很快,因為除了增加一個dev指針,改改HEAD的指向,工作區的文件都沒有任何變化!

對工作區的修改和提交就是針對dev分支了,比如新提交一次后,dev指針往前移動一步,而master指針不變:

image

假如我們在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合并:

image

所以Git合并分支也很快!就改改指針,工作區內容也不變!

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

image

關于HEAD:

當前版本: HEAD
上一個版本: HEAD^,
上上一個版本: HEAD^^
之前100個版本: HEAD~100
準確定位某次提交:commit_id

首先,我們在gitub上創建了自己的倉庫,然后需要把github上的代碼拉到本地。

2. 拉代碼

2.1 克隆(第一次拉取代碼)

第一次拉代碼,叫克隆clone。點擊“clone or download”,復制。如我的地址是 https://github.com/imutlxy/blog_code.git

切換到你想放項目的目錄下,然后執行:

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

2.2 檢出分支

就是把遠程分支的代碼checkout到本地

git checkout 分支名

2.3 從遠端拉取最新代碼

前提條件:已經clone了某個倉庫到本地,并且已經檢出某個分支到本地,當該分支遠端分支更新時,我們可以通過git pull 來拉取最新代碼到本地。

git pull  

3. 查看有哪些分支,查看當前位于哪個分支

//只顯示本地分支
git branch

//顯示本地和遠端的所有分支
git branch -a 

結果如下:

image

帶*號的 master表示:當前位于master分支。

remotes/origin/master表示:遠端只有一個master分支。

帶remotes的都是遠端分支。

4. 在本地新建分支,并推送到遠端

一般master是主分支,放著線上的代碼。我們開發一般用developer分支,所以,我們先來新建一個分支,并且把它推送到遠端。

4.1 在本地新建分支

在本地新建分支:

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

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

image

好了,已經ok了,然后我們需要切換到developer分支上

4.2 切換分支

git checkout developer

結果如下:

image

也可以直接下面這條命令來實現創建分支并切換到該分支:

git checkout -b 新建分支名

4.3 將本地新建分支推送到遠端

git push origin developer

看結果,已經有了一個remotes/origin/developer分支。

image

5. 刪除分支

5.1 刪除本地分支

從這節開始就不上圖了,除非有必要。大家可以自己去敲驗證的命令。

如果你新建了一個分支還沒上傳到遠端,現在想刪除它。例如

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

git branch -d 分支名

5.2 強行刪除本地分支

注意:如果當前分支還沒有被合并,刪除失敗,git會提示你。如果想強行刪除:

git branch -D 分支名

5.3 刪除遠端分支

如果分支已經推送到了遠端:

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

6. 提交代碼到遠端

當我們修改了一些內容后,想提交到遠端,可以依次執行:

git status

git add .

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

git push origin 分支名

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

6.1 查看有哪些文件修改了

git status

如下圖,紅色的文件就是有改動的。BuildConfig.java,Manifest.java,R.java,這三個文件被刪除,delete,README.md和MainActivity.java被修改,modify。

image

6.2 git add

git add命令主要用于把修改了的文件存到暫存區中。

添加一個文件到暫存區:(注意:需要進入到該文件所在的目錄)

git add 文件名

添加全部改動的文件到暫存區:

git add .

當添加完后,被添加的文件變為了綠色。用 git status就可以看到,這里不貼圖。

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

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

6.2我們將需要提交的文件添加到了索引庫中,然后我們需要將這些文件提交到本地倉庫。執行完 git commit 后,再用 git status 查看文件狀態,發現 git add 的那些文件都沒有了。

6.4 將本地倉庫中的文件推送到遠端

git push origin 分支名

如果這個分支是本地新建的,還沒有推送到遠端,用這個命令也可以同時把本地分支提交到遠端,同時提交本地修改。

這時候,你的所有改動就都push到遠端了,你可以在github上看到提交記錄。

7 合并分支

7.1 合并指定分支到當前分支

上面我們在test分支上完成了功能,此時我們需要把test分支修改的東西合并到developer分支上。

  • 我們先切換到developer分支:

      git checkout developer
    
  • 然后 再merge

      git merge 分支名(這里是test)
    

此時,我們就看之前提交到test分支上的內容,在developer分支也能看到了。

7.2 解決沖突再合并

如果沒有沖突,那當然是最好的,但很多時候merge時會有沖突,我們需要先解決沖突再合并。

比如:我現在在test分支上,README文件內容是這樣的:


image

然后我們修改成這樣:

image

此時我們依次執行

git add README.md

git commit -m "修改README"

git checkout developer

git merge test

看結果:

image

README出現conflict了,merge failed。

我們再來看看README內容:

image

吶,<<<<<<<指的是改動之前的內容,======作為分隔符,>>>>>>>指的是改動之后的內容。我們該解決沖突了,這里留下后面改動的,刪掉之前的內容。然后再將修改后的文件重新提交即可。


8. 查看提交記錄

//查看當前分支的提交記錄
git log

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

9. 查看忽略的文件

通常有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或者編譯過程中創建的臨時文件等。我們可以創建一個名為 .gitignore 的文件,列出要忽略的文件模式。android studio創建project時會自動生成一個.gitignore 的文件。

查看忽略文件:

cat .gitignore

如下圖:

image

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

10.關于撤銷

10.1 撤銷工作區的修改

場景一:

我修改了README.md文件,但是還沒有執行 git add,此時,我不想要這些修改了,我要放棄這些修改,也就是回到之前沒有任何修改的狀態。

//放棄單個文件
git checkout 文件名

//放棄全部修改
git checkout .

10.2 撤銷暫存區的修改

場景二:

  1. 接著上面的問題,如果我已經把這些修改的文件都添加到了暫存區中,也就是我執行了git add,但還沒執行 git commit,這時如果想撤銷這些修改,重新放回工作區,可以執行:

    //撤銷某個文件
    git reset HEAD 文件名

    //撤銷全部文件,全部放回工作區
    git reset HEAD

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

    git reset --hard

10.3 撤銷本地倉庫的提交

場景三:

我修改了文件,然后依次執行了 git add ,git commit,但我還沒執行 git push,此時我發現自己提交錯了文件,我想撤銷此次提交,回到上次提交的狀態。可以執行:

git reset --hard HEAD^

我們來實際模擬一下場景。

  1. 用git log看一下提交記錄,我們看到,最近一次提交記錄是“初次提交工程”,再前一次是“test。
image
  1. 然后我們修改README文件,并且提交到本地倉庫,也就是執行git commit -m "修改README--1",如下:
image

再看一下提交記錄:

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

看到了嗎,之前的提交竟然消失了!README內容也回到之前的樣子。

  1. 如果你又想再回到剛才撤銷記錄的狀態,怎么辦?

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

     git reflog
    
image

看到沒,git會記錄你的每一次記錄!在git,是有后悔藥的!!!

11. 比較提交

11.1 比較兩個分支的差異

git diff master..test

11.2 查看當前分支工作區與緩沖區的差異

會詳細列出修改內容

git diff

11.3 查看緩存區和上次提交的差異

顯示你當前的索引和上次提交間的差異(這次git add 和 上次git commit的差異),也是下次提交時要提交的內容(staged,添加到索引中):

git diff --cached

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

11.4 查看當前分支與其他指定分支的差異

git diff 指定分支名

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

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

如果不是查看每個文件的詳細差別,而是統計一下有哪些文件被改動,有多少行被改動,就可以使用‘--stat' 參數。

git diff --stat

如下圖,BuildConfig.java,Manifest.java,R.java,README.md,MainActivity.java這幾個文件被改動。

image

11.6 查看某兩個版本之間的差異

git diff 版本號1 版本號2

11.7 查看某兩個版本的某個文件之間的差異

git diff 版本號1:filename 版本號2:filename

12 把當前目錄變成Git可以管理的倉庫

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

git init

參考:

廖雪峰:Git教程

Git

Git Community Book 中文版

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 初始化配置 #配置使用git倉庫的人員姓名 git config --global user.name "Your...
    賤精先玍丶閱讀 355評論 0 0
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,699評論 9 163
  • 三大區域: 工作區 → 緩存區 → 本地倉庫 一 、 使用 git config 命令進行配置: git ...
    Manchangdx閱讀 2,857評論 0 2
  • 去看新家房子蓋的怎樣了,穿過圍擋時,被鐵皮剌了兩道在大拇指這兒,血慢慢冒出來了。開始沒啥感覺,回走到小區大...
    畫水何音閱讀 284評論 0 0
  • 生活有百般滋味,每種都是自己選擇,不要抱怨,老天對誰都是公平,有因就會有果,怎樣過上自己喜歡的生活,達到幸福的彼岸...
    GfC閱讀 445評論 0 50