Git入門篇:常用命令以及遠程倉庫使用

2021-02-20 一號程式設計師
為什麼用Git

要把文檔還原到編輯前的狀態,大家都是怎麼做的呢?

最簡單的方法就是先備份編輯前的文檔。使用這個方法時,我們通常都會在備份的文檔名或目錄名上添加編輯的日期。但是,每次編輯文檔都要事先複製,這樣非常麻煩,也很容易出錯。


再加上,如果像上圖那樣毫無命名規則的話,就無法區分哪一個文檔是最新的了。而且,如果是共享文件的話,應該加上編輯者的名字。還有,那些文檔名字沒有體現修改內容。

另外,如果兩個人同時編輯某個共享文件,先進行編輯的人所做的修改內容會被覆蓋,相信大家都有這樣的經歷。


Git版本管理系統就是為了解決這些問題應運而生的。

使用Git進行版本管理

Git是一個分布式版本管理系統,是為了更好地管理Linux內核開發而創立的。

Git可以在任何時間點,把文檔的狀態作為更新記錄保存起來。因此可以把編輯過的文檔復原到以前的狀態,也可以顯示編輯前後的內容差異。

而且,編輯舊文件後,試圖覆蓋較新的文件的時候(即上傳文件到伺服器時),系統會發出警告,因此可以避免在無意中覆蓋了他人的編輯內容。


用Git管理文件的話,更新的歷史會保存在Git,所以,不需要備份文件,非常的方便。


安裝Git

首先下載你的系統的Git客戶端

Git下載地址

這裡以Windows舉例, 下載之後, 雙擊安裝即可

安裝完成之後請執行 version命令,如果顯示Git的版本就說明安裝成功了。

git --version

管理歷史記錄的倉庫

倉庫 (Repository)是記錄文件或目錄狀態的地方,存儲著內容修改的歷史記錄。在倉庫的管理下,把文件和目錄修改的歷史記錄放在對應的目錄下。


遠程倉庫和本地倉庫

首先,Git的倉庫分為遠程倉庫和本地倉庫的兩種。

遠程倉庫:

配有專用的伺服器,為了多人共享而建立的倉庫。

本地倉庫:

為了方便用戶個人使用,在自己的機器上配置的倉庫。

倉庫分為遠程和本地兩種。平時用手頭上的機器在本地倉庫上操作就可以了。如果想要公開在本地倉庫中修改的內容,把內容上傳到遠程倉庫就可以了。另外,通過遠程倉庫還可以取得其他人修改的內容。


創建倉庫

創建本地倉庫的方法有兩種:一種是創建全新的倉庫,另一種是複製遠程倉庫。

接下來要在本地新建倉庫,創建一個名稱為「demo」的空目錄,並把它放在Git管理之下。

下面將以這個目錄進行教程講解。

首先在任意一個地方創建demo目錄。然後使用init命令把該demo目錄移動到本地Git倉庫。

按照以下步驟把新創建的demo目錄設置到Git倉庫

桌面空白處右鍵打開 Git Bash, 執行命令:(git命令與linux命令基本相同)

$ mkdir demo
$ cd demo
$ git init

工作樹和索引

在Git管理下,大家實際操作的目錄被稱為工作樹。

在倉庫和工作樹之間有索引,索引是為了向倉庫提交作準備的區域。


Git在執行提交的時候,不是直接將工作樹的狀態保存到倉庫,而是將設置在中間索引區域的狀態保存到倉庫。因此,要提交文件,首先需要把文件加入到索引區域中。

所以,憑藉中間的索引,可以避免工作樹中不必要的文件提交,還可以將文件修改內容的一部分加入索引區域並提交。

一些開始的設定

安裝Git之後,請輸入您的用戶名和電子郵件地址。該設置操作在安裝Git後進行一次就夠了。這些信息將作為提交者信息顯示在更新歷史中。

Git的設定被存放在當前登陸用戶目錄的.gitconfig檔案裡。雖然可以直接編輯配置文件,但在這個教程裡我們使用config命令。

受國內網絡影響, Github 訪問並不是很理想, 這裡使用國內的遠程git倉庫 ,註冊 碼雲 倉庫帳號

$ git config --global user.name "你的用戶名"
$ git config --global user.email "你的電子郵件"

提交文件

在demo目錄新建一個文件,然後將文件添加到倉庫。

首先在demo目錄裡新建一個名為「a.txt」的文本文件,請在文件中輸入以下的內容:

學習Git

請使用status命令確認工作樹和索引的狀態。

$ git status

執行status命令以確認demo目錄的狀態。

$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#     a.txt
nothing added to commit but untracked files present (use "git add" to track)

從status響應我們可以看到a.txt目前不是歷史記錄對象。請首先把a.txt這個文件加入到索引,就可以追蹤它的變更了。

現在,我們把a.txt加入到索引然後確認一下。

$ git add a.txt
查看狀態
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#     new file:   a.txt
#

將文件加入到索引,要使用add命令。在<file>指定加入索引的文件。用空格分割可以指定多個文件。

$ git add <file>..

指定參數「./」,可以把所有的文件加入到索引。

$ git add ./


既然a.txt已加入到索引,我們就可以提交文件了。

請執行如下顯示的commit命令(為之前添加的a.txt添加上傳描述)。

$ git commit -m "first commint"

-m 參數為提交的說明, 建議不為空

執行commit命令之後確認狀態。

# 剛才添加的命令
$ git commit -m "first commit"
[master (root-commit) 116a286] first commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a.txt

# 查看狀態
$ git status
# On branch master
nothing to commit (working directory clean)

從status響應我們可以看到沒有新的變更要提交。

使用log命令,我們可以在倉庫的提交記錄看到新的提交。

$ git log

push到遠程倉庫

前面我們為大家介紹了本地倉庫的基本使用方法。下面,我們接著為大家講解如何在遠程倉庫上共享本地倉庫的修改記錄。

推送

為了將本地倉庫的修改記錄共享到遠程倉庫,必須上傳本地倉庫中存儲的修改記錄。

為此,需要在Git執行推送(Push)操作。執行Push之後,本地的修改記錄會被上傳到遠程倉庫。所以遠程倉庫的修改記錄就會和本地倉庫的修改記錄保持同步。

建立遠程倉庫

受國內網絡影響, Github 訪問並不是很理想, 這裡使用國內的遠程倉庫

註冊 碼雲 帳號, 並創建一個倉庫, 名字為 demo:

輸入名字後,可以直接提交。

添加成功之後, 這裡可以看遠程倉庫的地址:

推送到遠程倉庫

我們試試推送在之前創建的本地倉庫吧。

向遠程倉庫推送本地倉庫的修改記錄吧。

您可以給遠程倉庫取一個別名。這樣,下次推送的時候就不需要輸入長串的遠程倉庫地址了。在這個教程裡,我們的遠程倉庫命名為「origin」。

請使用remote指令添加遠程倉庫。輸入遠程倉庫名稱,指定遠程倉庫的URL。

$ git remote add 你的倉庫名 你的倉庫url地址

通過運行以下指令,將創建於上一個頁面的遠程倉庫的URL命名為「origin」。

$ git remote add origin https://gitee.com/12356/demo.git

url 可以在遠程倉庫的控制面板獲取

執行推送或者拉取的時候,如果省略了遠程倉庫的名稱,則默認使用名為」origin「的遠程倉庫。因此一般都會把遠程倉庫命名為origin。

使用push命令向倉庫推送更改內容。

輸入目標地址,指定推送的分支(我們將在高級篇詳細地對分支進行說明。):

$ git push <庫名> <分支>...

運行以下命令便可向遠程倉庫『origin』進行推送。當執行命令時,如果您指定了-u選項,那麼下一次推送時就可以省略分支名稱了。但是,首次運行指令向空的遠程倉庫推送時,必須指定遠程倉庫名稱和分支名稱。

當被要求輸入用戶名和密碼,請使用您的碼雲的用戶名和密碼。

$ git push -u origin master
Username: <用戶名>
Password: <密碼>
Counting objects: 3, done.
Writing objects: 100% (3/3), 245 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitee.com/123123/demo.git
* [new branch]     master -> master

如果使用公鑰認證, 就不用再輸入密碼了, 高級篇會講到

請打開碼雲的Git頁面。刷新頁面就可以看到剛剛推送到遠程倉庫的項目。

為什麼要克隆

如果遠程倉庫中有他人的修改記錄,那麼把它完整地複製下來您就可以接著進行工作了。

或者您要在別人的基礎上, 繼續開發項目, 都可以從遠程倉庫克隆一份代碼到本地

進行克隆(Clone)操作就可以複製遠程倉庫。

執行克隆後,遠程倉庫的全部內容都會被下載。之後您在另一臺機器的本地倉庫上進行操作。

克隆後的本地倉庫的變更履歷也會被複製,所以可以像原始的倉庫一樣進行查看記錄或其他操作。

開始克隆

假設您是其中一位團隊成員,把現有的遠程倉庫克隆到另一個目錄( demo2 )。

使用clone指令可以複製倉庫,在<repository>指定遠程倉庫的URL,在<directory>指定新目錄的名稱。

$ git clone <repository> <directory>

執行以下指令後,會在目錄(demo2) 複製遠程倉庫。

$ git clone https://gitee.com/123123/demo.git demo2
Cloning into 'demo2'...
Username: <用戶名>
Password: <密碼>
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

若要驗證克隆是否成功,請看在複製的目錄「demo2」中的a.txt是否含有以下文字。

學習Git

從克隆的倉庫進行push

cd到demo2進行的操作

首先,在克隆的倉庫目錄裡的a.txt文件裡添加一行文字(方便我們辨認),並保存。

學習Git
add 把變更錄入到索引中

添加到索引區, 並提交到本地倉庫:

$ git add a.txt
$ git commit -m "添加add的說明"
[master 1ef5c8c] 添加add的說明
1 files changed, 1 insertions(+), 1 deletions(-)

然後,推送此次變更,更新遠程倉庫。

當在克隆的倉庫目錄執行推送時,您可以省略倉庫和分支名稱。

$ git push
Username: <用戶名>
Password: <密碼>
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 351 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitee.com/liuwantao/demo.git
  486789c..1ef5c8c master -> master

訪問碼雲 demo 倉庫的首頁, 刷新頁面就可以看到推送的更新

從遠程倉庫pull

若是共享的遠程倉庫由多人同時作業,那麼作業完畢後所有人都要把修改的內容推送到遠程倉庫。然後,自己的本地倉庫也需要更新其他人推送的變更內容。

pull

進行拉取(Pull) 操作就可以把遠程倉庫的內容更新到本地倉庫。

進行拉取(Pull) 操作,就是從遠程倉庫下載最近的變更日誌,並覆蓋自己本地倉庫的相關內容。

我們把在上一節中從「demo2」推送到遠程倉庫的內容拉取到倉庫目錄「demo」吧。

使用pull指令進行拉取操作。省略倉庫名稱的話,會在名為origin的倉庫進行pull。


命令格式:

$ git pull <庫名> <分支名>...

用demo進行的操作

cd到一開始的demo目錄,執行以下指令:

$ git pull origin master
Username: <用戶名>
Password: <密碼>
From https://gitee.com/liuwantao/demo.git
* branch           master     -> FETCH_HEAD
Updating ac56e47..3da09c1
Fast-forward
a.txt |   1 +
1 files changed, 1 insertions(+), 0 deletions(-)

a.txt文檔的內容已更新。

合併修改記錄


在執行pull之後,進行下一次push之前,如果其他人進行了推送內容到遠程倉庫的話,那麼你的push將被拒絕。


這種情況下,在讀取別人push的變更並進行合併操作之前,你的push都將被拒絕。這是因為,如果不進行合併就試圖覆蓋已有的變更記錄的話,其他人push的變更(圖中的提交C)就會丟失。

合併的時候,Git會自動合併已有的變更點!不過,也存在不能自動合併的情況。在下一節頁面,我們會為大家介紹手動合併的方法!這一節, 先看一下衝突的情況

push衝突的狀態

現在,我們將要學習怎樣解決衝突。首先,我們用「demo」和「demo2」製造一個衝突狀態。

用demo2進行的操作

接下來,打開demo2目錄的a.txt文檔,添加一行文字之後進行提交。

學習Git
add 把變更錄入到索引中
pull 取得遠端倉庫的內容

$ git add a.txt
$ git commit -m "添加pull的說明"
[master 4c01823] 添加pull的說明
1 files changed, 1 insertions(+), 0 deletions(-)

現在從demo2 推送內容到遠程倉庫。

 $ git push
Username: <用戶名>
Password: <密碼>
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 391 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitee.com/liuwantao/demo.git
  3da09c1..4c01823 master -> master

在目前的遠程倉庫,"a.txt"文檔已包含第三行內容「pull 取得遠端倉庫的內容」,並且已被存儲到歷史記錄中啦。

用demo進行的操作

首先,打開demo目錄的a.txt文檔,添加一行文字之後進行提交。

學習Git
add 把變更錄入到索引中
commit 記錄索引的狀態

$ git add a.txt
$ git commit -m "添加commit的說明"
[master 95f15c9] 添加commit的說明
1 files changed, 1 insertions(+), 0 deletions(-)

現在從demo推送內容到遠程倉庫吧。

 $ git push
Username: <用戶名>
Password: <密碼>
To https://gitee.com/liuwantao/demo.git
! [rejected]       master -> master (non-fast-forward)
error: failed to push some refs to 'https://gitee.com/liuwantao/demo.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.

看到吧,發生了錯誤,推送被拒絕(rejected)了。

下一節, 來看一下如何解決衝突吧

解決衝突

在上一個節我們提及到,執行合併即可自動合併Git修改的部分。但是,也存在無法自動合併的情況。

如果遠程倉庫和本地倉庫的同一個地方都發生了修改的情況下,因為無法自動判斷要選用哪一個修改,所以就會發生衝突。

Git會在發生衝突的地方修改文件的內容,如下圖。所以我們需要手動修正衝突。


==分割線上方是本地倉庫的內容,下方是遠程倉庫的編輯內容。

如下圖所示,修正所有衝突的地方之後,執行提交。

解決demo與demo2的衝突

用demo進行的操作

cd在demo執行以下指令,讓git修改我們的衝突文件 (a.txt)。

$ git pull origin master
Username: <用戶名>
Password: <密碼>
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://gitee.com/liuwantao/demo.git
* branch           master     -> FETCH_HEAD
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

顯示合併時發生衝突的訊息。

訊息顯示「Merge conflict in a.txt」。我們看到Git已添加標示以顯示衝突部分。請為Git無法完成主動合併的部分做以下的修改。

打開a.txt:

## 衝突情況
學習Git
add 把變更錄入到索引中
<<<<<<< HEAD
commit 記錄索引的狀態
=======
pull 取得遠端倉庫的內容
>>>>>>> 4c0182374230cd6eaa93b30049ef2386264fe12a

導入兩方的修改,並刪除多餘的標示行以解決衝突。

## 修改後的
學習Git
add 把變更錄入到索引中
commit 記錄索引的狀態
pull 取得遠端倉庫的內容

文件的內容發生了修改,所以需要進行提交。

$ git add a.txt
$ git commit -m "合併"
[master d845b81] 合併

這樣就完成了從遠程倉庫導入最新的修改內容。

我們可以用log命令來確認倉庫的歷史記錄是否準確。指定--graph選項,能以文本形式顯示更新記錄的流程圖。指定--oneline選項,能在一行中顯示提交的信息。

$ git log --graph --oneline
*   d845b81 合併
|\
| * 4c01823 添加pull的說明
* | 95f15c9 添加commit的說明
|/
* 3da09c1 添加add的說明
* ac56e47 first commit

這表明兩個修改記錄已經整合了。

這時候,之前被拒絕的push應該可以通過了,push一下看看吧。

相關焦點

  • 程式設計師值得收藏的Git常用命令與操作,這篇足夠了!
    初始倉庫常用命令1,git init:Git是使用git init命令來初始化一個Git倉庫的,安裝完Git時第一個使用命令就是Git init命令。2,git clone:使用該命令的時候,是從Git倉庫拷貝項目,常見的是我們經常去GitHub下載開源項目,就相當克隆項目到本地,正確使用命令格式是git clone <repo> <dirrectory>,repo表示Git倉庫,directory表示本地目錄。
  • 跟蹤多個 Git 遠程倉庫
    擁有一致的命名標準是保持本地和上遊 Git 倉庫保持一致的關鍵。當本地 Git 倉庫的命名與遠程倉庫不一致時,與遠程倉庫協作就會變得很混亂。3、在你的開發系統中,使用你複製的 URI 克隆倉庫:$ git clone git@example.
  • 玩轉Git就這麼簡單!這些常用命令你確定都用過嗎?
    >git init # 初始化倉庫,生成.git目錄git add <file> # 添加文件到暫存區git commit -m"<message>" # 將暫存區的內容添加到本地倉庫中Git常用命令:創建倉庫git init初始化倉庫git
  • Git基礎知識總結
    常用命令# 名稱 git config --global user.name username # 帳號 git congiggit add filepath/* # 刪除指定目錄以及目錄下的所有文件和子目錄 git rm -r filepath/ # 提交 git commit -m "提交注釋" # 拉取遠程分支代碼 git pull
  • 重要的或許你也不知道的Git命令
    學習git命令使每個開發者感到一定的害怕,哪怕你使用linux系統多年,面對相識與Git命令依然不知錯誤。Git有很常用的命令,需要我們耐心細節的學習。網上也有很多的使用Git文檔提供我們學習,但是我們會發現很多文檔都是比較亂,內容也是很多,我們下面介紹幾個重要且鮮為人知的Git命令,或許能幫助到你快速掌握Git命令。第一,快速查找分支。
  • git的幾種實用操作(合併代碼與暫存-復原工作修改)
    本文轉載自【微信公眾號:羽林君,ID:Conscience_Remains】,經微信公眾號授權轉載,如需轉載與原文作者聯繫總述git工具也用了很久,自己也寫了幾篇使用教程,今天繼續給大家分享一些我工作中使用過的
  • Git使用全解
    這一過程可以通過軟體來搞,也可以通過命令行來執行執行的命令種類就叫做git電腦端的桌面應用,本質上就是一個git命令的可視化執行命令軟體在底層也是運行了git 命令所以只要能夠找到命令行,並且安裝git環境就可以實現在任何地方使用git管理甚至是手機通過git可以將手機與電腦的項目完美同步再搭配一些手機端的IDE就可以實現無電腦化的優雅寫代碼/搞工程由於git命令在不同設備都一樣
  • 部分克隆實現Git大文件倉庫的優雅管理
    git-annex 採用 Haskell Script 編寫,允許映射Git資料庫到文件,幫助用戶管理Git倉庫的文件,git-annex的設計中大文件是獨立於Git倉庫中保存的,在git倉庫中只保存文件名和文件元數據等信息用來實現大文件追蹤。
  • Git入門實戰教程
    git 初始化任意選擇一個文件夾,本文選擇新建一個文件夾。使用git init創建一個空的Git倉庫或重新初始化一個已存在的倉庫。git add通過這個命令將文件放入暫存區。git commit通過這個命令將文件放入對象區。
  • git解決衝突操作 - CSDN
    安裝客戶端後在桌面任意空白處右擊打開Git Base Here然後輸入下面命令打開本地git bash,使用如下命令生成ssh公鑰和私鑰對ssh-keygen empty Git repository in C:/Users/userAccount/Desktop/test/.git/ps:目錄下會自動生成.git,誤刪,畢竟全靠它做版本管理第一步,用命令git add告訴Git,把文件添加到倉庫:$ git add readme.txt
  • 工作流一目了然,看小姐姐用動圖展示10大Git命令
    如果你還有些分不清楚,那千萬不能錯過這篇文章。在本文中,熟知 JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker 和 Golang 的 21 歲年輕軟體顧問 Lydia Hallie 通過動圖形式直觀地介紹了這些常用 git 命令的工作過程,包你過目不忘。
  • 從工作到現在Git操作總結
    Git常用命令git四連git add .將所有改動放進暫存區git commit -m "描述" 提交並附帶概要信息git pull 從遠程倉庫拉去代碼git push 推送代碼到遠程倉庫(master
  • 我到底應該用git-merge還是git-rebase呢?
    本文一共3165字,將通俗的解釋git中兩種合併策略——merge和rebase的不同、運用方式和使用的場景,並輔以我在工作中的運用來介紹;什麼是git merge?它有以下兩種用途:更新代碼時,整合另一個代碼倉庫中的變化,也就是git pull命令中,我們使用git pull命令時,實際上相當於git fetch+git merge,進行了遠程倉庫代碼的拉取,以及整合另一代碼倉庫中的變化用於從一個分支到另一個分支的合併
  • 程式設計師需要了解的8種Git技術
    可以通過運行以下命令來檢查存儲庫中的遠程伺服器列表:git remove -v要添加遙控器,可以使用以下git remote add命令:git remote add remote_name remote_address
  • 這7個常用Git命令或概念你都知道嗎?
    以「; 」(分號)分隔的多個git命令以分號分隔可使用多個Git命令:$ git --version; git branch // separated by semi-colon2.git別名命令命令別名能提高可重用性
  • 詳解如何使用Angular規範來統一多人的git提交記錄
    前言程式設計師在開發完代碼後都需要向代碼倉庫提交代碼,通常我們會使用下面的Git命令git commit -m '此次代碼的說明'但是很多時候我們都沒有一個統一的約定去規範commit描述,這就導致提交的歷史信息不能被很好查閱而且也不容易辨認commit信息與代碼變動之間的聯繫。這篇文章我們聊一下Augular提交規範。
  • git fetch & pull詳解
    而git pull 則是將遠程主機的最新內容拉下來後直接合併,即:git pull = git fetch + git merge,這樣可能會產生衝突,需要手動解決。下面我們來詳細了解一下git fetch 和git pull 的用法。
  • git的幾個常用基本操作
    答案是,使用 checkout命令:$ git checkout a.txtUpdated 1 path from the index$ git statusOn branch masterChanges to be committed: new file: a.txt new file:
  • 前端面試題:git reset、git revert 和 git checkout 有什麼區別
    Web前端面試題解析:這個問題同樣也需要先了解 git 倉庫的三個組成部分:作區(Working Directory)、三個區的轉換關係以及轉換所使的命令如下圖git reset、git revert 和 git checkout的共同點:來撤銷代碼倉庫中的某些更改。
  • Git代碼託管,如何選擇和使用,關鍵點都在這了
    Git是常用代碼管理工具,使用簡單,幫助高效管理代碼,提高團隊協作效率。一,常用代碼託管服務1,GithubGithub應該是最常用的代碼託管網站了,各項功能完善,2018年6月被微軟收購後,逐步開放私有庫免費使用,沒有數量、容量和人數限制。