本文主要介紹了git的基本操作,包括git remote update和git stash。其中,git remote update用于與遠(yuǎn)程倉(cāng)庫(kù)保持同步,git stash用于臨時(shí)保存工作草稿。
最基本的git操作無(wú)非包括git add、git commit、git checkout、git pull、git push,但是除此之外工作中還會(huì)應(yīng)用到很多其他的git操作,我這里列舉了一些最近工作中使用到的一些git功能,分享給大家!
1 git remote update
當(dāng)你使用Git進(jìn)行版本控制時(shí),你可能會(huì)和其他人一起協(xié)作開(kāi)發(fā)一個(gè)項(xiàng)目。在這種情況下,你需要與遠(yuǎn)程倉(cāng)庫(kù)保持同步,確保你能獲取到其他團(tuán)隊(duì)成員所做的更改。每次開(kāi)始創(chuàng)建分支或者計(jì)劃提交之前,最好使用git remote update來(lái)更新一下遠(yuǎn)端的分支信息到本地,以防止未更新而基于舊的版本進(jìn)行開(kāi)發(fā),避免完成工作之后merge沖突等問(wèn)題。
2 git stash
git stash 是一個(gè)非常有用的命令,它幫助你在處理一些臨時(shí)的工作或者當(dāng)你需要切換到另一個(gè)任務(wù)時(shí),能夠暫時(shí)“隱藏”你當(dāng)前的工作進(jìn)度。想象一下,你正在寫一篇文章,突然接到一個(gè)緊急電話,需要立刻去處理別的事情。這時(shí)候,你不想丟失已經(jīng)寫下的內(nèi)容,但又不得不馬上離開(kāi)。Git stash 就像是快速保存你的工作草稿,等你回來(lái)后可以繼續(xù)從你停下的地方開(kāi)始。
創(chuàng)建一個(gè)stash:
當(dāng)你有一些未提交的改動(dòng),并且想暫時(shí)把這些改動(dòng)放到一邊,你可以使用 git stash save <message> 命令。這里的 <message> 是可選的,用來(lái)描述這次stash的內(nèi)容。如果不加任何消息,默認(rèn)也會(huì)創(chuàng)建一個(gè)stash。
git stash save "暫時(shí)保存未完成的功能"
查看stash列表:
你可以使用 git stash list 查看所有已有的stash列表,每個(gè)stash都有一個(gè)編號(hào)和描述信息。
git stash list
應(yīng)用stash:
如果你想把某個(gè)stash應(yīng)用回你的工作目錄,可以使用 git stash apply <stash>。如果你只寫了 git stash apply,默認(rèn)會(huì)應(yīng)用最近的一次stash。
git stash apply
或者如果你想在應(yīng)用的同時(shí)刪除stash(類似于“一次性使用”),可以使用 git stash pop。
git stash pop
清理stash:
如果你不再需要某些stash了,可以使用 git stash drop <stash> 來(lái)刪除特定的stash。如果你想清除所有的stash,可以使用 git stash clear。
git stash clear
3 .gitignore和.gitkeep
當(dāng)你在使用Git管理項(xiàng)目的時(shí)候,經(jīng)常會(huì)遇到一些文件或目錄,你不希望它們被納入版本控制系統(tǒng)中。比如編譯生成的二進(jìn)制文件、日志文件、臨時(shí)文件或者是包含敏感信息的配置文件等等。這些文件通常不需要被版本控制,因?yàn)樗鼈円词亲詣?dòng)生成的,要么包含私密數(shù)據(jù),不適合公開(kāi)共享。
.gitignore 文件
.gitignore 文件就像是一個(gè)清單,告訴Git哪些文件和目錄不需要被跟蹤。它可以幫你過(guò)濾掉那些不需要提交到倉(cāng)庫(kù)的文件,讓倉(cāng)庫(kù)保持整潔,并保護(hù)隱私。
創(chuàng)建 .gitignore 文件
假設(shè)你在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為 .gitignore 的文件,這個(gè)文件的名字前綴必須是一個(gè)點(diǎn)(.),表示這是一個(gè)隱藏文件。在這個(gè)文件里,每行寫一個(gè)模式,Git會(huì)根據(jù)這些模式來(lái)決定忽略哪些文件或目錄。
示例
假設(shè)你有一個(gè)Python項(xiàng)目,你可能不想將虛擬環(huán)境目錄和一些日志文件加入版本控制。你可以在項(xiàng)目的根目錄下創(chuàng)建一個(gè) .gitignore 文件,并添加以下內(nèi)容:
# 忽略Python虛擬環(huán)境
venv/
# 忽略日志文件
*.log
# 忽略Thumbs.db文件(Windows系統(tǒng))
Thumbs.db
上面的.gitignore文件告訴Git忽略所有位于venv/目錄下的文件和子目錄,忽略所有擴(kuò)展名為.log的文件,以及忽略名為Thumbs.db的文件。
使用 .gitignore 文件
當(dāng)你創(chuàng)建了一個(gè)新的.gitignore文件或修改了現(xiàn)有的文件后,Git會(huì)自動(dòng)應(yīng)用新的規(guī)則。但是,如果某個(gè)已經(jīng)被跟蹤的文件現(xiàn)在被加入了.gitignore文件,Git不會(huì)自動(dòng)刪除該文件的歷史記錄。你可以選擇使用git rm --cached <file>命令來(lái)取消對(duì)文件的跟蹤,但保留文件在本地磁盤上。
.gitkeep 文件
有時(shí)候,你會(huì)有一些空的目錄需要被Git跟蹤,以便于保持項(xiàng)目結(jié)構(gòu)清晰。但是Git默認(rèn)不會(huì)跟蹤空目錄。為了告訴Git跟蹤這些空目錄,你可以在空目錄內(nèi)創(chuàng)建一個(gè)名為.gitkeep的文件。
創(chuàng)建 .gitkeep 文件
創(chuàng)建一個(gè)空文件,命名為.gitkeep,然后把它放在你希望Git跟蹤的空目錄內(nèi)。這個(gè)文件的作用就是讓Git知道這個(gè)目錄不是真的空,而是有意留空的。
示例
假設(shè)你有一個(gè)名為data的目錄,它目前是空的,但是你希望Git能夠跟蹤這個(gè)目錄的存在。你可以在data目錄內(nèi)創(chuàng)建一個(gè).gitkeep文件:
mkdir data
touch data/.gitkeep
這樣,Git就會(huì)把這個(gè)空的data目錄也納入版本控制,保證項(xiàng)目結(jié)構(gòu)的完整性。
4 git patch
git patch 不是一個(gè)直接的Git命令,這里指的是使用Git來(lái)生成補(bǔ)丁文件(patch files),這些文件包含了對(duì)代碼庫(kù)的更改。補(bǔ)丁文件是一種文本文件,它們包含了文件差異(diffs),可以用來(lái)在另一個(gè)副本中重現(xiàn)這些更改。
什么是補(bǔ)丁文件?
補(bǔ)丁文件是一個(gè)文本文件,它記錄了兩個(gè)文件或兩個(gè)目錄之間的一系列差異。這些差異包括添加、刪除或修改的行。補(bǔ)丁文件可以應(yīng)用于另一個(gè)相同或相似的文件或目錄,從而將這些差異應(yīng)用上去,達(dá)到“修補(bǔ)”的效果。
Git生成補(bǔ)丁文件的方法
在Git中,你可以使用幾種不同的命令來(lái)生成補(bǔ)丁文件。最常用的是git diff 和 git format-patch 命令。
使用 git diff
git diff 命令可以顯示兩個(gè)版本之間的差異,這些差異可以被重定向到一個(gè)文件中,成為補(bǔ)丁文件。例如,如果你想要生成當(dāng)前工作目錄與最后一次提交之間的差異作為補(bǔ)丁文件,你可以這樣做:
git diff > mypatch.patch
這會(huì)生成一個(gè)名為 mypatch.patch 的文件,里面包含了當(dāng)前工作目錄與最后一次提交之間的差異。
使用 git format-patch
git format-patch 命令則更加高級(jí),它不僅可以生成補(bǔ)丁文件,還可以將補(bǔ)丁文件格式化為郵件格式,方便通過(guò)電子郵件發(fā)送給項(xiàng)目維護(hù)者或其他貢獻(xiàn)者。
生成單個(gè)補(bǔ)丁文件
如果你想要為當(dāng)前分支上的最后一次提交生成一個(gè)補(bǔ)丁文件,可以使用如下命令:
git format-patch HEAD~1
這將會(huì)在當(dāng)前目錄下生成一個(gè)補(bǔ)丁文件,文件名通常是 0001-<commit_message>.patch 格式。
生成一系列補(bǔ)丁文件
如果你想要為一系列提交生成多個(gè)補(bǔ)丁文件,可以使用下面的命令:
git format-patch <start-commit>..<end-commit>
例如,如果你想要為HEAD~5到HEAD之間的所有提交生成補(bǔ)丁文件,可以這樣寫:
git format-patch HEAD~5..HEAD
這將在當(dāng)前目錄下生成一系列按順序編號(hào)的補(bǔ)丁文件。
應(yīng)用補(bǔ)丁文件
一旦你有了補(bǔ)丁文件,你可以使用 git apply 命令來(lái)應(yīng)用這些補(bǔ)丁。例如,如果你有一個(gè)名為 mypatch.patch 的補(bǔ)丁文件,你可以這樣應(yīng)用它:
git apply mypatch.patch
5 git squash
git squash 是一種在Git中合并多個(gè)提交成一個(gè)單一提交的技術(shù)。想象一下,你在做一項(xiàng)復(fù)雜的任務(wù)時(shí),可能會(huì)產(chǎn)生很多中間的提交,比如修復(fù)一個(gè)小bug、添加一些測(cè)試代碼、調(diào)整樣式等。這些提交雖然一步一步地推動(dòng)了項(xiàng)目的進(jìn)展,但它們單獨(dú)看起來(lái)可能顯得雜亂無(wú)章。使用git squash,你可以把這些相關(guān)的提交合并成一個(gè)干凈、簡(jiǎn)潔的提交記錄,使得你的提交歷史更加清晰易讀。
為什么使用 git squash?
整理提交歷史:有時(shí)候,你可能做了很多小的修改,這些修改最終構(gòu)成了一個(gè)大的功能。通過(guò)git squash,你可以把這些修改合并成一個(gè)邏輯上完整的提交,使得其他人查看你的提交歷史時(shí)更加容易理解。
保持歷史簡(jiǎn)潔:當(dāng)你在進(jìn)行開(kāi)發(fā)時(shí),可能會(huì)有一些實(shí)驗(yàn)性的提交或者一些臨時(shí)的調(diào)試代碼。這些提交并不需要保留在最終的提交歷史中,git squash 可以幫助你清理這些雜亂的部分。
便于代碼審查:在團(tuán)隊(duì)協(xié)作中,提交歷史的整潔程度直接影響到代碼審查的效率。通過(guò)git squash,你可以減少審查者的負(fù)擔(dān),讓他們更容易集中注意力在重要的變更上。
如何使用 git squash
git本身沒(méi)有一個(gè)直接叫做git squash的命令,而是通過(guò)git rebase來(lái)實(shí)現(xiàn)git squash的效果。下面是一個(gè)簡(jiǎn)單的步驟來(lái)演示如何使用git rebase來(lái)進(jìn)行g(shù)it squash:
確保你在正確的分支上:首先,確保你處于你想要合并提交的那個(gè)分支上。
git checkout my-feature-branch
列出你想要合并的提交:使用git log或者git reflog查看你想要合并的提交。
開(kāi)始交互式重新基線(rebase):使用git rebase -i命令進(jìn)入交互式重新基線模式,這里HEAD~n表示你想要合并的提交之前的提交,n是你想要保留的第一個(gè)提交。
git rebase -i HEAD~5
這會(huì)打開(kāi)一個(gè)文本編輯器(通常是vim),顯示一個(gè)列表,列出了你最近五次提交的SHA哈希值和提交信息。
選擇要合并的提交:在編輯器中,你會(huì)看到每一行都以pick開(kāi)頭,后面跟著一個(gè)提交的SHA哈希值和提交信息。對(duì)于你想要合并的提交,把pick改成squash或squash!,簡(jiǎn)稱s。
比如:
pick 7a61e01 添加功能A
pick 1b40f0d 修復(fù)功能A中的bug
pick 3a9c5f2 調(diào)整功能A的樣式
pick 4d65220 添加功能B
改成:
pick 7a61e01 添加功能A
squash 1b40f0d 修復(fù)功能A中的bug
squash 3a9c5f2 調(diào)整功能A的樣式
pick 4d65220 添加功能B
編輯合并后的提交信息:當(dāng)Git看到你選擇了squash選項(xiàng)時(shí),它會(huì)提示你編輯一個(gè)新的提交信息。這個(gè)信息將代表你合并后的所有提交。你可以在這里輸入一個(gè)新的提交信息,或者編輯合并的提交信息。
# 編輯合并后的提交信息
完成重新基線:保存并關(guān)閉編輯器后,Git會(huì)執(zhí)行合并,并將你帶回到命令行。此時(shí),你已經(jīng)成功地將多個(gè)提交合并成了一個(gè)。
推送更改:由于你改變了提交歷史,所以需要推送分支到遠(yuǎn)程倉(cāng)庫(kù)時(shí)需要加上--force參數(shù)。但是這通常是不建議的行為,git squash最好只用來(lái)處理本地分支,squash完畢之后再push到遠(yuǎn)端。
git push --force
通過(guò)這樣的步驟,你可以將一系列的小提交合并成一個(gè)邏輯上連貫的大提交,使得你的Git提交歷史更加整潔有序。這對(duì)于保持良好的項(xiàng)目文檔和提高團(tuán)隊(duì)協(xié)作效率是非常有幫助的。
6 git submodule status
git submodule status 是一個(gè)用于檢查Git子模塊狀態(tài)的命令。子模塊允許你在Git倉(cāng)庫(kù)中嵌入另一個(gè)Git倉(cāng)庫(kù),就像在一個(gè)大項(xiàng)目中包含一個(gè)獨(dú)立的庫(kù)或組件一樣。子模塊可以有自己的提交歷史和版本控制,但它們被整合到主項(xiàng)目的版本控制流程中。使用git submodule status可以幫助你了解這些子模塊的當(dāng)前狀態(tài),確保它們與你期望的狀態(tài)一致。
什么是Git子模塊?
在開(kāi)發(fā)過(guò)程中,你可能會(huì)用到一些外部庫(kù)或工具,這些庫(kù)或工具本身就是獨(dú)立的Git項(xiàng)目。例如,你可能在構(gòu)建一個(gè)Web應(yīng)用時(shí),需要用到一個(gè)第三方的JavaScript庫(kù)。在這種情況下,你可以將這個(gè)庫(kù)作為一個(gè)子模塊添加到你的主項(xiàng)目中,這樣你的項(xiàng)目就包含了這個(gè)庫(kù)的所有源碼和歷史記錄。
為什么要使用 git submodule status?
當(dāng)你在一個(gè)項(xiàng)目中有多個(gè)子模塊時(shí),了解這些子模塊的狀態(tài)是非常重要的。這包括知道它們是否已經(jīng)初始化,是否有未提交的更改,是否與遠(yuǎn)程倉(cāng)庫(kù)同步等。git submodule status 命令提供了這些信息,幫助你更好地管理子模塊。git倉(cāng)庫(kù)中保存了主倉(cāng)庫(kù)和子倉(cāng)庫(kù)的對(duì)應(yīng)關(guān)系,這些關(guān)系往往是非常重要的,不同倉(cāng)庫(kù)的版本必須嚴(yán)格對(duì)應(yīng),使用git submodule status 命令可以快速得知當(dāng)前主倉(cāng)庫(kù)的提交對(duì)應(yīng)哪些子倉(cāng)庫(kù)的提交。
如何使用 git submodule status
使用git submodule status命令,你可以查看所有子模塊的狀態(tài)。命令非常簡(jiǎn)單:
git submodule status
執(zhí)行這個(gè)命令后,你將看到一個(gè)列表,每個(gè)子模塊對(duì)應(yīng)一行,每一行包含以下信息:
SHA-1 哈希值:這是子模塊當(dāng)前指向的提交的哈希值。
子模塊路徑:這是子模塊在你的項(xiàng)目中的位置。
狀態(tài)標(biāo)志
:這一列會(huì)顯示子模塊的狀態(tài)。如果一切正常,通常會(huì)看到一個(gè)空格。如果有變化,則會(huì)顯示相應(yīng)的狀態(tài)標(biāo)志,例如:
+:表示子模塊的本地版本比其記錄的版本超前。
-:表示子模塊的本地版本落后于其記錄的版本。
D:表示子模塊的本地版本與記錄的版本有分歧。
A:表示子模塊已被添加但尚未初始化。
I:表示子模塊已初始化。
R:表示子模塊的URL已被更改。
示例
假設(shè)你有一個(gè)項(xiàng)目,其中包含了一個(gè)名為third-party-library的子模塊。你可以這樣查看它的狀態(tài):
$ git submodule status
166d2f8b3e83893f9d150c19d6f02b279e490639 third-party-library (HEAD detached at v1.2.3) +
這表明子模塊third-party-library當(dāng)前指向的提交是166d2f8b3e83893f9d150c19d6f02b279e490639,并且本地版本比記錄的版本超前(因?yàn)橛?標(biāo)志)。
7 git blame
git blame 是一個(gè)非常有用的命令,它幫助你追蹤某一行代碼是誰(shuí)在什么時(shí)候修改的。想象一下,你正在閱讀一個(gè)復(fù)雜的代碼文件,突然發(fā)現(xiàn)了一個(gè)問(wèn)題,可能是某個(gè)功能不再工作了,或者某個(gè)變量的值看起來(lái)不對(duì)勁。這時(shí)候,你可能會(huì)想知道:“這一行代碼是誰(shuí)寫的?是什么時(shí)候改的?為什么這么改?” git blame 就是用來(lái)回答這些問(wèn)題的。
什么是 git blame?
git blame 命令顯示了每一個(gè)文件行的最后修改者及其修改的時(shí)間戳和提交信息。這就像給每一行代碼打上了標(biāo)簽,告訴你這行代碼是由誰(shuí)在哪個(gè)提交中引入或修改的。
為什么使用 git blame?
查找修改者:當(dāng)你發(fā)現(xiàn)一個(gè)問(wèn)題時(shí),可以通過(guò)git blame找到最后修改那行代碼的人,從而更容易地定位問(wèn)題的原因。
了解歷史:通過(guò)查看某一行代碼的修改歷史,你可以了解為什么代碼被這樣編寫,這對(duì)理解代碼邏輯和意圖非常有幫助。
代碼審查:在團(tuán)隊(duì)協(xié)作中,git blame 可以幫助審查代碼的變更,確保代碼質(zhì)量。
如何使用 git blame
使用git blame非常簡(jiǎn)單,基本語(yǔ)法如下:
git blame [options] <file>
[options]:你可以添加一些選項(xiàng)來(lái)定制輸出,比如限制顯示的行數(shù)或顯示完整提交信息。
<file>:這是你要查看的文件名。
基本用法
如果你想查看某個(gè)文件的每一行最后被誰(shuí)修改,可以直接運(yùn)行:
git blame <file>
例如,如果你有一個(gè)名為app.js的文件,你可以這樣查看:
git blame app.js
輸出結(jié)果會(huì)顯示每一行代碼對(duì)應(yīng)的提交信息,包括提交者的姓名、日期和提交的摘要信息。
示例輸出
假設(shè)你運(yùn)行了git blame app.js,輸出可能是這樣的:
9e15a148 (Alice Smith 2024-01-01 10:30:00 +0800) 1: function greet() {
9e15a148 (Alice Smith 2024-01-01 10:30:00 +0800) 2: console.log('Hello!');
c6f3b47a (Bob Lee 2024-01-02 14:15:00 +0800) 3: // Added a comment for clarity.
9e15a148 (Alice Smith 2024-01-01 10:30:00 +0800) 4: }
每一行的輸出包含以下信息:
SHA-1哈希值(如9e15a148):這是最后一次修改該行的提交的唯一標(biāo)識(shí)符。
提交者的姓名(如Alice Smith)。
提交的日期和時(shí)間(如2024-01-01 10:30:00 +0800)。
提交信息摘要(如function greet())。
行號(hào)(如1:)。
實(shí)際的代碼行內(nèi)容。
更多選項(xiàng)
git blame 還支持許多選項(xiàng)來(lái)定制輸出,例如:
如果你想查看app.js文件第5行到第10行的修改歷史,可以這樣運(yùn)行:
1git blame -L 5,10 app.js
實(shí)際場(chǎng)景中的應(yīng)用
假設(shè)你在開(kāi)發(fā)一個(gè)Web應(yīng)用,突然發(fā)現(xiàn)用戶登錄功能出現(xiàn)了問(wèn)題。你不確定是什么時(shí)候引入的這個(gè)問(wèn)題,也不知道是誰(shuí)修改了這部分代碼。你可以使用git blame來(lái)追蹤:
找到出現(xiàn)問(wèn)題的文件,比如login.js。
運(yùn)行 git blame login.js 查看每一行的修改記錄。
發(fā)現(xiàn)第15行的代碼有問(wèn)題,然后看到這條記錄是由Bob在兩天前的提交中修改的。
通過(guò)這種方式,你可以快速定位問(wèn)題的來(lái)源,并聯(lián)系Bob詢問(wèn)他當(dāng)時(shí)的修改原因,從而更快地解決問(wèn)題。
8 git status | grep ...
想象一下,在一個(gè)大型工程中,一次編譯會(huì)產(chǎn)生非常多的產(chǎn)物,這些產(chǎn)物可能都會(huì)影響到了倉(cāng)庫(kù)狀態(tài),而如果我們只想關(guān)注哪些源文件發(fā)生了變化,這個(gè)時(shí)候應(yīng)該怎么辦呢?
我們可以通過(guò)git status + grep命令來(lái)解決這個(gè)問(wèn)題。
git status --short | grep '\.(c|h)$'
git status --short:輸出一個(gè)簡(jiǎn)潔的格式,每行包含一個(gè)狀態(tài)代碼和文件名。
grep '\.(c|h)$':篩選出以.c或.h結(jié)尾的文件。
結(jié)語(yǔ)
在日常的開(kāi)發(fā)工作中,Git是我們不可或缺的好幫手,它幫助我們管理代碼的版本、協(xié)同工作并追蹤每一次的改動(dòng)。從確保與遠(yuǎn)程倉(cāng)庫(kù)同步的git remote update,到臨時(shí)保存工作進(jìn)度的git stash;從避免不必要的文件被納入版本控制的.gitignore和.gitkeep,到生成補(bǔ)丁文件以便審查和應(yīng)用的git patch;從整理提交歷史、使代碼審查更加清晰的git squash,到管理子模塊狀態(tài)的git submodule status;再到追蹤代碼修改源頭的git blame,以及快速篩選特定文件改動(dòng)的git status | grep組合——這些技巧都是Git強(qiáng)大功能的一部分。本文介紹了幾個(gè)在實(shí)際工作中非常實(shí)用的Git技巧,希望能讓你的開(kāi)發(fā)體驗(yàn)更加高效和順暢。
原文來(lái)源:https://mp.weixin.qq.com/s/VhmCENaL7BjhaL-MG01x1A
來(lái)源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來(lái)源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁(yè)對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。
Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利
蘇公網(wǎng)安備32010402000125
蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司
南京思必達(dá)教育科技有限公司版權(quán)所有 百度統(tǒng)計(jì)