使用VSCode便捷實現Git進階功能!(包含同一專案配置多個遠端Git倉庫解決方案) ╰( ´・ω・)つ──☆✿✿✿ 專案協同

O尋覓O發表於2020-12-25

介紹

本部落格主要面向一些已經使用過Git的使用者,對一些基礎操作預設(拉去、推送、衝突解決)預設使用者已經掌握。如果你對Git一無所知可以先看一下我的Git入門部落格,裡面詳細介紹了Git如何安裝,建立倉庫,拉去,推送,還有利用VSCode視覺化對Git的拉去推送等基礎操作。

元件推薦

VSCode自帶的Git雖然已經比較完善,但還有一些VSCode的元件讓其如虎添翼。

  1. Git Graph(Git同步路線圖)
    可以方便的檢視每次我們Git誰在什麼時間更新了那些資訊等內容,還可以便捷的給每次更新新增一些標籤等。
    在這裡插入圖片描述

  2. GitLens(Git增強)
    這個Git外掛擴充套件了很多Git功能,比如下方截圖中,可以顯示每行程式碼是誰在什麼時候更新的,此專案的貢獻者都有哪些人,貢獻了那些程式碼,此專案繫結了那些遠端Git倉庫等等,具體用法可以自行詳細探索。
    在這裡插入圖片描述

Git進階功能

我在介紹Git進階用法時,會把Git配合VSCode視覺化操作作為重點介紹,直接輸入命令網上已經有很多詳細的介紹了,我這裡並不會作為重點。

分支控制

在開發一些小專案專案時,我們常常會把Git當做一個多人協同工具,方便我們同步程式碼和可以實現類似存檔的功能,但作為分散式版本控制系統的核心功能,版本控制卻很少會被用到,想要體驗到更加完整的體驗到Git,版本控制是必不可少的功能。而分支便是體現出版本控制的實際形式。
如果你使用過GitHub或者其他類似的開源平臺,應該看到過一些開源的軟體有不同的版本,他們可能是已穩定版、體驗版(測試版)之類的進行分類,或者已PC版,安卓版分類,同一個軟體的不同版本,在原始碼上是十分相似的,但總是有一些不同的地方。這時候我們就可以利用Git的分支管理對其進行方便快捷的版本控制,在不同的版本直接無縫快速切換等操作。

Git分支常用原生命令作用
git branch檢視當前已經存在的所有分支。
git branch 分支名建立新的分支。
git switch 分支名切換分支。
git switch -b 分支名建立並切換分支。
git merge 分支名合併指定分支到當前分支。
git branch -d 分支名刪除分支

建立、切換分支

  1. 點選左下角的Git分支圖示和當前使用的分支名(如果使用的Git版本比較老,預設名為master,新版Git中已經將其更換名稱。)
  2. 其中正在建立新分支是指從當前正在使用的版本分支(我則是master)中,建立一個新的分支出來使用,而從...建立分支是可以手動指定一個基於那個分支來建立新的分支。(大白話描述一下就是選第一個建立出來的分支是和我們當前程式碼一樣的,但選第二個是你已經有多個分支的情況下,可以手動選擇新建立的分支要和已存在那個分支的程式碼一樣)
    在這裡插入圖片描述
  3. 建立分支後,點選左下角即可快速切換分支。(為了方便檢視不同分支區別,可以先修改部分程式碼提交後在切換分支檢視是否在不同分支下程式碼不同。)
    在這裡插入圖片描述

合併分支

在分支常用的兩種常見場景中,可能會碰到想要將一個分支中的內容併入另一個分支中(比如將測試通過的測試分支,併入穩定分支),VSCode提供了快捷的視覺化操作方式。
在這裡插入圖片描述
選擇Git > 分支 > 合併分支 > 選擇要合併的分支。
在這裡插入圖片描述

其他分支相關操作

  1. 重新命名分支
    在這裡插入圖片描述

  2. 刪除分支
    VSCode當前預設的Git並未提供刪除分支操作選項,當前需要使用到GitLens(Git增強)才能在視覺化介面中刪除分支
    在這裡插入圖片描述
    在這裡插入圖片描述

  3. 建議如果是一個敏捷開發的專案,一般可以分為:

    1. 主分支(生產環境): 用於專案正式上線時使用,基本能保證這個分支沒有任何的明顯漏洞。
    2. 測試分支(開發環境): 用於專案測試使用的分支,修復可以將漏洞修復完畢或新增了一些實驗性功能後的分支先合併到此進行一些測試。
    3. 漏洞修復分支。
    4. 實驗性功能新增分支。

撤回修改

Git為我們提供了一個非常強大的後悔藥,這個藥可以更加我們的意願,讓我們回到任意一個備份的時間點。
這裡要科普一個Git中的識別符號HEAD,其Git本分支倉庫之前的版本,其中HEAD^HEAD~1代表上一個版本,HEAD^^HEAD~2代表上兩個版本…

Git撤回修改常用原生命令作用
git checkout -- 檔名將指定檔案撤回到上次提交的狀態(丟棄工作區當前的修改)
git reset HEAD 檔名將當前快取區中的檔案指定檔案重新放回工作區
git reset --soft HEAD^只是將程式碼退回到上一個版本,並不會刪除上次提交的記錄(HEAD^可以根據我上述說的執行修改,或者換成版本的ID)
git reset --hard HEAD^不僅將程式碼退回到上一個版本,並且刪除上次提交的記錄

一般我們在撤回修改時分為四種情況:

  1. 檔案還未儲存進入快取區,只是想撤回到上次提交後的狀態
    這種撤回非常方便,只需要找到需要撤回修改的檔案即可。
    在這裡插入圖片描述
  2. 將檔案新增到快取區後發現問題,撤回修改
    撤回快取區檔案同樣非常簡單,點選暫存的修改中指定檔案的減號-即可
    在這裡插入圖片描述
  3. 將檔案新增到版本庫中發現問題撤銷修改
    如果是已經提交到版本庫後才發現了問題,這時候我建議你可以先把原生程式碼修改成正確的形式,之後在使用我下方會介紹的提交記錄合併抹除錯誤的提交記錄即可。
  4. 在多次提交後發現問題,想要撤回到指定節點
    如果只是撤回上一次提交到版本庫中的版本,VSCode給我們提供的自帶的方法就很好用。如下圖,我們可以將最近一次提交到版本庫的內容撤回到快取區。
    在這裡插入圖片描述
    PS: 這裡的撤回,是將本地倉庫中的Git提交記錄進行撤回,如果當前撤回的內容以及提交到伺服器,會在伺服器的Git版本控制中留下一些記錄!
    在這裡插入圖片描述
    從上圖可以看出,我們進行的撤回操作只會影響到本地Git,所以,我們進行撤回操作後,本地倉庫中會將上傳的提交記錄刪除,但這個刪除並不會影響到線上倉庫,我們將撤回後重新修改的程式碼C提交到本地倉庫時和以往的操作是相同的,但如果我們提交到線上倉庫,因為修改後版本B程式碼和撤回重新修改就會出現和之前我們提交過的B版本進行比對來檢視是否具有衝突。(這裡需要注意一下,如果你將程式碼撤回後,在撤銷所有修改,讓其回到程式碼A的狀態,這時候是無法執行在視覺化介面執行同步操作的,因為這時候你工作區的程式碼和本地倉庫中一致,沒有任何改變。)**如果重新修改的程式碼C和之前提交的B修改了同一處地方,我們在同步到線上伺服器的時候就會觸發衝突。**下圖是我進行了兩次撤回提交操作。在本地的庫中是看不到撤回的記錄的,但是線上是存在的。
    在這裡插入圖片描述
    上述這種撤回方式適用於撤回一到兩次提交,不過就算是一到兩次提交也可能產生很多衝突,邏輯也會變得比較複雜,並且因為當前Git的視覺化並不是十分健全,總會在一些地方出現小BUG,所以如果想要撤回不止一個版本時,我推薦大家使用VSCode的Git Graph元件。在需要撤回的指定存檔出選擇建立分支(Create branch)
    在這裡插入圖片描述
    這種方法可以撤回多個版本,並且將大量出錯的程式碼進行存檔,如果確定存檔沒有用處後,可以使用上述刪除分支的方式將不需要的分支直接刪除!

提交記錄合併

我們在做專案的時候,可能會因為粗心大意,提交的時候忘記修改一些小錯誤,比如寫了一些不想讓他人看到的註釋呀,忘記將專案介面改變成生產環境等,這時候我們可能只需刪除某一行,或者只是修改一個引數即可解決,如果每次這樣的操作都進行Git提交,會讓我們的記錄看上十分凌亂,這時候我們就可以將這種提交合併到上一次的提交中。
合併提交主要用到的引數為git rebase -i, 可以用HEAD^或id來指定需要合併的記錄。
比如下列專案git rebase -i HEAD~3git rebase -i 4e4ab9eb都代表合併前三個。不過我遵循能用視覺化簡化的操作就不用命令列,研究出瞭如何使用視覺化來完成合並操作的方式,具體如下。
在這裡插入圖片描述
這裡同樣需要使用VSCode的Git Graph元件實現不需要輸入任何命令的合併。
為了方便展示合併前和合並後的區別,我先基於新的分支建立了合併記錄測試,並在此分支中進行合併說明。

  1. 首先找到需要合併那些分支,然後點選在此提交上重新設定當前分支的基礎(Rebase current branch on this commit)

  2. 此時會跳出一個選擇框,其中一定要選上在新終端中互動式重建基地(Launch Interactive Rebase in new Terminal),此選項預設為關,如果不選擇此選項,後面我們需要輸入一些命令才能進行後續操作!
    在這裡插入圖片描述

  3. 重建基地最多可以看到五個選項分別是

    1. pick: 選定了此記錄,但什麼都不做(預設值)
    2. reword: 改寫提交時填寫的提交資訊(提交說明資訊)
    3. edit: 重新編輯提交的內容,這裡重新編輯的就是我們工作區的內容了,而不是填寫時候的提交資訊(這個功能一般很少用)
    4. squash: 將本條提交資訊融入父級,這是我們正需要的功能,使用此功能就能合併提交記錄了。
    5. fixup: 此選項和squash類似,不同的是squash會將我們的融合記錄儲存起來,而fixup則不會儲存融合的記錄
    6. drop: 刪除本次提交
      在這裡插入圖片描述

標記不同步檔案

在我們專案中,會出現一些中間程式碼,或者一些較大的不方便使用git進行同步的檔案,這種檔案我們通常需要放入.gitignore中進行標註。
如果你會寫正則,那麼.gitignore的語法應該很容易看懂,下面我做幾個簡單的示例:

  1. 完整檔名(包含字尾): 標記此指定的檔案不進行同步。假如當前需要不同步測試.pyc資料夾(注意這是一個資料夾) => 測試.pyc/;但如果這是一個檔案,我們就不需要輸入斜槓測試.pyc;如果是這個資料夾中一個檔案測試1,則需要輸入測試.pyc/測試1
  2. *: 假如當前需要不同步所有以.log字尾的檔案 => *.log
  3. []: 假如當前需要不同步.pyc.pyo.pyd這三個字尾的檔案 => .py[cod]

想要了解更多語法,可以去檢視正規表示式的完整語法

模板

  1. 通用配置: 如果是多人協同專案,推薦使用下列配置,因為團隊中使用的開發環境(IDE)是多種多樣的,大多數開發環境會為了加快自己的啟動速度等相關問題,會生成一些優化檔案,這些檔案對其他裝置算是毫無幫助,但卻數量眾多,所以儘可能將所有常用的開發環境都標記為不同步檔案,如果你還知道一些其他的開發環境(IDE)會生成的檔案,可以在下方評論區補充!
# 日誌檔案
*.log

# 常用IDE的配置相關檔案
# VSCode
.vscode

# JetBrains產品(當前已知Pycharm和Idea都會生成此檔案)
.idea

# Sublime Text
*.sublime-workspace
*.sublime-project

# macOS的目錄檔案
.DS_Store
  1. Python配置:
# Python的一些 位元組編譯、優化、DLL檔案
__pycache__/
*.py[cod]
*$py.class
# pyenv(常用建立Python虛擬環境的工具)
.python-version
# 常用虛擬環境預設的名稱
.venv/
venv/
ENV/
.env
.pythonProject/
pythonProject/

受限於我當前的技術棧,展示無法寫出更多,歡迎大家在下方評論區補充。

刪除已同步的檔案

有時候可能會後知後覺的發現自己同步了一些無用檔案,但這些檔案本地的確有需要,只是想刪除庫中的檔案,這時候我們就需要只刪除版本庫中的檔案git rm --cached 檔名
當前暫無發現如何使用視覺化的方式刪除此檔案!所以這裡我將使用命令作為展示,如果你發現視覺化也可以實現此功能,歡迎在下方評論區或私信我交流!
我當前在新的分支中提交了一個不需要同步的檔案,當前我們的目標就是刪除此檔案, 但並不刪除本地的實體檔案。(實現這個功能需要使用--cached引數,我們直接使用git rm 檔名,會將本地檔案一同刪除,並且,刪除後記得在.gitignore檔案中將其標註為不同步檔案,防止再次同步)
在這裡插入圖片描述
在這裡插入圖片描述

配置Git命令別名

Git還有一個非常好用的功能,他可以為那些繁雜的命令配置一些便於記憶的別名。比如我在刪除已同步的檔案中,因為沒有找到視覺化的解決方案,只能被迫使用命令列時,需要輸入一串單詞git rm --cached 檔名,我們可以給這個命令起一個別名,便於我們記憶。
主要方法有兩種

  1. 在命令列中新增git config --global alias.別名 '命令'比如git config --global alias.sc 'rm --cached',我們在從已同步的檔案中刪除指定的檔案時,只需要輸入git sc 檔名即可。注:這裡的別名不支援中文。
  2. 首先我們需要在專案資料夾中找到.git/這個隱藏資料夾中的config這個配置檔案新增[alias]標籤,並在其中新增別名即可。
    在這裡插入圖片描述
    上述是我在近一年來使用Git的一些總結!

配置多個遠端Git倉庫

一個專案要同時同步在多個Git倉庫時(比如一個專案正在使用本地私服Git的同時,想開源在一個開源的Git平臺。)有如下幾種方法:

相關命令作用
git remote -v檢視當前已有的倉庫
git remote add 倉庫名 倉庫地址新增一個新的倉庫
git remote set-url --add 倉庫名 地址在一個已有的一個倉庫中新增一個新的提交地址
git remote rm 倉庫名刪除倉庫
  1. 方法一: 新增多個倉庫,適用於多個倉庫自己的程式碼並非需要完全一致,而是需要不同的版本的情況下。比如我當前已有一個git私服時,我想在把程式碼同步到程式碼中國上進行開源。
    • 下面兩種方法二選一即可。
    • 在專案路徑下輸入:git remote add 倉庫名 倉庫地址(比如:git remote add 新倉庫 git@codechina.csdn.net:qq_39611230/test.git)
    • .git/config(上述我已經介紹過這個檔案在哪)這個配置檔案中新增一個新的[remote '倉庫名'],並且輸入urlfetch資訊
      在這裡插入圖片描述
      然後我們需要注意一下分支的配置檔案,我們可以將不同的分支配置到不同的遠端倉庫中!比如想我這樣,如果我在推送主分支時,會預設推送到origin倉庫中,而推送新的分支時候就會自動推送到新倉庫中。
      在這裡插入圖片描述
      2.方法二: 在一個倉庫中新增多個提交地址,上述的方法中,我們不同的分支會提交到不同的倉庫中,但我們的需求是想同時同步到所有倉庫,就可以來用這種方法。
    • 和上述相同還是有兩種方法二選一即可。
    • 在專案路徑下輸入:git remote set-url --add 倉庫名 地址 (比如git remote set-url --add origin git@codechina.csdn.net:qq_39611230/test.git)
    • .git/config這個配置檔案中的已有的[remote '倉庫名']中新增一個url屬性即可。
      在這裡插入圖片描述
      這種方法每次同步的時候都會同時同步到兩個倉庫中,但在VSCode中會觸發一些並不影響使用的Bug(因為命名重複,VSCode的git擴充套件外掛會把兩個遠端地址認證為兩個遠端倉庫,但因為他們名稱完全一樣,會導致一些並不影響使用的命名重複錯誤提示)

說明

對本部落格有所幫助的部落格
1. 一個專案push到多個遠端Git倉庫
2. 廖雪峰Git教程

相關文章