我相信您可以想像版本控製程式碼的重要性,以便我們可以恢復變更恢復遺失的資料以及其他可能性

我打賭你知道有人(不是我呵呵)通過使用越來越有創意的名稱建立文件副本來對其文件進行版本控制...

GIF 模擬具有不同名稱的檔案的複製。範例:文章、文章最終版本等。

在 1972 年之前,隨著SCCS (原始碼控制系統)的發布,這是有史以來第一個集中式版本控制軟體之一,這可能是任何人對其程式碼進行版本控制的方式。

但我們在這裡不是在談論 SCCS,我們現在真正感興趣的是GIT ,這是一款分散式開源版本控制軟體,明年(07/04/2005)將慶祝其誕生 20 週年。

目錄

1.GIT是什麼?

GIT 是一個開源分散式版本控制系統,於 2005 年推出,由 Linus Torvald (Linux 核心建立者)開發。

使用GIT,我們可以在本地**控制專案的版本***(在工作資料夾中)並將所有變更同步到遠端儲存庫(例如在GitHub上)* 。

2.GIT如何運作?

想像一個實體文件櫃,其中有一個包含所有專案文件的資料夾。每當有人需要操作文件時,他們都必須將其拾取,將其從資料夾中刪除,並在完成後將其返回到資料夾中。因此,兩個人不可能處理同一個文件,完全避免了任何可能的衝突。

但這不是 Git 的工作原理! (感謝上帝)

這就是集中式版本控制系統的工作方式,其中使用者需要「簽出」「簽入」文件,即每當有人需要處理特定文件時,他們需要簽出該文件,刪除從儲存庫中獲取文件,然後在工作完成後簽入該文件,並將其返回儲存庫

GIF 模擬集中式版本控制系統的操作。

在像GIT這樣的分散式系統中,多個人可以存取同一個遠端儲存庫中的檔案。每當有人需要操作文件時,他們只需將其克隆***(或克隆整個存儲庫)*到本地計算機,然後將修改發送回遠端存儲庫。這使得多人可以處理同一個專案,甚至操作相同的文件**。

GIF 模擬分散式版本控制系統的操作。

這就是允許大型開源專案的分佈,來自世界不同地區的人們在同一個專案上工作,管理修改和可能的衝突(是的,這裡可能會發生合併衝突)

3.安裝GIT

GIT適用於主要作業系統(Windows、Linux、MacOs...),安裝過程非常簡單,可以透過命令列或透過git-scm.com官方安裝程式完成。

3.1 在 Windows 上

要在 Windows 上安裝 GIT,只需存取官方網站並下載安裝程式即可。然後只需按照說明進行操作,一切都會好起來,然後我們就可以在終端機中使用 GIT 命令了。

3.2 在Linux上

對於Linux,我們可以使用以下命令安裝GIT

sudo apt install git-all

透過這樣做, GIT必須準備好在我們的終端中運作。

3.3 在 MacOS 上

對於 Mac,安裝GIT最簡單的方法是安裝Homebrew ,然後在終端機中執行以下命令

brew install git

然後GIT必須準備好在我們的終端中運作。

4.配置GIT

安裝後,使用以下命令設定 GIT很重要:

git config --global user.name "[username]"
# e.g. John Doe
git config --global user. email "[[email protected]]"
# e.g. [email protected]

此外,也可以透過刪除--global標籤來為某些本機儲存庫配置特定使用者。

5. 啟動本機儲存庫

配置GIT後,我們就可以啟動本地儲存庫了。為此,我們可以從頭開始一個新的儲存庫複製現有的遠端儲存庫

5.1 從頭開始(git init)

要啟動新儲存庫,只需導航到所需的儲存庫根資料夾並執行以下命令:

git init

Linux 終端機執行「git init」命令並顯示結果的螢幕截圖。

透過這樣做,將在專案資料夾內建立一個.git目錄,該目錄將負責此本機儲存庫的工作資料夾中的版本控制

5.2 克隆現有儲存庫(git clone)

克隆現有遠端儲存庫就像從頭開始建立新儲存庫一樣簡單。為此,只需使用git clone命令,將要複製的儲存庫的 URL作為參數傳遞到要複製儲存庫的資料夾中:

複製現有的遠端儲存庫就像從頭開始建立新的儲存庫一樣簡單。為此,只需使用git clone命令,將遠端儲存庫 URL克隆到我們要下載儲存庫的資料夾中:

git clone [repository-url]

Linux 終端機執行「git clone」命令並顯示結果的螢幕截圖。

然後整個存儲庫必須克隆到我們的本地機器並自動連結到相關的遠端存儲庫

有了複製的儲存庫,我們以後就不再需要使用git remote指令了。

6. 使用 GIT

在我們的本機儲存庫中,我們可以建立專案所需的文件,但它們不會由 GIT 自動同步,當有任何變更需要版本控制時,我們需要報告它。

因此,我們可以根據需要操作文件,並在完成所需的變更後將更新的文件傳送到 GIT

為此,重要的是要了解版本控制中有**3 個階段的無限流***(是的,無限)* :

              MODIFY -> STAGE -> COMMIT
  • 修改:版本控制的第一階段,我們在這裡找到與上一個可用版本相比已更改的檔案

  • STAGE:版本控制的第二階段,這是我們放置要新增到下次提交的修改檔案的地方。

  • COMMIT:版本控制的最後階段,當我們確認變更時,將階段中修改的檔案傳送到本機儲存庫。

提交修改後的文件後,我們在本地存儲庫中有一個可用的新版本,它可以再次接收更新,再次“修改” ,然後放入“階段” ,並再次“提交” ,確認較新的版本版本等等(因此,「無限」哈哈)

值得注意的是,提交不會覆蓋已修改文件的舊版本,而是包含新版本以及指向最後版本的指針,從而追蹤 GIT 追蹤的每個文件的版本。

6.1 新增和提交(git add 和 git commit)

儘管聽起來很複雜,但執行版本控制流程非常簡單。由於所需的修改已完成,我們使用以下命令新增要在舞台上提交的修改後的檔案

git add [filename]

git add -A -> 將所有修改的檔案立即加入階段。

git add *.[extensão-do-arquivo] -> 將所有具有指定檔案副檔名的已修改檔案一次新增至暫存區(例如git add *.html

我們可以隨時使用git status指令檢查目前本機儲存庫狀態

Linux 終端機執行「git status」命令並顯示結果的螢幕截圖。

請注意,當我們在建立新檔案後在儲存庫中執行git status時,新檔案將顯示為「Untracked」 。這意味著該文件是全新的,仍然需要加入到任何提交中才能被GIT追蹤

可以讓 GIT 忽略儲存庫中的特定檔案或資料夾。為此,我們只需將一個名為.gitignore的檔案新增到根資料夾中,並在其中寫入應忽略的檔案或資料夾的名稱。

注意:被忽略的檔案和資料夾將不再出現在 GIT 軌道上,甚至不會顯示為「未追蹤」。要重置跟踪,只需從.gitignore文件中刪除所需的名稱即可。

要包含文件,我們可以使用要新增的文件的名稱來執行git add命令(在本例中為「index.html」)

Linux 終端機的螢幕截圖,執行命令“git add”,然後執行“git status”,顯示結果。

這樣,透過重新執行git status我們可以看到新檔案已新增至「stage」 ,並最終準備好在下一次提交中發送,這可以使用以下命令完成:

git commit -m "[descriptive-message]"

提交具有唯一的 ID(雜湊碼)並且是IMMUTABLE 的,即一旦確認就無法修改。

git commit -a -> 執行直接提交,將所有修改的檔案新增至暫存區並提交它們。

成功提交檔案後,執行git status時,我們注意到沒有更多修改的檔案需要上傳,因為所有修改都已在上次提交時有效保存在我們的本機儲存庫中。

Linux 終端機的螢幕截圖,執行指令“git commit”,然後執行“git status”,顯示結果。

此外,還可以使用git log指令查看儲存庫的提交日誌來驗證所做的更改,該指令顯示所有提交的一些元資料,例如雜湊碼、分支、作者、日期等。

Linux 終端機執行命令「git log」並顯示結果的螢幕截圖。

可以重複整個過程來加入我們專案所需的新文件,修改它們並透過進行新的提交將它們發送到本地儲存庫。

GIF 模擬 GIT 分支中的多次提交。

git log -N -> 顯示最近 N 次提交的日誌。

git log [branch-A] [branch-B] -> 顯示「branch-B」中但不在「branch-A」中的提交日誌。

git log --follow [filename] -> 顯示更改指定檔案的提交日誌,即使它已更改名稱。

git diff -> 列出與儲存庫中最新可用版本相比所做的變更。

git diff [nome-do-arquivo] -> 列出對指定檔案相對於儲存庫中最後一個可用版本所做的變更。

6.2 撤銷提交前後的更改

在提交之前,對本地存儲庫所做的任何更改都可以撤消或更改,但一旦提交,就無法更改。這是因為提交是不可變的物件,這意味著不可能編輯或更改提交中的資料。

但是,可以進行新的提交來撤銷更改,或更正先前提交中的不正確資訊。無論哪種方式,我們都可以使用以下命令之一:

git checkout -- [filename]
# Discards changes made to the local file before the commit (irreversible action)
git reset --hard HEAD
# Discards changes made to a file that is in stage (before the commit)
git reset --hard HEAD~1
# Discards the last commit made in the local repository (only the last commit)
git commit --amend
# Creates a new commit, replacing the last commit made in the local repository
git revert [commit-hash]
# Creates a new commit, reverting the changes of the specified commit

7. 認識分支

分支只不過是儲存庫的一個分支,到目前為止,所有操作都已在分支master/main'上執行。

預設情況下,儲存庫中建立的第一個分支是master/main ,它是儲存庫的主分支。

7.1 為什麼要使用分支?

乍看之下似乎沒什麼,但分店卻為專案的發展賦予了巨大的力量

想像一下,我們正在開發一個 Web 平台,並且想要測試一項新功能,但我們的儲存庫已經託管或與其他人共享,任何有問題的更改都可能會給他們帶來糟糕的體驗。我們可以做什麼?

如果您一直在考慮複製並貼上專案資料夾,建立一個新的「測試版本」 ,那麼您是對的!嗯,差不多…

透過 GIT,我們可以對分支做類似的事情。由於它們是分支,我們可以簡單地建立一個名為「test」的新分支,從而在完全隔離的分支中擁有我們專案的一個版本,準備好進行翻轉,而不會危及主分支

GIF 模擬使用新提交建立新分支。

7.2 建立分支(git分支)

建立分支意味著建立可以獨立工作的儲存庫的並行副本,而不會影響master/main分支。為此,我們只需執行以下命令:

git branch [branch-name]

在沒有特定分支名稱的情況下執行git branch指令必須顯示儲存庫中可用分支的列表,並用「*」標記目前正在使用的分支。

在執行git branch test指令之前, git branch指令只會傳回master分支。

Linux 終端機執行「gitbranch」命令、建立新分支並顯示結果的螢幕截圖。

建立新分支後,我們可以執行以下命令在可用分支之間切換:

git checkout [branch-name]

執行git checkout test指令後,我們可以看到活動分支已切換。從那一刻起,所有提交的資訊都會傳送到儲存庫的test分支,而不會影響分支master/main

Linux 終端機執行「git checkout」命令、切換活動分支並顯示結果的螢幕截圖。

可以根據需要建立任意數量的分支,並且我們可以使用以下命令與現有分支進行互動:

git checkout -b [branch-name] -> 使用給定名稱建立一個新分支並直接切換到它。

git branch -d [branch-name] -> 刪除指定分支。

git branch -m [new-name] -> 將目前分支的名稱變更為給定名稱。

7.3 合併分支(git merge)

當完成不同分支上的工作,並且我們確定所做的更改不會在專案中引起任何問題時,我們可以將當前分支合併master/main分支中,應用當前分支中的所有更改分支到儲存庫的主分支

合併分支,我們需要切換到將接收更改的分支並執行以下命令:

git merge [branch-name]
# Merge the given branch into the active branch

在這裡,由於我們位於分支test上,因此我們應該使用git checkout命令切換到分支master ,然後使用我們要合併的分支的名稱(在本例中為“test”)執行git merge命令。

Linux 終端機的螢幕截圖,執行命令“git checkout”,切換到 master 分支,然後“git merge”,顯示結果。

透過這樣做,在分支test上完成的所有工作(在本例中為style.css檔案的建立)將合併到分支master中。

模擬兩個分支之間的合併過程的 GIF。

7.4 合併衝突

如果在同一行上更改了一個或多個檔案並且合併無法自動完成,則使用git merge合併不同分支可能會導致一些衝突

執行「git merge」命令的 Linux 終端機的螢幕截圖,該命令傳回衝突警告。

出現這種情況時,我們可以執行git status指令來檢查哪些檔案有衝突。

出現合併衝突警報後執行「git status」指令的 Linux 終端機的螢幕截圖。

在繼續合併之前,我們需要解決衝突,方法是定義應該進行哪些更改,或檢查更改以使它們相互相容。為此, GIT 將在衝突文件中插入標記以協助解決問題。

在文字編輯器中開啟的衝突檔案的螢幕截圖,顯示了 GIT 建立的用於幫助解決衝突的標記。

解決衝突後,我們只需要將修改過的檔案放回舞台,提交新的無衝突版本,然後再次執行git merge指令,這一定會成功合併,沒有任何問題。

8. 與遠端倉庫同步

我們已經知道可以將本地存儲庫連接到遠端存儲庫並遠端同步我們的所有工作,使其保持最新

為此,我們需要執行git push命令,該命令將所有提交從本地存儲庫發送到遠端存儲庫,但首先我們需要**配置遠端存儲庫。

8.1 配置遠端倉庫

啟動遠端儲存庫非常簡單。這裡我們將使用GitHub來完成它。

首先,我們需要在 GitHub 帳戶中**啟動一個新的空白儲存庫***(只需選擇一個名稱並點擊「建立儲存庫」)* :

GitHub 上儲存庫建立頁面的螢幕截圖。

接下來,我們需要透過在本機儲存庫中執行以下命令來配置遠端儲存庫和本機儲存庫之間的關係

git remote add origin [remote-repository-url]

Linux 終端機執行「git Remote」命令並顯示結果的螢幕截圖。

git remote -v -> 顯示實際連接到本機儲存庫的遠端儲存庫的 URL。

正確連接遠端儲存庫後,我們需要使用指令git branch -m main將本機分支master/main的名稱變更為「main」 (如果您的本機分支已稱為main ,請忽略此步驟)

Linux 終端機執行「gitbranch」指令、將「master」分支重新命名為「main」並顯示結果的螢幕截圖。

保持本機儲存庫的主分支與我們要推送到的遠端儲存庫的主分支同名非常重要。

最後,完成上述步驟後,我們可以使用以下命令首次將本機儲存庫與遠端儲存庫同步

git push -u origin main

執行「git push」命令的 Linux 終端機的螢幕截圖,該命令需要 GitHub 身份驗證。

當我們執行git push -u origin main指令時,我們可能需要輸入**GitHub 憑證***(使用者和存取權杖)* 。

如果您不知道GitHub 存取令牌是什麼,或者您沒有設定存取令牌, 請按一下此處

我們也可以透過使用 GitHub CLI 設定身份驗證來解決此問題。 按此處了解具體方法。

經過身份驗證後, git push應該會成功執行,將本地儲存庫中的所有提交與遠端儲存庫同步。

Linux 終端機的螢幕截圖,顯示 GitHub 驗證後繼續執行「git Push」命令。

收到帶有新檔案的「git Push」後 GitHub 上的遠端儲存庫的螢幕截圖。

8.2 第一次後的Git推送(git推送)

完成上述所有步驟後,可以單獨使用git push指令完成新同步,無需任何其他參數,如下所示。

Linux 終端機執行「git status」、「git commit」和「git Push」命令、執行新提交並將更新推送到遠端儲存庫的螢幕截圖。

收到新更新後 GitHub 上的遠端儲存庫的螢幕截圖。

在這種情況下,使用GitHub CLI繞過了執行命令git push所需的身份驗證。您可以點擊此處了解具體方法。

8.3 更新本地倉庫(git pull)

使用分散式遠端儲存庫,可以遠端進行更改(直接在遠端儲存庫中) ,從而導致我們的本機儲存庫變得過時

考慮到這一點,更新本機儲存庫並同步我們在遠端儲存庫中獲得的任何變更非常重要,以確保本機專案始終具有遠端儲存庫中可用的最新版本。為此,我們可以執行以下命令:

git pull

想像一下,一個新檔案README.md直接在我們的遠端儲存庫中建立,因此我們的本機儲存庫現已過時。

遠端儲存庫的螢幕截圖,其中遠端新增了新的 README.md 檔案。

在本機儲存庫中,我們可以使用上面提到的git pull同步遠端儲存庫中的變更。

Linux 終端機執行「git pull」命令的螢幕截圖,使用遠端儲存庫中的新變更更新本機儲存庫。

當我們執行git pull指令時回傳的前 7 行是git fetch指令的回傳。換句話說,如果我們執行git pull命令而不先執行git fetch命令,GIT 將同時執行這兩個命令以從遠端存儲庫檢索更新並將其同步到本地存儲庫。

git fetch -> 從遠端儲存庫取得更新,但不同步本機儲存庫(需要git pull )。

9. 結論

這一切讓我們確信GIT是程式設計師日常生活中必備的版本控制系統,了解它的主要指令和用途可以成為我們技術資歷的轉捩點。最後,隨著本地和遠端儲存庫的同步和更新,以及我們迄今為止所學到的一切,我們已經準備好繼續推進這個令人敬畏的版本控制系統的實用性。

10. 參考文獻


原文出處:https://dev.to/reenatoteixeira/everything-that-you-need-to-know-about-git-2440


共有 0 則留言