面試官都在問 | Linux命令之git

月已滿西樓發表於2020-10-30

Linux命令之git

在這裡插入圖片描述

0.git介紹

git是一款開源的分散式版本管理工具,git的誕生也是相當傳奇的,由Linux之父-Linus Benedict Torvalds開發而來,當初Linus Benedict Torvalds僅僅是為了輔助Linux核心的開發才一併開發了這個至今為止世界上最快的、最簡單的版本管理工具。

在網際網路公司中常常用到git這樣的版本管理工具,所以這篇文章給大家介紹git版本管理工具的簡單用法。一般我們使用git版本工具都有以下需求

  • 克隆遠端倉庫
  • 提交程式碼到遠端倉庫
  • 將遠端倉庫程式碼更新到本地
  • 刪除遠端倉庫檔案

1.工作原理

術語解釋

工作目錄(workspace): workspace的內容是我們本地寫的程式碼或者編輯的檔案,也是最新的;

快取區(index): 又被稱之為暫存區,標記了當前git幫助管理我們本地的哪些程式碼或者檔案;

本地倉庫(local repository): 儲存了物件被提交過的各個版本,比起工作目錄(workspace)和暫存區(index)的內容,它要更舊一些,不能聯網時原生程式碼可先提交至該處;

遠端倉庫(remote repository): 遠端倉庫是本地倉庫的異地備份,遠端倉庫的內容可能被分佈在多個地點的處於協作關係的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內容是最舊的

下面的這張圖片是git版本管理工具的簡單示意圖,

在這裡插入圖片描述

我們稍微瞭解了一點git的術語解釋和看到上圖中git版本控制的原理圖之後,我們發現任何物件都是在工作目錄中誕生和被修改,任何修改都是從進入index區才開始被版本控制的;

2.在碼雲上建立一個遠端倉庫

為了讓大家更加的瞭解git是如何進行版本管理的,所以我們在碼雲上建立一個遠端的倉庫,碼雲和github一樣也是一個基於git的程式碼託管和研發協作的平臺。

2.1 碼雲的地址
https://gitee.com/
2.2 新建倉庫

開啟碼雲之後我們在右上方點選+號,新建倉庫

在這裡插入圖片描述

2.3 填寫建立倉庫選項

在這裡插入圖片描述

2.4 檢視建立的倉庫

如下圖所示,我們擁有了一個“GitTest”的倉庫

在這裡插入圖片描述

3.克隆遠端倉庫

3.1 拷貝遠端倉庫路徑

當我們在碼雲建立好倉庫之後,拷貝遠端倉庫的路徑,如下圖所示:

在這裡插入圖片描述

3.2 使用git clone [url]來拷貝遠端倉庫到本地

第一步:使用git clone https://gitee.com/ann34857/GitTest.git來拷貝遠端倉庫,當看到“done”單詞的時候,表示克隆成功

第二步:使用ls命令檢視克隆效果

第三步:使用ls [遠端倉庫名稱]檢視倉庫內檔案和遠端倉庫是否一致

[Ann@localhost TestGit]$ git clone https://gitee.com/ann34857/GitTest.git
Cloning into 'GitTest'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
[Ann@localhost TestGit]$ ls
GitTest
[Ann@localhost TestGit]$ ls GitTest
README.en.md  README.md

在上面三步的執行結果中,我們不難發現,遠端倉庫GitTest已經被我們克隆到本地,並且在本地建立了一個GitTest的資料夾,在資料夾下,有遠端倉庫在建立時候的“README.en.md”和“README.md”檔案。此時我們就可以在GitTest資料夾下建立和修改我們需要讓git工具幫助我們管理的檔案了,讓我們接著往下看,如何提交到程式碼到遠端倉庫吧。

4.提交程式碼到遠端倉庫

4.1 建立檔案

為了方便大家看到git幫助我們管理程式碼或者其他檔案,我們在"GitTest"檔案下建立"test.cpp"檔案,如下所示:

[Ann@localhost GitTest]$ ls
README.en.md  README.md  test.cpp
[Ann@localhost GitTest]$ cat test.cpp
/*================================================================
*   Copyright (C) 2020 Sangfor Ltd. All rights reserved.
*   
*   檔名稱:test.cpp
*   創 建 者:Ann
*   建立日期:2020年04月27日
*   描    述:
*
================================================================*/

#include <iostream>

int main()
{
    std::cout << "我愛我的祖國" << std::endl;
    return 0;
}

在上面的兩步中,我們先使用ls命令檢視"GitTest"檔案下,檢視我們新建立的"test.cpp"檔案。在使用cat test.cpp命令查詢”test.cpp“檔案當中的內容

4.2 標記檔案

標記檔案是指告訴git管理工具,需要幫助我們管理檔案了,從git的角度來看,是將檔案標記在快取區(index)。也就是我們在“1.工作原理”當中看到的儲存在快取區(index)。

接下來,我們使用git add命令來標記檔案到快取區(index)

[Ann@localhost GitTest]$ git add test.cpp

當我們執行完畢上述命令之後,我們可以使用git status命令檢視提交的結果,如下所示:

[Ann@localhost GitTest]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   test.cpp
#

經過執行命令git status,我們發現“Changes to be committed”就說明當前“test.cpp”為暫存狀態。也就是意味著當前test.cpp已經可以被git版本管理工具管理起來了,接下來,我們就需要將test.cpp檔案提交到本地倉庫了

4.3 提交到本地倉庫

經過上面將檔案標記到暫存區,接下來,我們就需要將檔案提交到本地倉庫當中。提交到本地倉庫當中,我們使用git commit -m "[提交內容日誌]"命令來提交到本地倉庫

[Ann@localhost GitTest]$ git commit -m "測試版本管理工具git"
[master c706528] 測試版本管理工具git
 1 file changed, 17 insertions(+)
 create mode 100644 test.cpp

經過使用git commit -m "[提交內容日誌]"命令,當我們看到“create mode 100644 test.cpp”的時候,我們已經將"test.cpp"檔案提交到了本地倉庫當中,大家注意,到這一步,僅僅是將“test.cpp”檔案提交到本地倉庫,遠端倉庫當中並沒有"test.cpp"檔案。接下來,我們就可以將剛剛提交到本地倉庫的“test.cpp”檔案,提交到遠端倉庫了。

4.4 推送到遠端倉庫

經過上面將檔案提交到本地倉庫之後,接下來,我們就需要將檔案推送到遠端倉庫當中。在我們推送到遠端倉庫的時候,我們使用命令git push origin [分支名稱],而我們在建立倉庫的時候,碼雲已經幫我們建立了一個主分支master了,所以,我們可以直接推送到遠端倉庫的master分支下。當然有主分支的概念,也會有其他分支的概念,老鐵們,可以研究研究。master主分支如下圖所示:

在這裡插入圖片描述

接下來,我們知道推送到master主分支之後,我們使用命令 git push origin master用來將剛剛本地倉庫的內容推送到遠端倉庫

[Ann@localhost GitTest]$ git push origin master 
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 580 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/ann34857/GitTest.git
   96e8c62..c706528  master -> master

當我們看到“Writing objects: 100% (3/3), 580 bytes | 0 bytes/s, done.”,這樣的語句之後,表示我們已經將本地倉庫的內容推送到了遠端倉庫。我們可以開啟碼雲,訪問遠端倉庫,驗證是否已經推送成功。如下圖所示:

在這裡插入圖片描述

接下來我們還可以驗證下“test.cpp”當中檔案內容是否一致,如下圖所示:

在這裡插入圖片描述

從遠端倉庫當中來看,我們不難發現和我們本地檔案內容一致。至此,git提交程式碼到遠端倉庫就為大家介紹到這裡。感興趣的老鐵可以再去研究研究,git的分支是什麼,如何將程式碼提交到不同的分支上。

5.將遠端倉庫程式碼更新到本地

當我們多人協同工作的時候,我們有時候需要將別人修改的檔案內容獲取到自己的本地倉庫當中,這會兒我們就需要將遠端倉庫當中的程式碼更新到自己本地了。

5.1 在碼雲當中修改檔案

在碼雲修改檔案,是為了體現遠端倉庫當中的檔案修改掉了,模擬多人協同工作的場景。我們在瀏覽器當中修改test.cpp檔案,分為4個步驟,如下圖所示:

第一步:點選編輯按鈕

在這裡插入圖片描述

第二步:修改檔案
第三步:提交

在這裡插入圖片描述

在這裡插入圖片描述

第四步:檢視修改的內容

在這裡插入圖片描述

當我們經歷了4個步驟之後,我們已經在"test.cpp"檔案當中增加了一行程式碼“std::cout << “我是在碼雲當中修改的內容” << std::endl;”,此時,在本地倉庫當中,git管理的"test.cpp"檔案並沒有更新掉,所以我們需要手動進行更新。此時本地倉庫當中"test.cpp"原始碼檔案的內容,如下所示:

[wudu@localhost GitTest]$ cat test.cpp
/*================================================================
*   Copyright (C) 2020 Sangfor Ltd. All rights reserved.
*   
*   檔名稱:test.cpp
*   創 建 者:Ann
*   建立日期:2020年04月27日
*   描    述:
*
================================================================*/

#include <iostream>

int main()
{
    std::cout << "我愛我的祖國" << std::endl;
    return 0;
}
5.2 更新原生程式碼

當遠端倉庫當中的test.cpp原始碼修改了以後,我們需要更新本地倉庫的時候,使用git pull origin master命令來進行更新。需要注意的是,同樣我們命令後的“master“也是分支名稱,同樣,我們是從主分支master上面進行更新本地倉庫,如果是其他分支,需要指定其他分支的名稱。老鐵們,可以自己嘗試下。

第一步:更新
[Ann@localhost GitTest]$ git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://gitee.com/ann34857/GitTest
 * branch            master     -> FETCH_HEAD
Updating c706528..3525180
Fast-forward
 test.cpp | 1 +
 1 file changed, 1 insertion(+)

當我們看到了“1 file changed, 1 insertion(+)”語句之後,表示我們更新了本地倉庫,所以使用cat test.cpp驗證檔案內容是否更改掉了,如下所示:

第二步:驗證
[Ann@localhost GitTest]$ cat test.cpp
/*================================================================
*   Copyright (C) 2020 Sangfor Ltd. All rights reserved.
*   
*   檔名稱:test.cpp
*   創 建 者:Ann
*   建立日期:2020年04月27日
*   描    述:
*
================================================================*/

#include <iostream>

int main()
{
    std::cout << "我愛我的祖國" << std::endl;
    std::cout << "我是在碼雲當中修改的內容" << std::endl;
    return 0;
}

通過檢視“test.cpp"檔案當中的內容,我們發現,在“test.cpp”當中已經更新了“std::cout << “我是在碼雲當中修改的內容” << std::endl;”,至此,我們的更新也給大家介紹完畢了;

6.刪除倉庫當中的檔案

我們在工作當中通常會遇到需要將倉庫當中管理的檔案刪除掉,這時候,我們不能直接刪除檔案,而是需要兩個步驟,先刪除本地倉庫檔案,在刪除遠端倉庫檔案。所以下面就給大家介紹,如何刪除本地倉庫的檔案和如何刪除遠端倉庫中的檔案。使用我們當前倉庫當中的"test.cpp"檔案為例,進行演示。

6.1 刪除本地倉庫的檔案
第一步:使用git rm命令同時從工作區(workspace)和快取區(index)中刪除檔案

如下所示:

[Ann@localhost GitTest]$ git rm test.cpp
rm 'test.cpp'
[Ann@localhost GitTest]$ ls
README.en.md  README.md

從上述命令當中我們不難看出來,已經從工作區當中將檔案刪除掉了,現在我們使用git status命令檢視是否存從快取區當中刪除掉了,如下所示:

[wudu@localhost GitTest]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	deleted:    test.cpp
#

當我們看到“deleted: test.cpp”語句的時候,表示已經從快取區(index)當中刪除掉了,並且看到“Changes to be committed:”語句,提示我們需要提交到本地倉庫,所以接下來,我們就提交到本地倉庫當中。

第二步:提交到本地倉庫

當我們已經將工作區(workspace)和快取區(index)當中的檔案刪除掉的時候,接下來我們使用 git commit -m "提交的日誌內容"命令來提交到本地倉庫,如下所示:

[Ann@localhost GitTest]$ git commit -m "delete test.cpp"
[master 9a88e63] delete test.cpp
 1 file changed, 18 deletions(-)
 delete mode 100644 test.cpp

此時,我們也就提交到了本地倉庫,但是老鐵們請注意,但是遠端倉庫當中“test.cpp”並沒有刪掉,如下圖,我們再去檢視碼雲當中遠端倉庫的情況

在這裡插入圖片描述

接下來,我們就刪除下遠端倉庫當中的“test.cpp”檔案,老鐵們,我們繼續往下看。

6.2 刪除遠端倉庫當中的檔案

刪除遠端倉庫的檔案的做法也只需要使用git push origin master命令即可,就可以將剛才刪除本地倉庫的指令推送到遠端倉庫,如下所示:

[Ann@localhost GitTest]$ git push origin master 
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 212 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/ann34857/GitTest.git
   3525180..9a88e63  master -> master

當我們推送完畢之後,再去檢視碼雲上的遠端倉庫,如下圖所示:

在這裡插入圖片描述

通過上面的截圖,我們不難發現,提交的日誌為“delete test.cpp”, 並且我們看不到之前遠端倉庫當中的“test.cpp”檔案了。至此,刪除倉庫當中的檔案操作就介紹完畢了,老鐵們,練習起來吧。

7.總結

git clone [遠端倉庫的url地址]: 克隆遠端倉庫

git add [檔名稱]: 將檔案新增到快取區(index), 其含義就是告訴git,需要幫助我們管理某個檔案了

git commit -m "[日誌內容]": 提交到本地倉庫

git push origin [分支名稱]: 將本地倉庫內容推送到遠端倉庫的某一分支上

git rm [檔名稱] :刪除工作區(workspace)和快取區(index)當中的檔案

git rm -r [資料夾名稱]: 刪除工作區(workspace)和快取區(index)當中的資料夾

git status: 檢視狀態
在這裡插入圖片描述

相關文章