當你學習 Git 時,可能會被其龐大的命令集和各種概念所嚇到。但實際上,Git 并不要求死記硬背每一個命令,更重要的是理解其工作流程和使用場景。這篇文章的目的就是幫助你簡化 Git 的學習過程,讓你發(fā)現(xiàn) Git 其實并不需要刻意去背,只需要真正理解它,就能輕松掌握。現(xiàn)在,就讓我們一起踏上探索 Git 世界的旅程吧!
Git 是最流行的分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱 DVCS)。它由 Linus Torvalds 創(chuàng)建,當時非常需要一個快速、高效和大規(guī)模分布式的源代碼管理系統(tǒng),用于管理 Linux 源代碼。
由于 Linus 對幾乎所有現(xiàn)有的源代碼管理系統(tǒng)抱有強烈的反感,因此他決定編寫自己的源代碼管理系列。2005 年 4 月,Git 就誕生了。到了 2005 年 7 月,維護工作就交給了 Junio Hamano,自此他就一直在維護這個項目。
雖然最初只用于 Linux 內(nèi)核,但 Git 項目迅速傳播,并很快被用于管理許多其他 Linux 項目?,F(xiàn)在,幾乎所有的軟件開發(fā),尤其是在開源世界中,都是通過 Git 進行的。
版本控制是指對軟件開發(fā)過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一。版本控制技術是團隊協(xié)作開發(fā)的橋梁,助力于多人協(xié)作同步進行大型項目開發(fā)。軟件版本控制系統(tǒng)的核心任務就是查閱項目歷史操作記錄、實現(xiàn)協(xié)同開發(fā)。
常見版本控制主要有兩種:集中式版本控制和分布式版本控制。
集中式版本控制系統(tǒng),版本庫是集中存放在中央服務器的。工作時,每個人都要先從中央服務器獲取最新的版本。完成之后,再把自己添加/修改的內(nèi)容提交到中央服務器。所有文件和歷史數(shù)據(jù)都存儲在中央服務器上。SVN 是最流行的集中式版本控制系統(tǒng)之一。
集中式版本控制系統(tǒng)的缺點就是必須聯(lián)網(wǎng)才能使用,如果使用局域網(wǎng)還好,速度會比較快。而如果是使用互聯(lián)網(wǎng),網(wǎng)速慢的話,就可能需要等待很長時間。除此之外,如果中央服務器出現(xiàn)故障,那么版本控制將不可用。如果中心數(shù)據(jù)庫損壞,若數(shù)據(jù)未備份,數(shù)據(jù)就會丟失。
分布式版本控制系統(tǒng),每臺終端都可以保存版本庫,版本庫可以不同,可以對每個版本庫進行修改,修改完成后可以集中進行更新。雖然它沒有中心服務器,但可以有一個備份服務器,它的功能有點類似于 SVN 的中央服務器,但它的作用僅是方便交換修改,而不像 SVN 那樣還要負責源代碼的管理。Git 是最流行的分布式版本控制系統(tǒng)之一。
和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多,因為每個人電腦里都有完整的版本庫,某一個人的電腦損壞不會影響到協(xié)作的其他人。
Git 相較于 SVN:
在Git官網(wǎng)下載、安裝即可:https://git-scm.com/download。
安裝完成之后,可以使用以下命令來查看 Git 是否安裝成功:
git --version
如果安裝成功,終端會打印安裝的 Git 的版本:
要給項目初始化一個Git倉庫,可以在終端中打開項目目錄,執(zhí)行以下命令即可:
git init
初始化之后,就會創(chuàng)建一個名為.git的新子文件夾,其中包含 Git 將用于跟蹤項目更改的多個文件和更多子目錄:
在使用 Git 進行代碼管理時,不希望一些文件出現(xiàn)在跟蹤列表中,比如node_modules文件。這種情況下,可以在項目的根目錄中創(chuàng)建一個名為.gitignore的文件,在該文件中列出要忽略的文件和文件夾,來看一個示例:
# 所有以.md結尾的文件*.md # lib.a不能被忽略!lib.a# node_modules和.vscode文件被忽略node_modules.vscode# build目錄下的文件被忽略build/# doc目錄下的.txt文件被忽略doc/*.txt# doc目錄下多層目錄的所有以.pdf結尾的文件被忽略doc/**/*.pdf
注意:以 # 符號開頭的行是注釋。
我們可以在本地克隆Git存儲庫上的代碼,首先要找到Git存儲庫上的HTTPS或SSH的地址,如下:
圖片
然后使用以下命令將遠程倉庫克隆到本地:
git clone https://github.com/facebook/react.git
從Git的角度來看,可以在三個區(qū)域進行文件更改:工作區(qū),暫存區(qū)和存儲庫。
Git 工作目錄下的文件存在兩種狀態(tài):
其中已跟蹤狀態(tài)可以細分為以下三種狀態(tài):
可以通過運行以下命令來檢查當前分支的狀態(tài):
git status
顯示結果如下:
此命令不會更改或更新任何內(nèi)容。它會打印出哪些文件被修改、暫存或未跟蹤。未跟蹤的文件是尚未添加到 git 索引的文件,而自上次提交以來已更改的文件將被視為已被 git 修改。
當安裝Git后首先要做的就是配置所有本地存儲庫中使用的用戶信息。每次Git提交都會使用該用戶信息。
config 命令適用于不同的級別:
下面的配置均為寫入系統(tǒng)級別:
可以使用以下命令設置使用 Git 時的用戶名:
git config --global user.name "name"
可以使用以下命令查看設置的user.name:
git config user.name
可以使用以下命令設置使用 Git 時的郵箱:
git config --global user.email "email"
可以使用以下命令查看設置的 email:
git config user.email
除了上述兩個基本的設置之外,還可以設置命令的顏色,以使輸出具有更高的可讀性:
git config --global color.ui auto
通過上面的命令設置的信息會保存在本地的.gitconfig文件中。可以使用以下命令查看所有配置信息:
git config --list
如果在全局輸入這個命令,就會顯示全局的配置:
如果在使用 Git 的項目中輸入該命令,除了會顯示全局的配置之外,還會顯式本地倉庫的一些配置信息,如下:
git config 命令為我們提供了一種創(chuàng)建別名的方法,這種別名通常用于縮短現(xiàn)有的命令或者創(chuàng)建自定義命令。來看一個例子:
git config --global alias.cm "commit -m"
這里為commit -m創(chuàng)建一個別名 cm,這樣在提交暫存區(qū)文件時,只需要輸入以下命令即可:
git cm <message>
分支是源代碼控制的核心概念,它允許將工作分離到不同的分支中,這樣就可以自由地處理源代碼,而不會影響其他任何人的工作或主分支中的代碼。下面來看一些常見的分支操作。
可以使用以下命令來查看當然所在的分支以及該項目所有的分支情況:
git branch
該命令可以列出項目所有的本地分支,顯示綠色的分支就是當前分支:
可以使用以下命令來列出所有的遠程分支:
git branch -r
可以使用以下命令來查看所有的本地分支和遠程分支:
git branch -a
我們在計算機上只能訪問本地分支,在將分支推送到遠程倉庫之前,需要先創(chuàng)建一個本地分支。
可以使用以下命令來創(chuàng)建分支:
git checkout <branch>
加上-b
就可以在創(chuàng)建新的分支之后,直接切換到新創(chuàng)建的分支上:
git checkout -b <branch>
如果想將新建的本地分支推送到遠程倉庫,以在遠程倉庫添加這個分支。可以執(zhí)行以下命令:
git push -u origin <branch>
可以使用以下命令來刪除本地分支:
git branch -d <branch>
需要注意,在刪除分支之前,要先切換到其他分支,否則就會報錯:
切換到其他分支再刪除即可:
有時 Git 會拒絕刪除本地分支,因為要刪的分支可能有未提交的代碼。這是為了保護代碼以避免意外丟失數(shù)據(jù)。可以使用以下命令來強制刪除本地分支:
git branch -D <branch>
這樣就刪除成功了:
當然,我們也可以刪除遠程倉庫分支,執(zhí)行以下命令即可:
git push origin --delete <name>
可以使用以下命令來將分支重命名:
git branch -m <oldname> <newname>
如果newname名字分支已經(jīng)存在,則需要使用-M來強制重命名:
git branch -M <oldname> <newname>
可以使用以下命令將其他分支的代碼合并到當前分支:
git merge <branch>
如果想將A分支合并到B分支,就要先切換到B分支,然后執(zhí)行命令:git merge A
。
git rebase 用于將一個分支的提交記錄合并到另一個分支上。
原理: 通過找到兩個分支的最近共同祖先,然后提取當前分支相對于該祖先的歷次提交,保存為臨時文件。接著,將當前分支指向目標分支的最新提交,最后依序應用之前保存的修改。這樣,就可以將一個分支上的修改“移動”到另一個分支上,實現(xiàn)代碼的整合。
使用git rebase的步驟如下:
假設有一個名為feature的分支,它包含了一些新功能的開發(fā)代碼。同時,還有一個名為master的主分支,用于發(fā)布穩(wěn)定版本的代碼?,F(xiàn)在,想要將feature分支上的代碼合并到master分支上。首先,切換到master分支,并拉取最新的代碼:
git checkout master git pull origin master
然后,執(zhí)行rebase命令,將feature分支的提交記錄合并到master分支上:
git rebase feature
Git會開始分析兩個分支的提交記錄,并嘗試自動合并它們。如果出現(xiàn)沖突,需要手動解決沖突,并使用git add命令標記已解決的文件。例如,假設在合并過程中出現(xiàn)了一個名為conflict.txt的文件沖突,你可以使用文本編輯器打開該文件,解決沖突,然后執(zhí)行以下命令:
git add conflict.txt git rebase --continue
一旦所有沖突都解決并且所有提交記錄都成功合并,可以使用git push命令將更改推送到遠程倉庫:
git push origin master
這樣就成功地將feature分支上的代碼合并到了master分支上,并保持了提交歷史的清晰和整潔。
git rebase和git merge都是用于將不同分支的代碼整合到一起的Git命令,但它們在實現(xiàn)方式、結果和適用場景上有一些區(qū)別。
Git 數(shù)據(jù)工作流程如下:
可以使用以下命令來暫存已修改的文件,命令最后需要指定要暫存的文件名稱:
git add <filename>
如果想要將所有未跟蹤和修改的文件添加到暫存區(qū),可以執(zhí)行以下命令:
git add .
此時分支的狀態(tài)如下:
可以使用以下命令將暫存區(qū)的文件修改提交到本地倉庫,
git commit -m "meaasge"
其中-m參數(shù)表示message日志信息,參數(shù)后面要加一個日志信息,用雙引號括起來。
此時分支的狀態(tài)如下:
如果上次提交暫存的messge寫錯了怎么辦呢?可以使用使用以下命令來更新提交,而不需要撤銷并重新提交:
git commit --amend -m <message>
如果有一個新的文件修改,也想提交到上一個commit中,可以使用以下命令來保持相同的提交信息:
git add .git commit --amend --no-edit
假如我們正在開發(fā)迭代功能,但是還沒開發(fā)完。這時有一個緊急的bug需要修復上線??赡芫托枰袚Q到一個hotfix分支去修復bug。這時對于開發(fā)了一部分的功能創(chuàng)建提交是沒有邏輯意義的??梢允褂靡韵氯我幻顏泶鎯π薷牡膬?nèi)容:
git stashgit stash pushgit stash push -m "<stash message>"
該命令回保存所有未提交的更改并恢復到上次提交時存儲庫的狀態(tài)。
當想再次繼續(xù)開發(fā)此功能時,就可以使用以下命令檢查所有存儲:
git stash list
這時終端中就會顯示帶有時間戳的所有已經(jīng)暫存的列表??梢允褂靡韵氯我幻顏砣』厮械母模?span style="display:none">YYQ28資訊網(wǎng)——每日最新資訊28at.com
git stash applygit stash pop
apply 和 pop 之間的區(qū)別在于,pop 應用了 stash 中的更改并將其也從 stash 中刪除,但 apply 即使在應用后仍將更改保留在 stash 中。
可以使用以下任一命令應用存儲列表中的第 N 個存儲:
git stash apply stash@{N}git stash apply <n>
整個過程的輸出如下:
在不同分支之間進行代碼合并時,通常會有兩種情況:一種情況是需要另一個分支的所有代碼變動,那么就可以直接合并(git merge),另一種情況是只需要部分代碼的變動(某幾次提交),這時就可以使用以下命令來合并指定的提交:
git cherry-pick <commit hash>
建議添加 -x 標志,因為它會生成標準化的提交消息,通知用戶它是從哪里pick出來的:
git cherry-pick -x <commit hash>
那么這個commit hash是從哪里來的呢?可以在需要被合并的分支上執(zhí)行以下命令:
git log
這時終端就會顯示出所有的提交信息:
這里黃色文字中commit后面的部分就是commit hash,復制即可。
Git允許我們在本地檢查特定的提交。輸入以下命令就可以查看有關當前提交的詳細信息:
git show
輸出的結構如下,可以看到,它顯示出了上次提交的commit id、作者信息(郵箱和姓名)、提交日期、commit message、代碼diff等:
還可以使用HEAD~n語法或提交哈希來檢查過去的提交。使用以下命令就可以獲取往前數(shù)的第三次提交的詳細信息:
git show HEAD~3
除此之外,還可以添加一個--oneline標志,以簡化輸出信息:
git show --oneline
這樣提交信息就簡潔了很多:
可以使用以下命令來返回每個貢獻者的commit次數(shù)以及每次commit的commit message:
$ git shortlog
其可以添加兩個參數(shù):
加上這兩個參數(shù)之后就可以看到每個用戶中的提交次數(shù)以及排名情況:
git shortlog -sn
這樣就會顯示出該項目所有貢獻者的commit次數(shù),從上到下依次減?。?span style="display:none">YYQ28資訊網(wǎng)——每日最新資訊28at.com
除此之外,還可以添加一個--no-merges標志,以忽略合并提交的次數(shù):
git shortlog -sn --no-merges
git rev-list 用于列出倉庫中的提交(commit)記錄。它按照時間倒序顯示提交記錄,并可以根據(jù)不同的選項和參數(shù)進行篩選和排序。
下面是git rev-list的一些基本用法:
列出所有提交記錄:
git rev-list
這將顯示倉庫中所有的提交記錄,按照時間倒序排列。每個提交記錄都有一個唯一的SHA-1哈希值作為標識。
列出某個分支的提交記錄:
git rev-list <branch-name>
將<branch-name>替換為你要查看的分支的名稱。這將顯示該分支上的所有提交記錄。
列出某個提交之后的提交記錄:
git rev-list <commit-id>..
將<commit-id>替換為你要查看的提交的SHA-1哈希值。這將顯示該提交之后的所有提交記錄。
列出兩個提交之間的提交記錄:
git rev-list <commit-id1>..<commit-id2>
將<commit-id1>和<commit-id2>替換為你要查看的兩個提交的SHA-1哈希值。這將顯示從<commit-id1>到<commit-id2>之間的所有提交記錄。
列出某個文件的所有提交記錄:
bash復制代碼git rev-list -- <file-path>
將<file-path>替換為你要查看的文件的路徑。這將顯示涉及該文件的所有提交記錄。
git notes允許用戶為Git對象(如提交、樹、標簽等)添加注釋或備注信息。這些注釋信息是以鍵值對的形式存儲的,其中鍵是一個唯一的引用,而值則是與該引用關聯(lián)的注釋內(nèi)容。
要使用git notes,可以按照以下步驟進行操作:
添加注釋:使用git notes add -m "Your note message" <object>命令向一個對象添加注釋。例如,要向提交abc123添加注釋,可以執(zhí)行git notes add -m "This is a note for commit abc123" abc123。
git blame 用于追溯文件歷史修改記錄,它可以顯示指定文件中每一行代碼的最后修改者以及修改時間,幫助開發(fā)者了解代碼的演變過程。
以按照以下步驟使用git blame命令:
git blame命令將列出文件的每一行,并顯示最后一次修改該行的提交信息,包括提交的哈希值、作者、修改時間和提交注釋等。這樣,你可以輕松地找到代碼中引入bug的提交,或者識別特定代碼段的貢獻者。
除了基本的用法,git blame命令還接受一些參數(shù)來調(diào)整輸出。例如,使用-L <start>,<end>參數(shù)可以指定查看的行范圍,只顯示指定行范圍內(nèi)的代碼修改信息。使用-p參數(shù)可以顯示每一行的詳細信息,包括提交的哈希值、作者、時間戳和行號。此外,還可以使用-C和-M選項來查找代碼重命名和移動的情況,以便更好地追蹤代碼的變化。
git archive 用于創(chuàng)建存檔(archive)文件,通常是一個壓縮文件,包含了Git倉庫中的特定文件或目錄。這個命令允許你將Git倉庫中的文件打包成一個獨立的文件,方便備份、傳輸或發(fā)布。
要使用git archive命令,需要指定存檔文件的格式(如.zip、.tar等),以及要包含的文件或目錄。以下是一些常用的git archive命令的用法:
git archive --format=tar --prefix=my-project/ HEAD | gzip > my-project.tar.gz
這個命令將創(chuàng)建一個名為my-project.tar.gz的壓縮文件,其中包含了當前分支(HEAD)的最新代碼。--prefix選項用于在存檔文件中添加一個前綴目錄my-project/。
git archive --format=zip --output=my-files.zip path/to/file1 path/to/file2
這個命令將創(chuàng)建一個名為my-files.zip的壓縮文件,其中只包含了指定的文件或目錄。你可以通過路徑來指定要包含的文件或目錄。
注意,git archive命令只會包含文件的當前版本,而不會包含Git的元數(shù)據(jù)(如提交歷史、分支信息等)。因此,存檔文件主要用于備份或發(fā)布代碼,而不是作為完整的Git倉庫來使用。
git verify-commit用于驗證提交(commit)的GPG簽名。GPG(GNU Privacy Guard)是一種加密軟件,可以用于為Git提交添加數(shù)字簽名,以確保提交的完整性和真實性。
要使用git verify-commit命令,需要先確保已經(jīng)為Git配置了GPG簽名,并且至少有一個提交是帶有GPG簽名的。然后按照以下步驟進行操作:
git verify-commit命令將檢查指定提交的GPG簽名,并輸出驗證結果。如果簽名有效且未被篡改,命令將顯示“Good signature”或類似的消息。如果簽名無效或存在問題,命令將顯示相應的錯誤消息。
除了基本的用法,git verify-commit命令還接受一些參數(shù)來調(diào)整輸出和行為。例如,使用--raw參數(shù)可以打印原始的GPG狀態(tài)輸出,而不是人類可讀的輸出。使用--verbose參數(shù)可以打印提交對象的詳細內(nèi)容,以便更詳細地了解驗證過程。
注意,要使用git verify-commit命令,必須已經(jīng)為Git配置了GPG簽名,并且至少有一個提交是帶有GPG簽名的。如果提交沒有簽名或簽名無效,該命令將無法驗證提交的真實性。
可以使用以下命令來查看遠程倉庫:
git remote
該命令會列出指定的每一個遠程服務器的簡寫。如果已經(jīng)克隆了遠程倉庫,那么至少應該能看到 origin ,這是 Git 克隆的倉庫服務器的默認名字:
可以執(zhí)行以下命令來獲取遠程倉庫的地址:
git remote -v
其中fetch是獲取,push是推送:
可以使用以下命令來查看更加詳細的信息:
git remote show origin
輸出結果如下:
可以使用以下命令來將本地項目鏈接到遠程倉庫:
git remote add <remote_name> <remote_url>
其中:
該命令允許 Git 跟蹤遠程存儲庫并將本地存儲庫連接到遠程倉庫。
可以使用命令來移除遠程倉庫:
git remote rm origin
需要注意,該命令只是從本地移除遠程倉庫的記錄(也就是解除本地倉庫和遠程倉庫的關系),并不會真正影響到遠程倉庫。
可以使用以下命令來從遠程倉庫獲取最新版本到本地倉庫,不會自動merge(合并數(shù)據(jù)):
git fetch
由于該命令不會自定合并數(shù)據(jù),所以該命令執(zhí)行完后需要手動執(zhí)行 git merge 遠程分支到所在的分支。
可以使用以下命令來將遠程指定分支拉取到本地指定分支上:
git pull origin <遠程分支名>:<本地分支名>
使用以下命令來將遠程指定分支拉取到本地當前分支上:
git pull origin <遠程分支名>
使用以下命令開將與本地當前分支同名的遠程分支拉取到本地當前分支上:
git pull
注意:如果當前本地倉庫不是從遠程倉庫克隆,而是本地創(chuàng)建的倉庫,并且倉庫中存在文件,此時再從遠程倉庫拉取文件的時候會報錯(fatal: refusing to merge unrelated histories ),解決此問題可以在git pull命令后加入?yún)?shù)--allow-unrelated-histories,即:
git pull --allow-unrelated-histories
可以使用以下命令將本地指定分支推送到遠程指定分支上:
git push origin <本地分支名>:<遠程分支名>
可以使用以下命令將本地指定分支推送到與本地當前分支同名的遠程分支上:
git push origin <本地分支名>
使用以下命令將本地當前分支推送到與本地當前分支同名的遠程分支上:
git push
可以使用以下命令來將本地分支與遠程同名分支相關聯(lián):
git push -u origin <本地分支名>
由于遠程庫是空的,第一次推送master分支時,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯(lián)起來,在以后的推送或者拉取時就可以簡化命令為git push。
如果只是簡單地從工作目錄中手工刪除文件,運行 git status 時就會在 Changes not staged for commit 的提示
可以使用以下命令將文件從暫存區(qū)和工作區(qū)中刪除:
git rm <filename>
如果刪除之前修改過并且已經(jīng)放到暫存區(qū)域的話,則必須要用強制刪除選項 -f:
git rm -f <filename>
如果想把文件從暫存區(qū)域移除,但仍然希望保留在當前工作目錄中,換句話說,僅是從跟蹤清單中刪除,使用 --cached 選項即可:
git rm --cached <filename>
可以使用以下命令進行遞歸刪除,即如果后面跟的是一個目錄做為參數(shù),則會遞歸刪除整個目錄中的所有子目錄和文件:
git rm –r *
進入某個目錄中,執(zhí)行此語句,就會刪除該目錄下的所有文件和子目錄。
取消修改有三種情況:
未使用 git add 將修改文件添加到暫存區(qū)這種情況下,可以使用以下命令來撤銷所有還沒有加入到緩存區(qū)的修改:
git checkout -- <filename>
需要注意,此文件不會刪除新建的文件,因為新建的文件還沒加入到Git管理系統(tǒng)重,所以對Git來說事未知的,需要手動刪除。
已使用 git add 將修改文件添加到暫存區(qū),未使用 git commit 提交緩存這種情況下,相當于撤銷了 git add 命令對于文件修改的緩存:
git reset HEAD <filename>
上面的命令可以撤銷指定文件的緩存,要想放棄所有文件的緩存,可以執(zhí)行以下命令:
git reset HEAD
需要注意,在使用此命令后,本地的修改并不會消失,而會回到第一種情況。要想撤銷本地的修改,執(zhí)行第一種情況中的命令即可。
除此之外,還可以指定返回到N次提交之前的階段,執(zhí)行以下命令即可:
git reset HEAD~N
這樣就能退回到n個版本之前,同樣不會修改本地文件的內(nèi)容,這些新的內(nèi)容會變成未更新到緩存區(qū)的狀態(tài)。
已使用 git commit 提交緩存這種情況下,可以使用以下命令來回退到上一次 commit 的狀態(tài):
git reset --hard HEAD^
也可以使用以下命令來回退到任意版本:
git reset --hard <commit_id>
注意,使用 git log 命令來查看 git 提交歷史和 commit id。
這是一個很重要的命令,假如回退到某個舊版本,現(xiàn)在想恢復到新版本,又找不到新版本的commit id怎么辦?Git 提供了下面的命令用來記錄每一次命令:
git reflog show HEADgit reflog
執(zhí)行之后輸出如下:
可以看到,最左側(cè)黃色字體就是修改的 commit id,根據(jù)這個id就可以將代碼恢復到對應節(jié)點位置。HEAD@{n}表示HEAD更改歷史記錄,最近的操作在上面。
假如需要把代碼回退到HEAD@{5}處,可以執(zhí)行以下命令:
git reset --hard HEAD@{5}
或者執(zhí)行下面的命令:
git reset --hard 8a0fd74
需要注意,如果有任何本地修改,該命令也會將其銷毀,因此在reset
之前建議使用stash
將本地修改儲存。
git clean 用于從工作目錄中刪除未跟蹤的文件。這些文件通常是那些由編輯器、構建過程或其他工具生成的臨時文件或副產(chǎn)品,而不是Git倉庫中的一部分。使用git clean命令可以幫助保持工作目錄的整潔,避免這些未跟蹤的文件干擾正常的Git操作或?qū)е乱馔獾奶峤弧?span style="display:none">YYQ28資訊網(wǎng)——每日最新資訊28at.com
git clean命令的基本語法如下:
git clean [-dfnxq] [-e <pattern>] [-i] [-n] [-f] [-r | -R] [<path>...]
下面是一些常用的選項和參數(shù):
以下是一些使用git clean命令的示例:
刪除所有未跟蹤的文件和目錄:
git clean -df
僅顯示將要刪除的文件和目錄列表:
git clean -n
強制執(zhí)行刪除操作,不提示用戶確認:
git clean -f
刪除所有未跟蹤的文件和目錄,包括被.gitignore文件忽略的內(nèi)容:
git clean -dfx
注意,使用git clean命令時要小心,確保不會誤刪除重要的文件。在執(zhí)行刪除操作之前,最好先使用-n選項來預覽要刪除的內(nèi)容。
git rm 和 git clean 都是刪除文件,那他們之間有什么區(qū)別呢?
標簽指的是某個分支某個特定時間點的狀態(tài),通過標簽可以很方便的了解到標記時的狀態(tài)。
標簽有兩種類型 :
可以使用以下命令來獲取所有標簽:
git tag
它會列出所有標簽的名稱:
可以使用以下命令來查看某一個標簽的詳細信息:
git show <tag_name>
還可以根據(jù)條件來顯示標簽,比如列出以v1.開頭的所有tag:
git tag -l "v1."
可以使用以下命令在本地創(chuàng)建新標簽:
git tag <tag_name>
例如:
git tag v1.0.0
通常遵循的命名模式如下:
v<major>.<minor>.<patch>
除此之外,我們還可以為特定的commit創(chuàng)建標簽,其命令格式如下:
git tag <tagname> <commit_sha>
以上面的的形式創(chuàng)建的標簽都屬于輕量標簽,下面來看看如何創(chuàng)建一個附注標簽。
在創(chuàng)建標簽時,可以添加一個-a
標志以創(chuàng)建一個帶備注的標簽,備注信息使用-m message
來指定:
git tag -a <tagname> -m "<message>"
標簽創(chuàng)建完成之后就可以使用以下命令將其推送到遠程倉庫:
git push origin --tags
以上命令會將本地所有tag都推送到遠程倉庫。如果想推送指定標簽,可以執(zhí)行以下命令:
git push origin <tagname>
可以使用以下命令來切換標簽:
git checkout <tagname>
可以使用以下命令來刪除本地倉庫指定標簽:
git tag -d <tagname>
可以使用以下命令來刪除遠程倉庫指定標簽:
git push origin :refs/tags/<tagname>
也可以使用以下命令來刪除遠程倉庫的指定標簽:
git push origin --delete <tagname>
可以使用以下命令來將遠程倉庫的標簽拉?。ㄍ剑┑疆斍胺种В?span style="display:none">YYQ28資訊網(wǎng)——每日最新資訊28at.com
git fetch --tags
檢出標簽實際上就是在標簽的基礎上進行其他開發(fā)或操作。需要以標簽指定的版本為基礎版本,新建一個分支,繼續(xù)其他的操作。執(zhí)行以下命令即可:
git checkout -b <branch> <tagname>
git verify-tag 用于驗證標簽(tag)的 GPG 簽名。GPG(GNU Privacy Guard)是一種用于文件簽名的工具,它可以確保標簽的完整性和真實性,防止標簽被篡改或偽造。
要使用 git verify-tag 命令,需要先確保已經(jīng)為 Git 配置了 GPG 簽名。然后,可以按照以下步驟進行操作:
git verify-tag 命令將檢查指定標簽的 GPG 簽名,并輸出驗證結果。如果簽名有效且未被篡改,命令將顯示 "Good signature" 或類似的消息。如果簽名無效或存在問題,命令將顯示相應的錯誤消息。
除了基本的用法,git verify-tag 命令還接受一些參數(shù)來調(diào)整輸出和行為。例如,使用 --raw 參數(shù)可以打印原始的 GPG 狀態(tài)輸出,而不是人類可讀的輸出。使用 --verbose 參數(shù)可以打印標簽對象的詳細內(nèi)容,以便更詳細地了解驗證過程。
可以使用以下命令來查看分支的歷史提交信息:
git log
這是其最基礎的用法,輸出如下:
可以看到,終端上輸出了該分支近期的提交記錄,它包含了所有貢獻者的提交。
如果想只看某個人的提交,可以添加過濾條件:
git log --author="username"
當然也可以搜索多個作者的提交信息,只需要在用|分隔用戶名即可,注意需要使用/來對|進行轉(zhuǎn)義:
git log --author="username1/|usernmae2"
這里列出的是每次提交的詳細信息,如果指向看到每個提交的概要,可以在命令中添加--oneline
標志:
git log --author="username" --oneline
除了可以按照作者來查看日志之外,還可以按照時間查看日志??梢圆榭茨硞€時間之前的日志,也可以查看某個日期之后的日志:
//某個日期之后git log --since=<date>git log --after=<date>//某個日期之前git log --until=<date>git log --before=<date>
如果想查看某個具體時間區(qū)間之間的日志,可以組合以上參數(shù):
git log --since="2022.05.15" --until="2022.05.20"
如果我們想查看某個文件都在哪些提交中修改了內(nèi)容,也是可以的。使用以下命令即可:
git log -- <path>
比如查看README.md文件的修改記錄:
在歷史提交中可能會有很多次合并的提交記錄,想要只查看代碼合并的記錄,可以執(zhí)行以下命令:
git log --merges
如果想查看非合并操作的操作記錄,可以執(zhí)行以下命令:
git log --no-merges
可以按照分支查看日志,如果想查看test分支比master分支多提交了哪些內(nèi)容,就可以執(zhí)行以下命令:
git log master..test
相反,如果想看master分支比test分支多提交了哪些內(nèi)容,就可以執(zhí)行以下命令:
git log test..master
git log命令可以用來查看提交歷史,此命令的問題在于,隨著項目復雜性的增加,輸出變得越來越難閱讀??梢允褂靡韵旅顏砻阑罩镜妮敵觯?span style="display:none">YYQ28資訊網(wǎng)——每日最新資訊28at.com
git log --graph --oneline --decorate
輸出結果如下,這樣就能看到更簡潔的細分以及不同分支如何連接在一起:
上面我們提到了,可以使用--oneline標志來簡化日志的輸出:
git log --oneline
可以使用--stat標志來簡要顯示文件增改行數(shù)統(tǒng)計,每個提交都列出了修改過的文件,以及其中添加和移除的行數(shù),并在最后列出所有增減行數(shù)小計:
git log --stat
可以添加-N標志來僅顯示最近N次的提交,其中N是一個正整數(shù),例如查看最近三次提交:
git log -3
可以使用-p標志來展開顯示每次提交的內(nèi)容差異對比:
git log -p
注意,以上這些命令標識符都可以組合使用。
git diff 命令可以用來比較文件的不同,即比較文件在暫存區(qū)和工作區(qū)的差異。
當工作區(qū)有改動,暫存區(qū)為空時, diff對比的是工作區(qū)與最后一次commit提交的共同文件;當工作區(qū)有改動,暫存區(qū)不為空時,diff對比的是工作區(qū)與暫存區(qū)的共同文件。
當已緩存改動時,可以使用以下任一命令來顯示暫存區(qū)(已add但未commit文件)和最后一次commit(HEAD)之間的所有不相同文件的差異對比:
git diff --cachedgit diff --staged
可以使用以下命令來顯示工作目錄(已修改但未add文件)和暫存區(qū)(已add但未commit文件)與最后一次commit之間的的所有不相同文件的差異對比:
git diff HEAD
可以使用以下命令來比較兩個分支上最后 commit 的內(nèi)容的差別:
git diff <分支名1> <分支名2>
這樣就可以顯示出兩個分支的詳細差異,如果只是想看有哪些文件存在差異,可以在命令中添加--stat
標志,這樣就不會顯示每個文件的內(nèi)容的詳細對比:
git diff <分支名1> <分支名2> --stat
git bisect 采用二分查找算法來幫助開發(fā)者快速定位引入問題的提交。當在代碼庫中遇到錯誤,但不確定何時引入時,git bisect可以顯著提高查找錯誤的效率。
原理:git bisect使用二分查找算法來縮小引入問題的提交范圍。它首先將提交歷史分為兩半,然后詢問開發(fā)者哪一半包含引入錯誤的提交?;陂_發(fā)者的反饋,git bisect會繼續(xù)將范圍縮小到更小的一半,直到找到引入問題的確切提交。
使用git bisect的基本步驟如下:
假設發(fā)現(xiàn)了一個錯誤。不確定這個錯誤是在何時引入的,但是知道在某個特定版本的代碼中該錯誤是不存在的。
GitLens 是一個VS Code插件,可以用來查看項目的提交記錄、文件修改記錄、顯示每行代碼的提交記錄等。通過豐富的可視化和強大的比較命令獲得有價值的見解。
Git History 是一個VS Code插件,增強了Git 的功能,它可以用來查看日志信息,查看和搜索歷史,進行分支對比、提交對比,跨提交對比文件等。
Git Automator 是一個VS Code插件,主要用來自動化Git提交消息和 Git 工作流程。它允許用一個快捷方式添加和提交文件。它還為提交信息提供了自動填充功能。當動作很明顯時,例如你刪除了一個文件,Git Automator 會猜測該動作并將其添加到預填充的提交消息中。
LearnGitBranching 是一個 git 存儲庫可視化工具、沙箱和一系列教程和挑戰(zhàn)。它的主要目的是幫助開發(fā)人員通過可視化的力量來理解 git。這是通過不同級別的游戲來熟悉不同的git命令來實現(xiàn)的。
Github:https://github.com/pcottle/learnGitBranching。
本文鏈接:http://www.www897cc.com/showinfo-26-75313-0.htmlGit 不用背,這篇文章幫助你簡化 Git 的學習過程
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 淺談鏈路聚合,你學會了嗎?