Git 教程:從 0 到 1 全面指南 教程【全文三萬字保姆級詳細講解】

目錄

什么是 Git ?

Git 與 SVN 區別

Git 安裝配置

Linux 平臺上安裝

Centos/RedHat

源碼安裝

Windows 平臺上安裝

使用 winget 工具

Mac 平臺上安裝

Git 配置

用戶信息

文本編輯器

差異分析工具

查看配置信息

生成 SSH 密鑰(可選)

驗證安裝

Git 工作流程

1、克隆倉庫

2、創建新分支

3、工作目錄

4、暫存文件

5、提交更改

6、拉取最新更改

7、推送更改

8、創建 Pull Request(PR)

9、合并更改

10、刪除分支

Git 工作區、暫存區和版本庫

基本概念

1、工作區(Working Directory)

2、暫存區(Staging Area)

3、版本庫(Repository)

工作區、暫存區和版本庫之間的關系

實例

Git 創建倉庫

git init

使用方法

git clone

配置

Git 基本操作

創建倉庫命令

提交與修改

提交日志

遠程操作

Git 文件狀態

工作目錄(Working Directory)

暫存區(Staging Area)

本地倉庫(Local Repository)

文件狀態的轉換流程

Git 分支管理

創建分支

查看分支

合并分支

解決合并沖突

刪除分支

實例

Git 分支管理

列出分支

刪除分支

分支合并

合并沖突

命令手冊

Git 查看提交歷史

git log

常用選項

git blame

恢復和回退

1、git checkout:檢查出特定版本的文件

2、git reset:重置當前分支到特定提交

3、git revert:撤銷某次提交

4、git reflog:查看歷史操作記錄

實例

Git 標簽

推送標簽到遠程倉庫

刪除輕量標簽

附注標簽

實例

刪除標簽

Git Flow

Git Flow 安裝

Linux

macOS

源碼安裝

Windows

Git Flow 分支模型

分支操作原理

Git Flow 命令示例

Git Flow 工作流程

1. 初始化 Git Flow

2. 創建功能分支

3. 創建發布分支

4. 創建修復分支

實例操作

優點和缺點

Git 進階操作

1、交互式暫存(Interactive Staging)

2、Git Stash:臨時保存工作進度

3、Git Rebase:變基

4、Git Cherry-Pick:揀選提交

示例操作

Git 遠程倉庫(Github)

添加遠程庫

查看當前的遠程庫

實例

提取遠程倉庫

推送到遠程倉庫

刪除遠程倉庫

實例

Git 服務器搭建

使用裸存儲庫(Bare Repository)

1、安裝Git

2、創建裸存儲庫

3、創建證書登錄

4、克隆倉庫

使用 GitLab

使用GitLab

Sourcetree 使用教程

Sourcetree 安裝

連接 Github 賬戶

創建本地倉庫


什么是 Git ?

Git 教程

Git 是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。

Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。

Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必服務器端軟件支持。


Git 與 SVN 區別

Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等。

如果你是一個具有使用 SVN 背景的人,你需要做一定的思想轉換,來適應 Git 提供的一些概念和特征。

Git 與 SVN 區別點:

  • 1、Git 是分布式的,SVN 不是:這是 Git 和其它非分布式的版本控制系統,例如 SVN,CVS 等,最核心的區別。

  • 2、Git 把內容按元數據方式存儲,而 SVN 是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似 .svn、.cvs 等的文件夾里。

  • 3、Git 分支和 SVN 的分支不同:分支在 SVN 中一點都不特別,其實它就是版本庫中的另外一個目錄。

  • 4、Git 沒有一個全局的版本號,而 SVN 有:目前為止這是跟 SVN 相比 Git 缺少的最大的一個特征。

  • 5、Git 的內容完整性要優于 SVN:Git 的內容存儲使用的是 SHA-1 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

Git 安裝配置

在使用 Git 前我們需要先安裝 Git。

Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺上運行。

Git 各平臺安裝包下載地址為:Git - Downloads


Linux 平臺上安裝

各大 Linux 平臺可以使用包管理器(apt-get、yum 等)進行安裝。

Debian/Ubuntu Git 安裝最新穩定版本命令為:

apt-get install git

Centos/RedHat

如果你使用的系統是 Centos/RedHat 安裝命令為:

yum -y install git-core

Fedora 安裝命令:

# yum install git (Fedora 21 及之前的版本)
# dnf install git (Fedora 22 及更高新版本)

FreeBSD 安裝命令:

pkg install git

OpenBSD 安裝命令:

pkg_add git

Alpine 安裝命令:

apk add git

源碼安裝

我們也可以在官網下載源碼包來安裝,最新源碼包下載地址:Index of /pub/software/scm/git/。

也可以在 GitHub 上克隆源碼包:

git clone https://github.com/git/git

解壓安裝下載的源碼包:

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

Windows 平臺上安裝

在 Windows 平臺上安裝 Git 同樣輕松,有個叫做 msysGit 的項目提供了安裝包,可以到 GitHub 的頁面上下載 exe 安裝文件并運行:

安裝包下載地址:Git for Windows

直接官網下載也可以:Redirecting…。

下載后,雙擊安裝包,打開界面如下所示,點擊 "next" 按鈕開始安裝:

完成安裝之后,就可以使用命令行的 git 工具(已經自帶了 ssh 客戶端)了,另外還有一個圖形界面的 Git 項目管理工具。

在開始菜單里找到?"Git"->"Git Bash",會彈出 Git 命令窗口,你可以在該窗口進行 Git 操作。

使用 winget 工具

如果你已經安裝了 winget,可以使用以下命令來安裝:

winget install --id Git.Git -e --source winget

Mac 平臺上安裝

通過 Homebrew 安裝:

brew install git

如果您想要安裝 git-gui 和 gitk(git 的提交 GUI 和交互式歷史記錄瀏覽器),您可以使用 homebrew 進行安裝:

brew install git-gui

也可以使用圖形化的 Git 安裝工具,下載地址為:

https://sourceforge.net/projects/git-osx-installer/

安裝界面如下所示:


Git 配置

Git 提供了一個叫做?git config?的命令,用來配置或讀取相應的工作環境變量。

這些環境變量,決定了 Git 在各個環節的具體工作方式和行為。

這些變量可以存放在以下三個不同的地方:

  • /etc/gitconfig?文件:系統中對所有用戶都普遍適用的配置。若使用?git config?時用?--system?選項,讀寫的就是這個文件。
  • ~/.gitconfig?文件:用戶目錄下的配置文件只適用于該用戶。若使用?git config?時用?--global?選項,讀寫的就是這個文件。
  • 當前項目的 Git 目錄中的配置文件(也就是工作目錄中的?.git/config?文件):這里的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以?.git/config?里的配置會覆蓋?/etc/gitconfig?中的同名變量。

在 Windows 系統上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 $HOME 變量指定的目錄,一般都是 C:\Documents and Settings\$USER。

此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當初 Git 裝在什么目錄,就以此作為根目錄來定位。

用戶信息

配置個人的用戶名稱和電子郵件地址,這是為了在每次提交代碼時記錄提交者的信息:

git config --global user.name "runoob"
git config --global user.email test@runoob.com

如果用了?--global?選項,那么更改的配置文件就是位于你用戶主目錄下的那個,以后你所有的項目都會默認使用這里配置的用戶信息。

如果要在某個特定的項目中使用其他名字或者電郵,只要去掉 --global 選項重新配置即可,新的設定保存在當前項目的 .git/config 文件里。

文本編輯器

設置 Git 默認使用的文本編輯器,一般可能會是 Vi 或者 Vim,如果你有其他偏好,比如 VS Code 的話,可以重新設置:

git config --global core.editor "code --wait"

差異分析工具

還有一個比較常用的是,在解決合并沖突時使用哪種差異分析工具。比如要改用 vimdiff 的話:

git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的輸出信息。

當然,你也可以指定使用自己開發的工具,具體怎么做可以參閱第七章。

查看配置信息

要檢查已有的配置信息,可以使用?git config --list?命令:

$ git config --list
http.postbuffer=2M
user.name=runoob
user.email=test@runoob.com

有時候會看到重復的變量名,那就說明它們來自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不過最終 Git 實際采用的是最后一個。

這些配置我們也可以在?~/.gitconfig?或?/etc/gitconfig?看到,如下所示:

vim ~/.gitconfig 

顯示內容如下所示:

[http]postBuffer = 2M
[user]name = runoobemail = test@runoob.com

也可以直接查閱某個環境變量的設定,只要把特定的名字跟在后面即可,像這樣:

$ git config user.name
runoob

生成 SSH 密鑰(可選)

如果你需要通過 SSH 進行 Git 操作,可以生成 SSH 密鑰并添加到你的 Git 托管服務(如 GitHub、GitLab 等)上。

ssh-keygen -t rsa -b 4096 -C "your.email@example.com"

按提示完成生成過程,然后將生成的公鑰添加到相應的平臺。

驗證安裝

在終端或命令行中運行以下命令,確保 Git 已正確安裝并配置:

git --version
git config --list

Git 工作流程

本章節我們將為大家介紹 Git 的工作流程。

下圖展示了 Git 的工作流程:

1、克隆倉庫

如果你要參與一個已有的項目,首先需要將遠程倉庫克隆到本地:

git clone https://github.com/username/repo.git
cd repo

2、創建新分支

為了避免直接在 main 或 master 分支上進行開發,通常會創建一個新的分支:

git checkout -b new-feature

3、工作目錄

在工作目錄中進行代碼編輯、添加新文件或刪除不需要的文件。

4、暫存文件

將修改過的文件添加到暫存區,以便進行下一步的提交操作:

git add filename
# 或者添加所有修改的文件
git add .

5、提交更改

將暫存區的更改提交到本地倉庫,并添加提交信息:

git commit -m "Add new feature"

6、拉取最新更改

在推送本地更改之前,最好從遠程倉庫拉取最新的更改,以避免沖突:

git pull origin main
# 或者如果在新的分支上工作
git pull origin new-feature

7、推送更改

將本地的提交推送到遠程倉庫:

git push origin new-feature

8、創建 Pull Request(PR)

在 GitHub 或其他托管平臺上創建 Pull Request,邀請團隊成員進行代碼審查。PR 合并后,你的更改就會合并到主分支。

9、合并更改

在 PR 審核通過并合并后,可以將遠程倉庫的主分支合并到本地分支:

git checkout main
git pull origin main
git merge new-feature

10、刪除分支

如果不再需要新功能分支,可以將其刪除:

git branch -d new-feature

或者從遠程倉庫刪除分支:

git push origin --delete new-feature

Git 工作區、暫存區和版本庫


基本概念

我們先來理解下 Git 工作區、暫存區和版本庫概念:

  • 工作區:就是你在電腦里能看到的目錄。
  • 暫存區:英文叫 stage 或 index。一般存放在?.git?目錄下的 index 文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
  • 版本庫:工作區有一個隱藏目錄?.git,這個不算工作區,而是 Git 的版本庫。

下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關系:

  • 圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage/index),標記為 "master" 的是 master 分支所代表的目錄樹。

  • 圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。

  • 圖中的 objects 標識的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,里面包含了創建的各種對象及內容。

  • 當對工作區修改(或新增)的文件執行?git add?命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。

  • 當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。

  • 當執行?git reset HEAD?命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

  • 當執行?git rm --cached <file>?命令時,會直接從暫存區刪除文件,工作區則不做出改變。

  • 當執行?git checkout .?或者?git checkout -- <file>?命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區中的改動。

  • 當執行?git checkout HEAD .?或者?git checkout HEAD <file>?命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

1、工作區(Working Directory)

工作區是你在本地計算機上的項目目錄,你在這里進行文件的創建、修改和刪除操作。工作區包含了當前項目的所有文件和子目錄。

特點:

  • 顯示項目的當前狀態。
  • 文件的修改在工作區中進行,但這些修改還沒有被記錄到版本控制中。

2、暫存區(Staging Area)

暫存區是一個臨時存儲區域,它包含了即將被提交到版本庫中的文件快照,在提交之前,你可以選擇性地將工作區中的修改添加到暫存區。

特點:

  • 暫存區保存了將被包括在下一個提交中的更改。
  • 你可以多次使用?git add?命令來將文件添加到暫存區,直到你準備好提交所有更改。

常用命令:

git add filename       # 將單個文件添加到暫存區
git add .              # 將工作區中的所有修改添加到暫存區
git status             # 查看哪些文件在暫存區中

3、版本庫(Repository)

版本庫包含項目的所有版本歷史記錄。

每次提交都會在版本庫中創建一個新的快照,這些快照是不可變的,確保了項目的完整歷史記錄。

特點:

  • 版本庫分為本地版本庫和遠程版本庫。這里主要指本地版本庫。
  • 本地版本庫存儲在?.git?目錄中,它包含了所有提交的對象和引用。

常用命令:

git commit -m "Commit message"   # 將暫存區的更改提交到本地版本庫
git log                          # 查看提交歷史
git diff                         # 查看工作區和暫存區之間的差異
git diff --cached                # 查看暫存區和最后一次提交之間的差異

工作區、暫存區和版本庫之間的關系

1、工作區 -> 暫存區

使用 git add 命令將工作區中的修改添加到暫存區。

git add filename

2、暫存區 -> 版本庫

使用 git commit 命令將暫存區中的修改提交到版本庫。

git commit -m "Commit message"

3、版本庫 -> 遠程倉庫

使用 git push 命令將本地版本庫的提交推送到遠程倉庫。

git push origin branch-name

4、遠程倉庫 -> 本地版本庫

使用 git pull 或 git fetch 命令從遠程倉庫獲取更新。

git pull origin branch-name
# 或者
git fetch origin branch-name
git merge origin/branch-name

實例

假設你在工作目錄中修改了 file.txt:

1、工作區

修改 file.txt 并保存。

2、暫存區

將修改添加到暫存區:

git add file.txt

3、版本庫

將暫存區的修改提交到本地版本庫:

git commit -m "Update file.txt"

4、遠程倉庫

將本地提交推送到遠程倉庫:

git push origin main

通過理解工作區、暫存區和版本庫的作用及其相互關系,你可以更加高效地使用 Git 進行版本控制和協同開發。

Git 創建倉庫

git init

Git 使用?git init?命令來初始化一個 Git 倉庫,Git 的很多命令都需要在 Git 的倉庫中運行,所以?git init?是使用 Git 的第一個命令。

在執行完成?git init?命令后,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的所有元數據,其他的項目目錄保持不變。

使用方法

進入你想要創建倉庫的目錄,或者先創建一個新的目錄:

mkdir my-project
cd my-project

使用當前目錄作為 Git 倉庫,我們只需使它初始化。

git init

該命令執行完后會在當前目錄生成一個 .git 目錄。

使用我們指定目錄作為Git倉庫。

git init newrepo

初始化后,會在 newrepo 目錄下會出現一個名為 .git 的目錄,所有 Git 需要的數據和資源都存放在這個目錄中。

如果當前目錄下有幾個文件想要納入版本控制,需要先用 git add 命令告訴 Git 開始對這些文件進行跟蹤,然后提交:

$ git add *.c
$ git add README
$ git commit -m '初始化項目版本'

以上命令將目錄下以 .c 結尾及 README 文件提交到倉庫中。

注:?在 Linux 系統中,commit 信息使用單引號?',Windows 系統,commit 信息使用雙引號?"。

所以在 git bash 中?git commit -m '提交說明'?這樣是可以的,在 Windows 命令行中就要使用雙引號?git commit -m "提交說明"。


git clone

我們使用?git clone?從現有 Git 倉庫中拷貝項目(類似?svn checkout)。

克隆倉庫的命令格式為:

git clone <repo>

如果我們需要克隆到指定的目錄,可以使用以下命令格式:

git clone <repo> <directory>

參數說明:

  • repo:Git 倉庫。
  • directory:本地目錄。

比如,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,可以用下面的命令:

$ git clone git://github.com/schacon/grit.git

執行該命令后,會在當前目錄下創建一個名為grit的目錄,其中包含一個 .git 的目錄,用于保存下載下來的所有版本記錄。

如果要自己定義要新建的項目目錄名稱,可以在上面的命令末尾指定新的名字:

$ git clone git://github.com/schacon/grit.git mygrit

配置

git 的設置使用?git config?命令。

顯示當前的 git 配置信息:

$ git config --list
credential.helper=osxkeychain
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true

編輯 git 配置文件:

$ git config -e    # 針對當前倉庫 

或者:

$ git config -e --global   # 針對系統上所有倉庫

設置提交代碼時的用戶信息:

$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com

如果去掉?--global?參數只對當前倉庫有效。

Git 基本操作

Git 的工作就是創建和保存你項目的快照及與之后的快照進行對比。

本章將對有關創建與提交你的項目快照的命令作介紹。

Git 常用的是以下 6 個命令:git clonegit pushgit add?、git commitgit checkoutgit pull,后面我們會詳細介紹。

說明:

  • workspace:工作區
  • staging area:暫存區/緩存區
  • local repository:版本庫或本地倉庫
  • remote repository:遠程倉庫

一個簡單的操作步驟:

$ git init    
$ git add .    
$ git commit  
  • git init - 初始化倉庫。
  • git add . - 添加文件到暫存區。
  • git commit - 將暫存區內容添加到倉庫中。

創建倉庫命令

下表列出了 git 創建倉庫的命令:

命令說明
git init初始化倉庫
git clone拷貝一份遠程倉庫,也就是下載一個項目。

提交與修改

Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。

下表列出了有關創建與提交你的項目的快照的命令:

命令說明
git add添加文件到暫存區
git status查看倉庫當前的狀態,顯示有變更的文件。
git diff比較文件的不同,即暫存區和工作區的差異。
git difftool使用外部差異工具查看和比較文件的更改。
git range-diff比較兩個提交范圍之間的差異。
git commit提交暫存區到本地倉庫。
git reset回退版本。
git rm將文件從暫存區和工作區中刪除。
git mv移動或重命名工作區文件。
git notes添加注釋。
git checkout分支切換。
git switch?(Git 2.23 版本引入)更清晰地切換分支。
git restore?(Git 2.23 版本引入)恢復或撤銷文件的更改。
git show顯示 Git 對象的詳細信息。

提交日志

命令說明
git log查看歷史提交記錄
git blame <file>以列表形式查看指定文件的歷史修改記錄
git shortlog生成簡潔的提交日志摘要
git describe生成一個可讀的字符串,該字符串基于 Git 的標簽系統來描述當前的提交

遠程操作

命令說明
git remote遠程倉庫操作
git fetch從遠程獲取代碼庫
git pull下載遠程代碼并合并
git push上傳遠程代碼并合并
git submodule管理包含其他 Git 倉庫的項目

Git 文件狀態

Git 的文件狀態分為三種:工作目錄(Working Directory)、暫存區(Staging Area)、本地倉庫(Local Repository)。了解這些概念及其交互方式是掌握 Git 的關鍵。

工作目錄(Working Directory)

工作目錄是你在本地計算機上看到的項目文件。它是你實際操作文件的地方,包括查看、編輯、刪除和創建文件。所有對文件的更改首先發生在工作目錄中。

在工作目錄中的文件可能有以下幾種狀態:

  • 未跟蹤(Untracked):新創建的文件,未被 Git 記錄。
  • 已修改(Modified):已被 Git 跟蹤的文件發生了更改,但這些更改還沒有被提交到 Git 記錄中。

暫存區(Staging Area)

暫存區,也稱為索引(Index),是一個臨時存儲區域,用于保存即將提交到本地倉庫的更改。你可以選擇性地將工作目錄中的更改添加到暫存區中,這樣你可以一次提交多個文件的更改,而不必提交所有文件的更改。

  • 使用?git add <filename>?命令將文件從工作目錄添加到暫存區。
  • 使用?git add .?命令將當前目錄下的所有更改添加到暫存區。
git add <filename>  # 添加指定文件到暫存區
git add .           # 添加所有更改到暫存區

本地倉庫(Local Repository)

本地倉庫是一個隱藏在?.git?目錄中的數據庫,用于存儲項目的所有提交歷史記錄。每次你提交更改時,Git 會將暫存區中的內容保存到本地倉庫中。

使用?git commit -m "commit message"?命令將暫存區中的更改提交到本地倉庫。

git commit -m "commit message"  # 提交暫存區的更改到本地倉庫

文件狀態的轉換流程

未跟蹤(Untracked): 新創建的文件最初是未跟蹤的。它們存在于工作目錄中,但沒有被 Git 跟蹤。

touch newfile.txt  # 創建一個新文件
git status         # 查看狀態,顯示 newfile.txt 未跟蹤

已跟蹤(Tracked): 通過?git add?命令將未跟蹤的文件添加到暫存區后,文件變為已跟蹤狀態。

git add newfile.txt  # 添加文件到暫存區
git status           # 查看狀態,顯示 newfile.txt 在暫存區

已修改(Modified): 對已跟蹤的文件進行更改后,這些更改會顯示為已修改狀態,但這些更改還未添加到暫存區。

echo "Hello, World!" > newfile.txt  # 修改文件
git status                          # 查看狀態,顯示 newfile.txt 已修改

已暫存(Staged): 使用?git add?命令將修改過的文件添加到暫存區后,文件進入已暫存狀態,等待提交。

git add newfile.txt  # 添加文件到暫存區
git status           # 查看狀態,顯示 newfile.txt 已暫存

已提交(Committed): 使用?git commit?命令將暫存區的更改提交到本地倉庫后,這些更改被記錄下來,文件狀態返回為已跟蹤狀態。

git commit -m "Added newfile.txt"  # 提交更改
git status                         # 查看狀態,工作目錄干凈

Git 分支管理

Git 分支管理是 Git 強大功能之一,能夠讓多個開發人員并行工作,開發新功能、修復 bug 或進行實驗,而不會影響主代碼庫。

幾乎每一種版本控制系統都以某種形式支持分支,一個分支代表一條獨立的開發線。

使用分支意味著你可以從開發主線上分離開來,然后在不影響主線的同時繼續工作。

Git 分支實際上是指向更改快照的指針。

有人把 Git 的分支模型稱為必殺技特性,而正是因為它,將?Git?從版本控制系統家族里區分出來。

創建分支

創建新分支并切換到該分支:

git checkout -b <branchname>

例如:

git checkout -b feature-xyz

切換分支命令:

git checkout (branchname)

例如:

git checkout main

當你切換分支的時候,Git 會用該分支的最后提交的快照替換你的工作目錄的內容, 所以多個分支不需要多個目錄。

查看分支

查看所有分支:

git branch

查看遠程分支:

git branch -r

查看所有本地和遠程分支:

git branch -a

合并分支

將其他分支合并到當前分支:

git merge <branchname>

例如,切換到 main 分支并合并 feature-xyz 分支:

git checkout main
git merge feature-xyz

解決合并沖突

當合并過程中出現沖突時,Git 會標記沖突文件,你需要手動解決沖突。

打開沖突文件,按照標記解決沖突。

標記沖突解決完成:

git add <conflict-file>

提交合并結果:

git commit

刪除分支

刪除本地分支:

git branch -d <branchname>

強制刪除未合并的分支:

git branch -D <branchname>

刪除遠程分支:

git push origin --delete <branchname>

實例

開始前我們先創建一個測試目錄:

$ mkdir gitdemo
$ cd gitdemo/
$ git init
Initialized empty Git repository...
$ touch README
$ git add README
$ git commit -m '第一次版本提交'
[master (root-commit) 3b58100] 第一次版本提交1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 README

Git 分支管理

列出分支

列出分支基本命令:

git branch

沒有參數時,git branch?會列出你在本地的分支。

$ git branch
* master

此例的意思就是,我們有一個叫做?master?的分支,并且該分支是當前分支。

當你執行?git init?的時候,默認情況下 Git 就會為你創建?master?分支。

如果我們要手動創建一個分支。執行?git branch (branchname)?即可。

$ git branch testing
$ git branch
* mastertesting

現在我們可以看到,有了一個新分支?testing

當你以此方式在上次提交更新之后創建了新分支,如果后來又有更新提交, 然后又切換到了?testing?分支,Git 將還原你的工作目錄到你創建分支時候的樣子。

接下來我們將演示如何切換分支,我們用 git checkout (branch) 切換到我們要修改的分支。

$ ls
README
$ echo 'runoob.com' > test.txt
$ git add .
$ git commit -m 'add test.txt'
[master 3e92c19] add test.txt1 file changed, 1 insertion(+)create mode 100644 test.txt
$ ls
README????????test.txt
$ git checkout testing
Switched to branch 'testing'
$ ls
README

當我們切換到?testing?分支的時候,我們添加的新文件 test.txt 被移除了。切換回?master?分支的時候,它們又重新出現了。

$ git checkout master
Switched to branch 'master'
$ ls
README????????test.txt

我們也可以使用 git checkout -b (branchname) 命令來創建新分支并立即切換到該分支下,從而在該分支中操作。

$ git checkout -b newtest
Switched to a new branch 'newtest'
$ git rm test.txt 
rm 'test.txt'
$ ls
README
$ touch runoob.php
$ git add .
$ git commit -am 'removed test.txt、add runoob.php'
[newtest c1501a2] removed test.txt、add runoob.php2 files changed, 1 deletion(-)create mode 100644 runoob.phpdelete mode 100644 test.txt
$ ls
README????????runoob.php
$ git checkout master
Switched to branch 'master'
$ ls
README????????test.txt

如你所見,我們創建了一個分支,在該分支上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切換回我們的主分支,刪除的 test.txt 文件又回來了,且新增加的 runoob.php 不存在主分支中。

使用分支將工作切分開來,從而讓我們能夠在不同開發環境中做事,并來回切換。

刪除分支

刪除分支命令:

git branch -d (branchname)

例如我們要刪除 testing 分支:

$ git branch
* mastertesting
$ git branch -d testing
Deleted branch testing (was 85fc7e7).
$ git branch
* master

分支合并

一旦某分支有了獨立內容,你終究會希望將它合并回到你的主分支。 你可以使用以下命令將任何分支合并到當前分支中去:

git merge
$ git branch
* masternewtest
$ ls
README????????test.txt
$ git merge newtest
Updating 3e92c19..c1501a2
Fast-forwardrunoob.php | 0test.txt   | 1 -2 files changed, 1 deletion(-)create mode 100644 runoob.phpdelete mode 100644 test.txt
$ ls
README????????runoob.php

以上實例中我們將 newtest 分支合并到主分支去,test.txt 文件被刪除。

合并完后就可以刪除分支:

$ git branch -d newtest
Deleted branch newtest (was c1501a2).

刪除后, 就只剩下 master 分支了:

$ git branch
* master

合并沖突

合并并不僅僅是簡單的文件添加、移除的操作,Git 也會合并修改。

$ git branch
* master
$ cat runoob.php

首先,我們創建一個叫做 change_site 的分支,切換過去,我們將 runoob.php 內容改為:

<?php
echo 'runoob';
?>

創建 change_site 分支:

$ git checkout -b change_site
Switched to a new branch 'change_site'
$ vim runoob.php
$ head -3 runoob.php
<?php
echo 'runoob';
?>
$ git commit -am 'changed the runoob.php'
[change_site 7774248] changed the runoob.php1 file changed, 3 insertions(+)

將修改的內容提交到 change_site 分支中。 現在,假如切換回 master 分支我們可以看內容恢復到我們修改前的(空文件,沒有代碼),我們再次修改 runoob.php 文件。

$ git checkout master
Switched to branch 'master'
$ cat runoob.php
$ vim runoob.php    # 修改內容如下
$ cat runoob.php
<?php
echo 1;
?>
$ git diff
diff --git a/runoob.php b/runoob.php
index e69de29..ac60739 100644
--- a/runoob.php
+++ b/runoob.php
@@ -0,0 +1,3 @@
+<?php
+echo 1;
+?>
$ git commit -am '修改代碼'
[master c68142b] 修改代碼1 file changed, 3 insertions(+)

現在這些改變已經記錄到我的 "master" 分支了。接下來我們將 "change_site" 分支合并過來。

$ git merge change_site
Auto-merging runoob.php
CONFLICT (content): Merge conflict in runoob.php
Automatic merge failed; fix conflicts and then commit the result.$ cat runoob.php     # 打開文件,看到沖突內容
<?php
<<<<<<< HEAD
echo 1;
=======
echo 'runoob';
>>>>>>> change_site
?>

我們將前一個分支合并到 master 分支,一個合并沖突就出現了,接下來我們需要手動去修改它。

$ vim runoob.php 
$ cat runoob.php
<?php
echo 1;
echo 'runoob';
?>
$ git diff
diff --cc runoob.php
index ac60739,b63d7d7..0000000
--- a/runoob.php
+++ b/runoob.php
@@@ -1,3 -1,3 +1,4 @@@<?php+echo 1;
+ echo 'runoob';?>

在 Git 中,我們可以用 git add 要告訴 Git 文件沖突已經解決

$ git status -s
UU runoob.php
$ git add runoob.php
$ git status -s
M  runoob.php
$ git commit
[master 88afe0e] Merge branch 'change_site'

現在我們成功解決了合并中的沖突,并提交了結果。


命令手冊

命令說明用法示例
git branch列出、創建或刪除分支。它不切換分支,只是用于管理分支的存在。git branch:列出所有分支
git branch new-branch:創建新分支
git branch -d old-branch:刪除分支
git checkout切換到指定的分支或恢復工作目錄中的文件。也可以用來檢出特定的提交。git checkout branch-name:切換分支
git checkout file.txt:恢復文件到工作區
git checkout <commit-hash>:檢出特定提交
git switch專門用于切換分支,相比?git checkout?更加簡潔和直觀,主要用于分支操作。git switch branch-name:切換到指定分支
git switch -c new-branch:創建并切換到新分支
git merge合并指定分支的更改到當前分支。git merge branch-name:將指定分支的更改合并到當前分支
git mergetool啟動合并工具,以解決合并沖突。git mergetool:使用默認合并工具解決沖突
git mergetool --tool=<tool-name>:指定合并工具
git log顯示提交歷史記錄。git log:顯示提交歷史
git log --oneline:以簡潔模式顯示提交歷史
git stash保存當前工作目錄中的未提交更改,并將其恢復到干凈的工作區。git stash:保存當前更改
git stash pop:恢復最近保存的更改
git stash list:列出所有保存的更改
git tag創建、列出或刪除標簽。標簽用于標記特定的提交。git tag:列出所有標簽
git tag v1.0:創建一個新標簽
git tag -d v1.0:刪除標簽
git worktree允許在一個倉庫中檢查多個工作區,適用于同時處理多個分支。git worktree add <path> branch-name:在指定路徑添加新的工作區并切換到指定分支
git worktree remove <path>:刪除工作區

Git 查看提交歷史

查看 Git 提交歷史可以幫助你了解代碼的變更情況和開發進度。

Git 提供了多種命令和選項來查看提交歷史,從簡單的日志到詳細的差異對比。

Git 提交歷史一般常用兩個命令:

  • git log?- 查看歷史提交記錄。
  • git blame <file>?- 以列表形式查看指定文件的歷史修改記錄。

git log

在使用 Git 提交了若干更新之后,又或者克隆了某個項目,想回顧下提交歷史,我們可以使用?git log?命令查看。

git log?命令用于查看 Git 倉庫中提交歷史記錄。

git log?顯示了從最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。

git log?命令的基本語法:

git log [選項] [分支名/提交哈希]

常用的選項包括:

  • -p:顯示提交的補丁(具體更改內容)。
  • --oneline:以簡潔的一行格式顯示提交信息。
  • --graph:以圖形化方式顯示分支和合并歷史。
  • --decorate:顯示分支和標簽指向的提交。
  • --author=<作者>:只顯示特定作者的提交。
  • --since=<時間>:只顯示指定時間之后的提交。
  • --until=<時間>:只顯示指定時間之前的提交。
  • --grep=<模式>:只顯示包含指定模式的提交消息。
  • --no-merges:不顯示合并提交。
  • --stat:顯示簡略統計信息,包括修改的文件和行數。
  • --abbrev-commit:使用短提交哈希值。
  • --pretty=<格式>:使用自定義的提交信息顯示格式。

使用?git log?命令列出歷史提交記錄如下:

$ git log
commit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master)
Merge: c68142b 7774248
Author: runoob <test@runoob.com>
Date:   Fri May 3 15:55:58 2019 +0800Merge branch 'change_site'commit c68142b562c260c3071754623b08e2657b4c6d5b
Author: runoob <test@runoob.com>
Date:   Fri May 3 15:52:12 2019 +0800修改代碼commit 777424832e714cf65d3be79b50a4717aea51ab69 (change_site)
Author: runoob <test@runoob.com>
Date:   Fri May 3 15:49:26 2019 +0800changed the runoob.phpcommit c1501a244676ff55e7cccac1ecac0e18cbf6cb00
Author: runoob <test@runoob.com>
Date:   Fri May 3 15:35:32 2019 +0800

我們可以用 --oneline 選項來查看歷史記錄的簡潔的版本。

$ git log --oneline
$ git log --oneline
d5e9fc2 (HEAD -> master) Merge branch 'change_site'
c68142b 修改代碼
7774248 (change_site) changed the runoob.php
c1501a2 removed test.txt、add runoob.php
3e92c19 add test.txt
3b58100 第一次版本提交

這告訴我們的是,此項目的開發歷史。

我們還可以用 --graph 選項,查看歷史中什么時候出現了分支、合并。以下為相同的命令,開啟了拓撲圖選項:

*   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
|\  
| * 7774248 (change_site) changed the runoob.php
* | c68142b 修改代碼
|/  
* c1501a2 removed test.txt、add runoob.php
* 3e92c19 add test.txt
* 3b58100 第一次版本提交

現在我們可以更清楚明了地看到何時工作分叉、又何時歸并。

你也可以用?--reverse?參數來逆向顯示所有日志。

$ git log --reverse --oneline
3b58100 第一次版本提交
3e92c19 add test.txt
c1501a2 removed test.txt、add runoob.php
7774248 (change_site) changed the runoob.php
c68142b 修改代碼
d5e9fc2 (HEAD -> master) Merge branch 'change_site'

如果只想查找指定用戶的提交日志可以使用命令:git log --author , 例如,比方說我們要找 Git 源碼中 Linus 提交的部分:

$ git log --author=Linus --oneline -5
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
3bb7256 make "index-pack" a built-in
377d027 make "git pack-redundant" a built-in
b532581 make "git unpack-file" a built-in
112dd51 make "mktag" a built-in

如果你要指定日期,可以執行幾個選項:--since 和 --before,但是你也可以用 --until 和 --after。

例如,如果我要看 Git 項目中三周前且在四月十八日之后的所有提交,我可以執行這個(我還用了 --no-merges 選項以隱藏合并提交):

$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
5469e2d Git 1.7.1-rc2
d43427d Documentation/remote-helpers: Fix typos and improve language
272a36b Fixup: Second argument may be any arbitrary string
b6c8d2d Documentation/remote-helpers: Add invocation section
5ce4f4e Documentation/urls: Rewrite to accomodate transport::address
00b84e9 Documentation/remote-helpers: Rewrite description
03aa87e Documentation: Describe other situations where -z affects git diff
77bc694 rebase-interactive: silence warning when no commits rewritten
636db2c t3301: add tests to use --format="%N"

常用選項

限制顯示的提交數:

git log -n <number>

例如,顯示最近的 5 次提交:

git log -n 5

顯示自指定日期之后的提交:

git log --since="2024-01-01"

顯示指定日期之前的提交:

git log --until="2024-07-01"

只顯示某個作者的提交:

git log --author="Author Name"

更多?git log?命令可查看?Git - git-log Documentation?或使用?git log --help?命令查看幫助信息。


git blame

git blame?命令用于逐行顯示指定文件的每一行代碼是由誰在什么時候引入或修改的。

git blame?可以追蹤文件中每一行的變更歷史,包括作者、提交哈希、提交日期和提交消息等信息。

如果要查看指定文件的修改記錄可以使用 git blame 命令,格式如下:

git blame [選項] <文件路徑>

常用的選項包括:

  • -L <起始行號>,<結束行號>:只顯示指定行號范圍內的代碼注釋。
  • -C:對于重命名或拷貝的代碼行,也進行代碼行溯源。
  • -M:對于移動的代碼行,也進行代碼行溯源。
  • -C -C?或?-M -M:對于較多改動的代碼行,進行更進一步的溯源。
  • --show-stats:顯示包含每個作者的行數統計信息。

顯示文件每一行的代碼注釋和相關信息:

git blame <文件路徑>

只顯示指定行號范圍內的代碼注釋:

git blame -L <起始行號>,<結束行號> <文件路徑>

對于重命名或拷貝的代碼行進行溯源:

git blame -C <文件路徑>

對于移動的代碼行進行溯源:

git blame -M <文件路徑>

顯示行數統計信息:

git blame --show-stats <文件路徑>

git blame 命令是以列表形式顯示修改記錄,如下實例:

$ git blame README 
^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) 
db9315b0 (runoob    2020-08-25 16:00:23 +0800 2) 

更多內容可以使用?git blame --help?查看完整的幫助文檔,了解更多選項和使用方式。


恢復和回退

Git 提供了多種方式來恢復和回退到之前的版本,不同的命令適用于不同的場景和需求。

以下是幾種常見的方法:

  • git checkout:切換分支或恢復文件到指定提交。
  • git reset:重置當前分支到指定提交(軟重置、混合重置、硬重置)。
  • git revert:創建一個新的提交以撤銷指定提交,不改變提交歷史。
  • git reflog:查看歷史操作記錄,找回丟失的提交。

1、git checkout:檢查出特定版本的文件

git checkout 命令用于切換分支或恢復工作目錄中的文件到指定的提交。

恢復工作目錄中的文件到某個提交:

git checkout <commit> -- <filename>

例如,將 file.txt 恢復到 abc123 提交時的版本:

git checkout abc123 -- file.txt

切換到特定提交:

git checkout <commit>

例如:

git checkout abc123

這種方式切換到特定的提交時,處于分離頭指針(detached HEAD)狀態。

2、git reset:重置當前分支到特定提交

git reset 命令可以更改當前分支的提交歷史,它有三種主要模式:--soft、--mixed 和 --hard。

--soft:只重置 HEAD 到指定的提交,暫存區和工作目錄保持不變。

git reset --soft <commit>

--mixed(默認):重置 HEAD 到指定的提交,暫存區重置,但工作目錄保持不變。

git reset --mixed <commit>

--hard:重置 HEAD 到指定的提交,暫存區和工作目錄都重置。

git reset --hard <commit>

例如,將當前分支重置到 abc123 提交:

git reset --hard abc123

3、git revert:撤銷某次提交

git revert 命令創建一個新的提交,用來撤銷指定的提交,它不會改變提交歷史,適用于已經推送到遠程倉庫的提交。

git revert <commit>

例如,撤銷 abc123 提交:

git revert abc123

4、git reflog:查看歷史操作記錄

git reflog 命令記錄了所有 HEAD 的移動。即使提交被刪除或重置,也可以通過 reflog 找回。

git reflog

利用 reflog 可以找到之前的提交哈希,從而恢復到特定狀態。例如:

git reset --hard HEAD@{3}

實例

以下是一個綜合示例,演示如何使用這些命令恢復歷史版本:

查看提交歷史:

git log --oneline

假設輸出如下:

abc1234 Commit 1
def5678 Commit 2
ghi9012 Commit 3

切換到 Commit 2(處于分離頭指針狀態):

git checkout def5678

重置到 Commit 2,保留更改到暫存區:

git reset --soft def5678

重置到 Commit 2,取消暫存區更改:

git reset --mixed def5678

重置到 Commit 2,丟棄所有更改:

git reset --hard def5678

撤銷 Commit 2:

git revert def5678

查看 reflog 找回丟失的提交:

git reflog

找到之前的提交哈希并恢復:

git reset --hard HEAD@{3}

Git 標簽

如果你達到一個重要的階段,并希望永遠記住提交的快照,你可以使用?git tag?給它打上標簽。

Git 標簽(Tag)用于給倉庫中的特定提交點加上標記,通常用于發布版本(如 v1.0, v2.0)。

比如說,我們想為我們的 runoob 項目發布一個 "1.0" 版本,我們可以用?git tag -a v1.0?命令給最新一次提交打上(HEAD) "v1.0" 的標簽。

-a?選項意為"創建一個帶注解的標簽",不用?-a?選項也可以執行的,但它不會記錄這標簽是啥時候打的,誰打的,也不會讓你添加個標簽的注解,我們推薦一直創建帶注解的標簽。

標簽語法格式:

git tag <tagname>

例如:

git tag v1.0

-a?選項可以添加注解:

$ git tag -a v1.0 

當你執行 git tag -a 命令時,Git 會打開你的編輯器,讓你寫一句標簽注解,就像你給提交寫注解一樣。

現在,注意當我們執行?git log --decorate?時,我們可以看到我們的標簽了:

*   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
|\  
| * 7774248 (change_site) changed the runoob.php
* | c68142b 修改代碼
|/  
* c1501a2 removed test.txt、add runoob.php
* 3e92c19 add test.txt
* 3b58100 第一次版本提交

如果我們忘了給某個提交打標簽,又將它發布了,我們可以給它追加標簽。

例如,假設我們發布了提交 85fc7e7(上面實例最后一行),但是那時候忘了給它打標簽。 我們現在也可以:

$ git tag -a v0.9 85fc7e7
$ git log --oneline --decorate --graph
*   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
|\  
| * 7774248 (change_site) changed the runoob.php
* | c68142b 修改代碼
|/  
* c1501a2 removed test.txt、add runoob.php
* 3e92c19 add test.txt
* 3b58100 (tag: v0.9) 第一次版本提交

如果我們要查看所有標簽可以使用以下命令:

$ git tag
v0.9
v1.0

推送標簽到遠程倉庫

默認情況下,git push 不會推送標簽,你需要顯式地推送標簽。

git push origin <tagname>

推送所有標簽:

git push origin --tags

刪除輕量標簽

本地刪除:

git tag -d <tagname>

遠程刪除:

git push origin --delete <tagname>

附注標簽

附注標簽存儲了創建者的名字、電子郵件、日期,并且可以包含標簽信息。附注標簽更為正式,適用于需要額外元數據的場景。

創建附注標簽語法:

git tag -a <tagname> -m "message"

例如:

git tag -a <tagname> -m "runoob.com標簽"

PGP 簽名標簽命令:

git tag -s <tagname> -m "runoob.com標簽"

查看標簽信息:

git show <tagname>

實例

以下是一個綜合示例,演示如何創建、查看、推送和刪除標簽。

創建輕量標簽和附注標簽:

git tag v1.0
git tag -a v1.1 -m "runoob.com標簽"

查看標簽和標簽信息:

git tag
git show v1.1

推送標簽到遠程倉庫:

git push origin v1.0
git push origin v1.1
git push origin --tags  # 推送所有標簽

刪除標簽

本地刪除:

git tag -d v1.0

遠程刪除:

git push origin --delete v1.0

Git Flow

Git Flow 是一種基于 Git 的分支模型,旨在幫助團隊更好地管理和發布軟件。

Git Flow 由 Vincent Driessen 在 2010 年提出,并通過一套標準的分支命名和工作流程,使開發、測試和發布過程更加有序和高效。

Git Flow 主要由以下幾類分支組成:masterdevelopfeaturereleasehotfix

Git Flow 安裝

Linux

Debian/Ubuntu:

sudo apt-get install git-flow

Fedora:

sudo dnf install gitflow
sudo apt-get install git-flow

macOS

在 macOS 上,你可以使用 Homebrew 來安裝 Git Flow:

brew install git-flow

源碼安裝

如果你的發行版的包管理器中沒有 Git Flow,你也可以從源代碼進行安裝:

git clone https://github.com/nvie/gitflow.git
cd gitflow
sudo make install

安裝完成后,你可以通過以下命令驗證 Git Flow 是否成功安裝:

git flow version

Windows

在 Windows 上,你可以通過以下方式安裝 Git Flow:

  • 使用 Git for Windows: Git for Windows 包含了 Git Flow。你可以從?Git for Windows?安裝 Git,然后使用 Git Bash 來使用 Git Flow。

  • 使用 Scoop: 如果你使用 Scoop 包管理工具,可以通過以下命令安裝 Git Flow:

    scoop install git-flow
  • 使用 Chocolatey: 如果你使用 Chocolatey 包管理工具,可以通過以下命令安裝 Git Flow:

    choco install gitflow

Git Flow 分支模型

master?分支

  • 永遠保持穩定和可發布的狀態。
  • 每次發布一個新的版本時,都會從?develop?分支合并到?master?分支。

develop?分支

  • 用于集成所有的開發分支。
  • 代表了最新的開發進度。
  • 功能分支、發布分支和修復分支都從這里分支出去,最終合并回這里。

feature?分支

  • 用于開發新功能。
  • 從?develop?分支創建,開發完成后合并回?develop?分支。
  • 命名規范:feature/feature-name

release?分支

  • 用于準備新版本的發布。
  • 從?develop?分支創建,進行最后的測試和修復,然后合并回?develop?和?master?分支,并打上版本標簽。
  • 命名規范:release/release-name

hotfix?分支

  • 用于修復緊急問題。
  • 從?master?分支創建,修復完成后合并回?master?和?develop?分支,并打上版本標簽。
  • 命名規范:hotfix/hotfix-name

分支操作原理

  • Master 分支上的每個 Commit 應打上 Tag,Develop 分支基于 Master 創建。
  • Feature 分支完成后合并回 Develop 分支,并通常刪除該分支。
  • Release 分支基于 Develop 創建,用于測試和修復 Bug,發布后合并回 Master 和 Develop,并打 Tag 標記版本號。
  • Hotfix 分支基于 Master 創建,完成后合并回 Master 和 Develop,并打 Tag?1。

Git Flow 命令示例

  • 開始 Feature 分支:git flow feature start MYFEATURE
  • 完成 Feature 分支:git flow feature finish MYFEATURE
  • 開始 Release 分支:git flow release start RELEASE [BASE]
  • 完成 Release 分支:合并到 Master 和 Develop,打 Tag,刪除 Release 分支。
  • 開始 Hotfix 分支:git flow hotfix start HOTFIX [BASE]
  • 完成 Hotfix 分支:合并到 Master 和 Develop,打 Tag,刪除 Hotfix 分支。

Git Flow 工作流程

1. 初始化 Git Flow

首先,在項目中初始化 Git Flow。可以使用 Git Flow 插件(例如?git-flow)來簡化操作。

git flow init

初始化時,你需要設置分支命名規則和默認分支。

2. 創建功能分支

當開始開發一個新功能時,從?develop?分支創建一個功能分支。

git flow feature start feature-name

完成開發后,將功能分支合并回?develop?分支,并刪除功能分支。

git flow feature finish feature-name
3. 創建發布分支

當準備發布一個新版本時,從?develop?分支創建一個發布分支。

git flow release start release-name

在發布分支上進行最后的測試和修復,準備好發布后,將發布分支合并回?develop?和?master?分支,并打上版本標簽。

git flow release finish release-name
4. 創建修復分支

當發現需要緊急修復的問題時,從?master?分支創建一個修復分支。

git flow hotfix start hotfix-name

修復完成后,將修復分支合并回?master?和?develop?分支,并打上版本標簽。

git flow hotfix finish hotfix-name

實例操作

以下是一個實際使用 Git Flow 的綜合實例。

初始化 Git Flow

git flow init

創建和完成功能分支

git flow feature start new-feature # 開發新功能
git flow feature finish new-feature

創建和完成發布分支

git flow release start v1.0.0 # 測試和修復
git flow release finish v1.0.0

創建和完成修復分支

git flow hotfix start hotfix-1.0.1. # 修復緊急問題
git flow hotfix finish hotfix-1.0.1

優點和缺點

優點

  • 明確的分支模型:清晰的分支命名和使用規則,使得開發過程井然有序。
  • 隔離開發和發布:開發和發布過程分離,減少了開發中的不確定性對發布的影響。
  • 版本管理:每次發布和修復都會打上版本標簽,方便回溯和管理。

缺點

  • 復雜性:對于小型團隊或簡單項目,Git Flow 的分支模型可能顯得過于復雜。
  • 頻繁的合并:在大型團隊中,頻繁的分支合并可能導致合并沖突增加。

Git Flow 是一種結構化的分支管理模型,通過定義明確的分支和工作流程,幫助團隊更好地管理軟件開發和發布過程。雖然它增加了一定的復雜性,但對于大型項目和團隊協作,Git Flow 提供了強大的支持和管理能力。

Git 進階操作

在掌握了 Git 的基礎操作之后,進階操作可以幫助你更高效地管理和優化你的代碼庫。

以下是一些常見的進階操作及其詳細說明:

  • 交互式暫存:逐塊選擇要暫存的更改,精細控制提交內容。
  • Git Stash:臨時保存工作進度,方便切換任務。
  • Git Rebase:將一個分支上的更改移到另一個分支之上,保持提交歷史線性。
  • Git Cherry-Pick:選擇特定提交并應用到當前分支。

1、交互式暫存(Interactive Staging)

git add?命令可以選擇性地將文件或文件的一部分添加到暫存區,這在處理復雜更改時非常有用。

  • 使用?git add -p:逐塊選擇要暫存的更改。
git add -p

執行此命令后,Git 會逐塊顯示文件的更改,你可以選擇是否暫存每個塊。常用選項包括:

  • y:暫存當前塊
  • n:跳過當前塊
  • s:拆分當前塊
  • e:手動編輯當前塊
  • q:退出暫存

2、Git Stash:臨時保存工作進度

git stash?命令允許你臨時保存當前工作目錄的更改,以便你可以切換到其他分支或處理其他任務。

保存當前工作進度

git stash

查看存儲的進度

git stash list

應用最近一次存儲的進度

git stash apply

應用并刪除最近一次存儲的進度

git stash pop

刪除特定存儲

git stash drop stash@{n}

清空所有存儲

git stash clear

3、Git Rebase:變基

git rebase?命令用于將一個分支上的更改移到另一個分支之上。它可以幫助保持提交歷史的線性,減少合并時的沖突。

變基當前分支到指定分支

git rebase <branchname>

例如,將當前分支變基到?main?分支:

git rebase main
  • 交互式變基
git rebase -i <commit>

交互式變基允許你在變基過程中編輯、刪除或合并提交。常用選項包括:

  • pick:保留提交
  • reword:修改提交信息
  • edit:編輯提交
  • squash:將當前提交與前一個提交合并
  • fixup:將當前提交與前一個提交合并,不保留提交信息
  • drop:刪除提交

4、Git Cherry-Pick:揀選提交

git cherry-pick?命令允許你選擇特定的提交并將其應用到當前分支。它在需要從一個分支移植特定更改到另一個分支時非常有用。

揀選提交

git rebase -i <commit>

例如,將?abc123?提交應用到當前分支:

git cherry-pick abc123

處理揀選沖突:如果揀選過程中出現沖突,解決沖突后使用?git cherry-pick --continue?繼續揀選。

示例操作

以下是一個綜合示例,展示了如何使用這些進階操作:

交互式暫存

git add -p

保存工作進度

git stash

查看存儲的進度

git stash list

應用存儲的進度

git stash apply

變基當前分支到?main?分支

git rebase main

交互式變基,編輯提交歷史

git rebase -i HEAD~3

編輯提交歷史,如合并和重命名提交。

揀選?feature?分支上的特定提交到?main?分支

git checkout main
git cherry-pick abc123

Git 遠程倉庫(Github)

Git 并不像 SVN 那樣有個中心服務器。

目前我們使用到的 Git 命令都是在本地執行,如果你想通過 Git 分享你的代碼或者與其他開發人員合作。 你就需要將數據放到一臺其他開發人員能夠連接的服務器上。

本例使用了 Github 作為遠程倉庫,你可以先閱讀我們的?Github 簡明教程。


添加遠程庫

要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用,命令格式如下:

git remote add [shortname] [url]

本例以 Github 為例作為遠程倉庫,如果你沒有 Github 可以在官網?https://github.com/注冊。

由于你的本地 Git 倉庫和 GitHub 倉庫之間的傳輸是通過SSH加密的,所以我們需要配置驗證信息:

使用以下命令生成 SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

后面的?your_email@youremail.com?改為你在 Github 上注冊的郵箱,之后會要求確認路徑和輸入密碼,我們這使用默認的一路回車就行。

成功的話會在?~/?下生成?.ssh?文件夾,進去,打開?id_rsa.pub,復制里面的?key

$ ssh-keygen -t rsa -C "12345678@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tianqixin/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):    # 直接回車
Enter same passphrase again:                   # 直接回車
Your identification has been saved in /Users/tianqixin/.ssh/id_rsa.
Your public key has been saved in /Users/tianqixin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI 12345678@qq.com
The key's randomart image is:
+---[RSA 3072]----+
|E*+.+=**oo       |
|%Oo+oo=o. .      |
|%**.o.o.         |
|OO.  o o         |
|+o+     S        |
|.                |
|                 |
|                 |
|                 |
+----[SHA256]-----+

回到 github 上,進入 Account => Settings(賬戶配置)。

左邊選擇?SSH and GPG keys,然后點擊?New SSH key?按鈕,title 設置標題,可以隨便填,粘貼在你電腦上生成的 key。

添加成功后界面如下所示

為了驗證是否成功,輸入以下命令:

$ ssh -T git@github.com
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes                   # 輸入 yes
Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
Hi tianqixin! You've successfully authenticated, but GitHub does not provide shell access. # 成功信息

以下命令說明我們已成功連上 Github。

之后登錄后點擊" New repository " 如下圖所示:

之后在在Repository name 填入 runoob-git-test(遠程倉庫名) ,其他保持默認設置,點擊"Create repository"按鈕,就成功地創建了一個新的Git倉庫:

創建成功后,顯示如下信息:

以上信息告訴我們可以從這個倉庫克隆出新的倉庫,也可以把本地倉庫的內容推送到GitHub倉庫。

現在,我們根據 GitHub 的提示,在本地的倉庫下運行命令:

$ mkdir runoob-git-test                     # 創建測試目錄
$ cd runoob-git-test/                       # 進入測試目錄
$ echo "# Git 測試" >> README.md     # 創建 README.md 文件并寫入內容
$ ls                                        # 查看目錄下的文件
README
$ git init                                  # 初始化
$ git add README.md                         # 添加文件
$ git commit -m "添加 README.md 文件"        # 提交并備注信息
[master (root-commit) 0205aab] 添加 README.md 文件1 file changed, 1 insertion(+)create mode 100644 README.md# 提交到 Github
$ git remote add origin git@github.com:tianqixin/runoob-git-test.git
$ git push -u origin master

以下命令請根據你在Github成功創建新倉庫的地方復制,而不是根據我提供的命令,因為我們的Github用戶名不一樣,倉庫名也不一樣。

接下來我們返回 Github 創建的倉庫,就可以看到文件已上傳到 Github上:


查看當前的遠程庫

要查看當前配置有哪些遠程倉庫,可以用命令:

git remote

實例

$ git remote
origin
$ git remote -v
origin????git@github.com:tianqixin/runoob-git-test.git (fetch)
origin????git@github.com:tianqixin/runoob-git-test.git (push)

執行時加上 -v 參數,你還可以看到每個別名的實際鏈接地址。


提取遠程倉庫

Git 有兩個命令用來提取遠程倉庫的更新。

1、從遠程倉庫下載新分支與數據:

git fetch

該命令執行完后需要執行 git merge 遠程分支到你所在的分支。

2、從遠端倉庫提取數據并嘗試合并到當前分支:

git merge

該命令就是在執行?git fetch?之后緊接著執行?git merge?遠程分支到你所在的任意分支。

假設你配置好了一個遠程倉庫,并且你想要提取更新的數據,你可以首先執行?git fetch [alias]?告訴 Git 去獲取它有你沒有的數據,然后你可以執行?git merge [alias]/[branch]?以將服務器上的任何更新(假設有人這時候推送到服務器了)合并到你的當前分支。

接下來我們在 Github 上點擊" README.md" 并在線修改它,然后我們在本地更新修改。

$ git fetch origin
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:tianqixin/runoob-git-test0205aab..febd8ed  master     -> origin/master

以上信息"0205aab..febd8ed master -> origin/master" 說明 master 分支已被更新,我們可以使用以下命令將更新同步到本地:

$ git merge origin/master
Updating 0205aab..febd8ed
Fast-forwardREADME.md | 1 +1 file changed, 1 insertion(+)

查看 README.md 文件內容:

$ cat README.md 
# Git 測試
## 第一次修改內容

推送到遠程倉庫

推送你的新分支與數據到某個遠端倉庫命令:

git push [alias] [branch]

以上命令將你的 [branch] 分支推送成為 [alias] 遠程倉庫上的 [branch] 分支,實例如下。

$ touch runoob-test.txt      # 添加文件
$ git add runoob-test.txt 
$ git commit -m "添加到遠程"
master 69e702d] 添加到遠程1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 runoob-test.txt$ git push origin master    # 推送到 Github

重新回到我們的 Github 倉庫,可以看到文件已經提交上來了:


刪除遠程倉庫

刪除遠程倉庫你可以使用命令:

git remote rm [別名]

實例

$ git remote -v
origin????git@github.com:tianqixin/runoob-git-test.git (fetch)
origin????git@github.com:tianqixin/runoob-git-test.git (push)# 添加倉庫 origin2
$ git remote add origin2 git@github.com:tianqixin/runoob-git-test.git$ git remote -v
origin????git@github.com:tianqixin/runoob-git-test.git (fetch)
origin????git@github.com:tianqixin/runoob-git-test.git (push)
origin2????git@github.com:tianqixin/runoob-git-test.git (fetch)
origin2????git@github.com:tianqixin/runoob-git-test.git (push)# 刪除倉庫 origin2
$ git remote rm origin2
$ git remote -v
origin????git@github.com:tianqixin/runoob-git-test.git (fetch)
origin????git@github.com:tianqixin/runoob-git-test.git (push)

Git 服務器搭建

2019 年開始 Github 私有存儲庫也可以無限制使用,當然我們也可以自己搭建一臺 Git 服務器作為私有倉庫使用。

使用裸存儲庫(Bare Repository)

1、安裝Git

Ubuntu 服務器上安裝 Git:

sudo apt install git

如果你使用的系統是 Centos/RedHat 安裝命令為:

yum -y install git-core

Fedora 安裝命令:

# yum install git (Fedora 21 及之前的版本)
# dnf install git (Fedora 22 及更高新版本)

接下來我們 創建一個 git 用戶組和用戶,用來運行git服務:

$ groupadd git
$ useradd git -g git

2、創建裸存儲庫

登錄到 Git 用戶,然后在其 home 目錄下創建一個裸存儲庫。

$ sudo su - git

首先我們選定一個目錄作為 Git 倉庫,假定是 /home/gitrepo/runoob.git,在 /home/gitrepo 目錄下輸入命令:

$ cd /home
$ mkdir gitrepo
$ chown git:git gitrepo/
$ cd gitrepo$ git init --bare runoob.git

以上命令Git創建一個空倉庫,服務器上的 Git 倉庫通常都以?.git?結尾。然后,把倉庫所屬用戶改為 git(如果是其他用戶操作,比如 root):

$ chown -R git:git runoob.git

3、創建證書登錄

將你的公鑰添加到 ~/.ssh/authorized_keys 中,允許遠程訪問。

收集所有需要登錄的用戶的公鑰,公鑰位于 id_rsa.pub 文件中,把我們的公鑰導入到 /home/git/.ssh/authorized_keys 文件里,一行一個。

如果沒有該文件創建它:

$ cd /home/git/
$ mkdir .ssh
$ chmod 755 .ssh
$ touch .ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys
# 在文件中添加你的 SSH 公鑰

4、克隆倉庫

$ git clone git@192.168.45.4:/home/gitrepo/runoob.git
Cloning into 'runoob'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

192.168.45.4 為 Git 所在服務器 ip ,你需要將其修改為你自己的 Git 服務 ip。

這樣我們的 Git 服務器安裝就完成。


使用 GitLab

GitLab 是一個功能強大的 Git 服務管理工具,適合中大型團隊,提供了豐富的用戶管理、CI/CD、代碼審查等功能。

1、安裝 GitLab

根據?GitLab 官方文檔?安裝 GitLab。

例如,在 Ubuntu 上:

# sudo apt-get update
# sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
# sudo EXTERNAL_URL="http://yourdomain" apt-get install gitlab-ee

EXTERNAL_URL="http://yourdomain" 要設置自己的域名,或者公網 IP,比如:

sudo EXTERNAL_URL=101.132.XX.XX yum install -y gitlab-ee

2、配置 GitLab

安裝完成后,打開瀏覽器訪問 http://yourdomain,設置管理員賬戶。

當出現類似如下回顯信息,表示 GitLab 已經安裝成功。

3、創建項目

登錄 GitLab,創建一個新的項目,用戶名為?root。

獲取登錄密碼:

sudo cat /etc/gitlab/initial_root_password

結果如下所示:

首次登錄使用用戶名?root:

4、生成密鑰對文件并獲取公鑰

安裝 Git 工具(已安裝跳過):

sudo apt-get install git

生成密鑰對文件 id_rsa:

ssh-keygen

生成密鑰對的過程中,系統會提示輸入密鑰對存放目錄(默認為當前用戶目錄下的 .ssh/id_rsa,例如 /home/test/.ssh/id_rsa)和密鑰對密碼,您可以手動輸入,也可以按 Enter 保持默認。

生成后,顯示信息如下:

查看并復制公鑰文件 id_rsa.pub 中的內容:

cat .ssh/id_rsa.pub

顯示類似如下的信息:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQVwWjF3KXmI549jDI0fuCgl+syJjjn55iMUDRRiCd/B+9TwUda3l9WXH5i7RU53QGRCsDVFZxixLOlmXr9E3VSqkf8xXBnHs/5E2z5PIOCN0nxfB9xeA1db/QxPwK4gkHisep+eNHRn9x+DpCYDoSoYQN0nBg+H3uqfOqL42mJ+tqSfkyqbhjBf1kjtDTlBfVCWtI0siu7owm+c65+8KNyPlj5/0AyJ4Aqk1OX2jv+YE4nTipucn7rHwWuowasPU86l+uBsLNwOSb+H7loJvQyhEINX2FS1KnpRU+ld20t07n+N3ErfX5xBAGfxXpoN9BKKSP+RT7rvTeXTVE**** test@runoob.com****

5、創建項目

在 GitLab 的主頁中,點擊 Create a project 選項:

點擊 Create blank project,設置 Project name 和 Project URL,然后點擊 Create project:

本文以 mywork 項目為例進行說明。

6、添加 SSH key

在當前 project 頁面,點擊 Add SSH key:

將公鑰文件 id_rsa.pub 中的內容粘貼到 Key 所在的文本框中:

點擊 Add key,SSH Key 添加完成后,如下圖所示:

復制 Clone 鏈接,該鏈接在進行克隆操作時需要使用:

使用GitLab

1、配置使用 Git 倉庫的人員信息,包含用戶名和郵箱。

git config --global user.name "testname" git config --global user.email "abc@example.com" 

2、克隆已創建的項目到本地。

git clone git@101.132.XX.XX:root/mywork.git

3、上傳文件到 GitLab 服務器:

進入到項目目錄:

cd mywork/ 

創建需要上傳到 GitLab 中的目標文件:

echo "test" > /home/test/test.sh

將目標文件或者目錄復制到項目目錄下:

cp /home/test/test.sh ./ 

將 test.sh 文件加入到索引中:

git add test.sh

將 test.sh 提交到本地倉庫:

git commit -m "test.sh"

將文件同步到 GitLab 服務器上:

git push -u origin main

在網頁中查看上傳的 test.sh 文件已經同步到 GitLab 服務器中:

Sourcetree 使用教程

Git 有很多圖形界面工具 ( GUI ),比如 SourceTree、Github Desktop、TortoiseGit 等。

SourceTree 是一個 Git 客戶端管理工具,適用于 Windows 和 Mac 系統。

SourceTree 簡化了開發者與代碼倉庫之間的 Git 操作方式,我們可以通過界面菜單很方便的處理 Git 操作,而不需要通過命令。

通過 SourceTree,我們可以管理所有的 Git 庫,無論是遠程還是本地的。SourceTree 支持 Bitbucket、GitHub 以及 Gitlab 等遠程倉庫。


Sourcetree 安裝

我們可以在 Sourcetree 官網?Sourcetree | Free Git GUI for Mac and Windows?直接點擊下載按鈕來下載:

其他版本可以查看:Sourcetree Download Archives | Sourcetree

下載完成后,解壓 ZIP 文件,雙擊應用程序文件(Windows 為 EXE 或 Mac 為 DMG)進行安裝。

安裝過程中,我們只需要同意 Atlassian 客戶協議并點擊 Continue 即可。

創建 Bitbucket 賬戶可跳過初始設置,加載 SSH 密鑰,如果有會默認加載進來,也可以后面再設置。

按照提示操作,直到您完成設置。如果您還沒有準備好克隆存儲庫,請單擊 Skip Setup。


連接 Github 賬戶

如果你還沒有 Github 賬戶需要創建一個,可以參考?Git 遠程倉庫(Github)。

接下來我們將介紹使用 Sourcetree 管理我們的 Github 賬戶。

我們可以將多個帳戶添加到 Sourcetree。

單擊右上角的按鈕并選擇帳戶

接下來我們通過添加賬戶按鈕添加 Github 賬戶。

Github 賬戶添加完成后,就可以直接克隆我們自己的賬戶:

也可以克隆其他遠程倉庫:

克隆完成后,我們就可以進行提交、拉取、合并等操作:


創建本地倉庫

單擊新建,然后選擇創建本地倉庫

輸入您的目標路徑和存儲庫名稱,然后點擊創建

創建完成后就會顯示在本地的列表中:

如果我們本地已經存在一個倉庫,可以直接添加它。

點擊新建,然后 點擊添加已經存在的本地倉庫

?如果小假的內容對你有幫助,請點贊評論收藏。創作不易,大家的支持就是我堅持下去的動力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74562.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java導出excel,表格插入pdf附件,以及實現過程中遇見的坑

1.不能使用XSSFWorkbook,必須使用HSSFWorkbook,否則導出excel后&#xff0c;不顯示插入的圖標和內容&#xff0c;如果是讀取的已有的excel模板&#xff0c;必須保證excel的格式是xls&#xff0c;如果把xlsx通過重命名的方式改為xls&#xff0c;是不生效的&#xff0c;后面執行下…

國內外網絡安全政策動態(2025年3月)

?? 1.《關于進一步加強智能網聯汽車產品準入、召回及軟件在線升級管理的通知》發布 3月1日&#xff0c;工業和信息化部、市場監管總局聯合發布《關于進一步加強智能網聯汽車產品準入、召回及軟件在線升級管理的通知》&#xff08;以下簡稱《通知》&#xff09;。 該通知旨在…

什么是緩存穿透、緩存雪崩、緩存擊穿?

什么是緩存&#xff1f; 緩存就是數據交換的緩沖區&#xff0c;是存貯數據的臨時地方&#xff0c;一般讀寫性能較高。 怎么防止緩存穿透&#xff1f; 緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在&#xff0c;這樣緩存永遠不會生效&#xff0c;這些請求都會打到…

深度學習在自動駕駛車輛車道檢測中的應用

引言 自動駕駛技術是人工智能領域的一個前沿方向&#xff0c;而車道檢測是實現自動駕駛的關鍵技術之一。通過識別和跟蹤車道線&#xff0c;自動駕駛車輛能夠保持在車道內行駛&#xff0c;提高行車安全。本文將詳細介紹如何使用深度學習技術進行車道檢測&#xff0c;并提供一個…

大模型如何引爆餐飲與電商行業變革

大模型如何引爆餐飲與電商行業變革&#xff1f; 一、時代背景&#xff1a;大模型重構產業邏輯的底層動力 1. 技術躍遷催生效率革命 2025年&#xff0c;大模型技術迎來"普惠臨界點"。李開復在中關村論壇指出&#xff0c;大模型推理成本每年降低10倍&#xff0c;使得…

chromium魔改——繞過無限debugger反調試

在進行以下操作之前&#xff0c;請確保已完成之前文章中提到的 源碼拉取及編譯 部分。 如果已順利完成相關配置&#xff0c;即可繼續執行后續操作。 在瀏覽器中實現“無限 debugger”的反調試技術是一種常見的手段&#xff0c;用于防止他人通過開發者工具對網頁進行調試或逆向…

在win11 環境下 新安裝 WSL ubuntu + 換國內鏡像源 + ssh + 桌面環境 + Pyhton 環境 + vim 設置插件安裝

在win11 環境下 新安裝 WSL ubuntu ssh gnome 桌面環境 Pyhton 環境 vim 設置插件安裝 簡單介紹詳細流程換國內鏡像源安裝 ssh 桌面環境python 環境vim 設置插件安裝 簡單介紹 內容有點長&#xff0c;這里就先簡單描述內容了。主要是快速在 Win11 搭建一個 wsl 的 linux 環…

python 命名空間與作用域 可變與不可變對象 閉包

python 命名空間與作用域 可變與不可變對象 閉包 作用域規則順序為&#xff1a; L->E->G->B 如果變量在局部內找不到&#xff0c;便會去局部外的局部找&#xff08;例如閉包&#xff09;&#xff0c;再找不到就會去全局找&#xff0c;再找不到就去內置中找。 若要在函…

安裝 TabbyAPI+Exllamav2 和 vLLM 的詳細步驟

在 5090 顯卡上成功安裝 TabbyAPIExllamav2 和 vLLM 并非易事&#xff0c;經過一番摸索&#xff0c;我總結了以下詳細步驟&#xff0c;希望能幫助大家少走彎路。 重要提示&#xff1a; 用戶提供的 PyTorch 安裝使用了 cu128&#xff0c;這并非標準 CUDA 版本。請根據你的系統實…

使用url-loader處理圖片等資源文件

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

EIP-712:類型化結構化數據的哈希與簽名

1. 引言 以太坊 EIP-712: 類型化結構化數據的哈希與簽名&#xff0c;是一種用于對類型化結構化數據&#xff08;而不僅僅是字節串&#xff09;進行哈希和簽名 的標準。 其包括&#xff1a; 編碼函數正確性的理論框架&#xff0c;類似于 Solidity 結構體并兼容的結構化數據規…

contourformer:實時的輪廓分割transformer

論文地址:https://arxiv.org/abs/2501.17688 github:https://github.com/talebolano/Contourformer 模型結構 框架建立在 D-FINE 對象檢測模型之上,并將邊界框的回歸擴展到輪廓的回歸。為了實現高效的訓練,Contourformer 采用迭代方法進行輪廓變形,并引入降噪機制來加速…

【JavaScript】原型鏈 prototype 和 this 關鍵字的練習(老虎機)

這個老虎機練習主要考察JavaScript中的原型鏈&#xff08;prototype&#xff09;和this關鍵字的使用。 主要思路 創建三個輪盤&#xff08;reels&#xff09;實例&#xff1a;我們需要創建3個獨立的輪盤對象&#xff0c;它們都委托&#xff08;delegate&#xff09;到基礎的ree…

vue項目data functions should return an object

在vue項目中提示錯誤&#xff0c;data functions should return an object Message.error(err)錯了&#xff0c;Message.error()是element-ui的組件&#xff0c;只能接受字符串&#xff0c;不能接受對象。 改為Message.error(err.message)就好了 我的錯誤是 Message.error(er…

leetcode刷題 - 數組理論基礎

數組是內存空間連續存儲、相同類型數據的集合。遍歷方式&#xff1a;下標索引 下標&#xff1a;從 0 開始 數組的元素不能刪除&#xff0c;只能覆蓋 定義一維數組&#xff1a; int arr0[10]; int arr1[10] { 100, 90,80,70,60,50,40,30,20,10 }; int arr2[ ] { 100,90,80,7…

狀態機思想編程練習

狀態機實現LED流水燈 本次實驗&#xff0c;我們將利用狀態機的思想來進行Verilog編程實現一個LED流水燈&#xff0c;并通過Modelsim來進行模擬仿真&#xff0c;再到DE2-115開發板上進行驗證。 ? 首先進行主要代碼的編寫。 module led (input sys_clk,input sys_…

數據結構|排序算法(一)快速排序

一、排序概念 排序是數據結構中的一個重要概念&#xff0c;它是指將一組數據元素按照特定的順序進行排列的過程&#xff0c;默認是從小到大排序。 常見的八大排序算法&#xff1a; 插入排序、希爾排序、冒泡排序、快速排序、選擇排序、堆排序、歸并排序、基數排序 二、快速…

如何確保MQ消息隊列不丟失:Java實現與流程分析

前言 在分布式系統中&#xff0c;消息隊列&#xff08;Message Queue, MQ&#xff09;是核心組件之一&#xff0c;用于解耦系統、異步處理和削峰填谷。然而&#xff0c;消息的可靠性傳遞是使用MQ時需要重點考慮的問題。如果消息在傳輸過程中丟失&#xff0c;可能會導致數據不一…

關于termux運行pc交叉編譯的aarch64 elf的問題

在Linux系統上交叉編譯Nim程序到Android Termux環境需要特殊處理&#xff0c;以下是詳細的解決方案&#xff1a; 問題根源分析 ??ABI不兼容?? Android使用bionic libc而非標準glibc&#xff0c;直接編譯的Linux ARM二進制無法直接運行 ??動態鏈接錯誤?? 默認編譯會鏈…

為PXIe控制器配置NI Linux實時操作系統安裝軟件

一、升級BIOS 使用NI Linux Real-Time操作系統的PXI硬件支持頁面來確定NI Linux Real-Time是否支持您的PXIe控制器&#xff0c;以及是否需要更新控制器BIOS。 按照BIOS下載頁面上的“安裝說明”部分安裝BIOS更新。 注意&#xff1a;NI在NI 2020軟件版本中刪除對cRIO的Phar Lap和…