您好,登錄后才能下訂單哦!
小編給大家分享一下Git使用技巧有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Git,一個(gè)分布式版本控制系統(tǒng),它已經(jīng)成為了開源世界的源碼控制默認(rèn)工具,在4月7號(hào)12歲了。但是使用Git中更另人沮喪的是,你需要了解多少才能讓你更有效的使用它。同時(shí)這也是使用Git中比較美妙的一件事,因?yàn)闆]有什么比發(fā)現(xiàn)一個(gè)新的小技巧來簡(jiǎn)化或提高你的工作流的效率更加令人快樂了。
為了紀(jì)念Git的12歲生日,這篇文章提供12個(gè)訣竅與技巧來讓你的Git經(jīng)驗(yàn)更加有用和強(qiáng)大,從一些你可能會(huì)忽視的基礎(chǔ)開始到一些真正的強(qiáng)大技巧!
1. 你的 ~/.gitconfig 文件
在***次用git命令來提交一個(gè)倉庫的修改,你可能會(huì)首先看到像下面這種內(nèi)容:
*** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity.
你可能還沒有意識(shí)到那些命令正在修改~/.gitconfig文件的內(nèi)容,這個(gè)文件就是Git存儲(chǔ)全局配置選項(xiàng)的文件。通過你的~/.gitconfig文件你可要做很多事情,包括定義別名,***的打開(或關(guān)閉)一些特定的命令選項(xiàng),還可以修改Git如何工作的方面(例如:git diff使用哪個(gè)diff算法,或者默認(rèn)使用什么類型的的合并策略)。你甚至可以按條件地基于路徑包含其他配置文件到一個(gè)倉庫!使用“man git-config”查看所有細(xì)節(jié)。
2. 你的倉庫的.gitconfig文件
在之前的技巧中,你可能會(huì)想知道在git config 命令中的—global標(biāo)識(shí)是做什么的。它告訴Git更新“global”配置,也就是~/.gitconfig發(fā)現(xiàn)的這個(gè)配置。當(dāng)然,擁有一個(gè)全局的配置代表了一個(gè)本地配置,而且足夠肯定的是,如果你省略—global選項(xiàng),git config 會(huì)更新這個(gè)倉庫自己的配置,這個(gè)配置文件存儲(chǔ)在.git/config。
在.git/config中設(shè)置的選項(xiàng)會(huì)推翻在~/.gitconfig文件中的對(duì)應(yīng)設(shè)置。因此,例如,如果你需要在一個(gè)特定的倉庫中使用一個(gè)不同的郵箱地址,你可以運(yùn)行“git config user.email "also_you@example.com"”。然后,你在這個(gè)倉庫中提交會(huì)使用你單獨(dú)配置的這個(gè)郵箱地址。如果你使用一個(gè)工作的電腦在開源項(xiàng)目中工作,但是希望在這個(gè)項(xiàng)目中使用個(gè)人的郵箱地址,而其他在主Git配置中仍然使用工作郵箱,這一點(diǎn)是非常有用的。
在~/.gitconfig中可以設(shè)置的任何東西,都可以在.git/config中設(shè)置來對(duì)這個(gè)倉庫做特定設(shè)置。在下面的這些技巧中,當(dāng)我提到在你的~/.gitconfig文件中添加什么東西,同時(shí)也說明可以在特定的倉庫的.git/config中添加來設(shè)置那個(gè)選項(xiàng)。
3、別名
別名是你可以在你的~/.gitconfig文件里做的另外一件事。他的工作原理就像shell命令行里的別名——設(shè)置一個(gè)新的命令名稱來調(diào)用一個(gè)或者多個(gè)其他的命令,這些命令通常包括一些特定的選項(xiàng)或標(biāo)識(shí)。別名對(duì)于你經(jīng)常使用的那些又長(zhǎng)又復(fù)雜的命令行是非常有效的。
你可以使用git config命令來定義別名——例如,執(zhí)行”git config —global —add alias.st status”命令后,會(huì)使得執(zhí)行g(shù)it st與執(zhí)行g(shù)it status做的是同樣的事情——然而,我發(fā)現(xiàn)當(dāng)定義別名的時(shí)候,只需要直接在~/.gitconfig文件里編輯通常會(huì)更加容易。
如果你選擇這么做,你會(huì)發(fā)現(xiàn)~/.gitconfig文件就是一個(gè)INI文件,INI是一種帶有特定段落的基礎(chǔ)鍵值對(duì)文件格式。添加一個(gè)別名時(shí),你將改變[alias]段落。例如:上面提到的定義相同的git st別名,需要添加下面這段代碼:
[alias] st = status
(如果已經(jīng)有了[alias]這個(gè)段落,只需要在這個(gè)段落中添加到第二行)
4. shell命令中的別名
別名不僅僅是運(yùn)行其他Git子命令——你也可以定義別名,這些別名可以運(yùn)行其他shell命令。這是一個(gè)很好的方法來處理一個(gè)重復(fù)的、罕見的、復(fù)雜的任務(wù):一旦你已經(jīng)想到***次怎么做,那就使用一個(gè)別名保存這個(gè)命令。例如,我有幾個(gè)倉庫是我fork了一個(gè)開源項(xiàng)目,而且在本地做了一些修改,這些修改不用貢獻(xiàn)給這個(gè)項(xiàng)目。在項(xiàng)目的持續(xù)的開發(fā)的過程中我想保持***的版本,同時(shí)保留我的本地修改。為了完成這個(gè)想法,我需要定期地從upstream倉庫中合并這些修改到我的fork——我定義一個(gè)別名“upstream-merge”來完成這個(gè)操作。定義如下:
upstream-merge = !"git fetch origin -v && git fetch upstream -v && git merge upstream/master && git push"
別名定義開始的這個(gè)“!”是告訴Git來通過shell運(yùn)行這個(gè)命令。這個(gè)例子包括了運(yùn)行一些git命令,但是使用這種方式定義別名可以運(yùn)行任何shell命令。
(注意:如果你想復(fù)制我的upstream-merge別名,你將需要確認(rèn)你有一個(gè)Git remote命名為upstream來指定這個(gè)你fork的upstream倉庫。你可以通過“git remote add upstream ”來添加一個(gè)。)
5. 可視化提交圖
如果你從事的是一個(gè)有很多分支活動(dòng)的項(xiàng)目,有時(shí)可能很難掌握所有正在發(fā)生的工作以及它們之間的相關(guān)性。各種GUI工具可讓你弄清楚不同分支的概況以及在所謂的“提交圖”中提交記錄。例如,以下是我使用 GitLab 提交圖查看器進(jìn)行可視化的一個(gè)存儲(chǔ)卡的部分截圖:
John Anderson, CC BY
如果你是專注于命令行的用戶,就可以不在多個(gè)工具之間切換導(dǎo)致分心,這個(gè)工具在命令行上實(shí)現(xiàn)了類似圖形界面的提交視圖。通過 -- graph 參數(shù)獲取 git 的記錄:
John Anderson, CC BY
下面的命令可以得到一樣的倉庫可視化片段:
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
--graph 選項(xiàng)將圖表添加到日志的左側(cè), --abbrev-commit 存儲(chǔ)提交使用了 SHA 方法, --date=relative 表達(dá)式用相對(duì)的術(shù)語來表示日期,并且 --pretty 以 bit 格式處理自定義格式。我知道 git lg 的別名,它是我最常運(yùn)行的10個(gè)命令之一。
6. 更優(yōu)雅的強(qiáng)制推送(force-push)
有時(shí),就跟你盡量避免使用它一樣困難的是,你會(huì)發(fā)現(xiàn)你需要運(yùn)行 git push --force 來覆寫你倉庫的遠(yuǎn)程副本上的歷史記錄。你可能已得到了一些反饋,他們會(huì)要求你進(jìn)行交互式的變基(rebase),或者你可能已經(jīng)搞砸了,并且希望隱藏證據(jù)。
當(dāng)他人在倉庫的遠(yuǎn)程副本的同一分支上進(jìn)行改動(dòng)后,會(huì)發(fā)生強(qiáng)制推送的風(fēng)險(xiǎn)。當(dāng)你強(qiáng)制推送已重寫的歷史記錄時(shí),某些提交將會(huì)丟失。這是 git push --force-with-lease 出現(xiàn)的原因 - 如果遠(yuǎn)程分支已更新,它不會(huì)允許你執(zhí)行強(qiáng)制推送,這將確保你不會(huì)丟棄他人的工作。
7. git add -N
你是否使用過git commit -a在一次行動(dòng)中提交你所有未完成的修改,只有在你push完你的提交后才發(fā)現(xiàn)git commit -a忽略了新添加的文件?解決這個(gè)問題你可以用git add -N(“通知”)來告訴Git你想把新添加的文件包含在提交中在你***次實(shí)際提交之前。
8. git add -p
一***的實(shí)踐為當(dāng)使用Git時(shí)確保每個(gè)提交只包含一個(gè)邏輯更改--不管是修復(fù)一個(gè)bug還是(實(shí)現(xiàn))一個(gè)新功能。然而, 有時(shí)當(dāng)你工作 ,會(huì)在你的倉庫中出現(xiàn)一個(gè)以上的修改 提交 。你怎么樣把事情分開,使每個(gè)提交只包含適當(dāng)?shù)男薷哪??git add --patch來解救!
這個(gè)標(biāo)志將會(huì)使git add命令查看你工作副本中所有的變更,詢問你是否愿意將它提交,跳過,或者推遲決定(還有其他一些更強(qiáng)大的選項(xiàng),你可以通過在運(yùn)行這命令后選擇?來查看)。git add -p是一個(gè)神奇的工具來生產(chǎn)結(jié)構(gòu)良好的提交。
9. git checkout -p
與 git add -p類似,git checkout命令將使用 --patch 或 -p 選項(xiàng),這會(huì)使 git 在本地工作副本中展示每個(gè)“大塊”的改動(dòng),并允許丟棄對(duì)應(yīng)改動(dòng) —— 簡(jiǎn)單地說就是恢復(fù)本地工作副本到你改變之前的狀態(tài)。
某些場(chǎng)景下這非常有用,例如,在你跟蹤一個(gè) bug 時(shí)引入了一堆調(diào)試日志語句,在修正了這個(gè) bug 之后,你可以先使用 git checkout -p 刪除所有新加的調(diào)試日志,之后使用 git add -p 來添加 bug 修復(fù)。沒有比組合一個(gè)極好的、結(jié)構(gòu)良好的提交更令人滿意的了
10. Rebase with command execution
有些項(xiàng)目有一條規(guī)則,即存儲(chǔ)庫中的每個(gè)提交都必須處于可工作狀態(tài) - 也就是說,在每次提交時(shí),代碼應(yīng)該是可編譯的,或運(yùn)行測(cè)試套件應(yīng)該不會(huì)失敗的。當(dāng)你在某分支上工作時(shí)間長(zhǎng)時(shí),但如果你最終因?yàn)槟撤N原因需要rebase時(shí),那么跳過每個(gè)變基后的提交以確保你沒有意外引入一個(gè)中斷是有些冗長(zhǎng)乏味的。
幸運(yùn)的是,git rebase已經(jīng)支持了-x或--exec選項(xiàng)。git rebase -x 將在每次提交應(yīng)用到rebase后運(yùn)行該命令。因此,例如,如果你有一個(gè)項(xiàng)目,其中npm run tests會(huì)運(yùn)行你的測(cè)試套件,那么在rebase期間應(yīng)用每次提交后,git rebase -x npm run tests將會(huì)運(yùn)行測(cè)試套件。這使你可以查看測(cè)試套件是否在任何變基后的提交中有失敗情況,因此你可以確保測(cè)試套件在每次提交時(shí)仍能通過。
11. 基于時(shí)間修改的指南
很多Git子命令都接受一個(gè)修正的參數(shù)來決定命令作用于倉庫的哪個(gè)部分,可能是某次特定的提交的 sha1 值,或者一個(gè)分支的名稱,又或者是一個(gè)符號(hào)性的名稱如 HEAD(代表當(dāng)前檢出分支***一次的提交),除了這些簡(jiǎn)單的形式以外,你還可以附加一個(gè)指定的日期或時(shí)間作為參數(shù),表示“這個(gè)時(shí)間的引用”。
這個(gè)功能在某些時(shí)候會(huì)變得十分有用,比如當(dāng)你處理***出現(xiàn)的 bug,自言自語道:“這個(gè)功能明明昨天還是好好的,到底又改了些什么”,不用盯著滿屏的 git 日志的輸出試圖弄清楚什么時(shí)候更改了提交,您只需運(yùn)行 git diff HEAD@{yesterday},會(huì)看到從昨天以來的所有修改,這也適用于較長(zhǎng)的時(shí)間段(例如 git diff HEAD@{'2 months ago'}) ,以及一個(gè)確切的日期(例如git diff HEAD@{'2010-01-01 12:00:00'})。
您還可以將這些基于日期的修改參數(shù)與使用修正參數(shù)的任何 Git 子命令一起使用。在 gitrevisions 手冊(cè)頁中有關(guān)于具體使用哪種格式的詳細(xì)信息。
12. 全知的 reflog
你是不是試過在 rebase 時(shí)干掉過某次提交,后來又發(fā)現(xiàn)你需要保留這次提交的一些東西?你可能覺得這些提交的東西已經(jīng)永遠(yuǎn)找不回來了,只能從頭再來了。其實(shí)不然,但如果你在本地工作副本中提交了,提交就會(huì)進(jìn)入到 "引用日志" ,你仍然可以訪問到。
運(yùn)行 git reflog 將在本地工作副本中顯示當(dāng)前分支的所有活動(dòng)的列表,并為您提供每個(gè)提交的 SHA1 值。一旦發(fā)現(xiàn)你 rebase 時(shí)放棄的那個(gè)提交,你可以運(yùn)行 git checkout 來檢出該次提交,復(fù)制好你需要的信息,然后再運(yùn)行 git checkout HEAD 返回到分支***的提交去。
以上是“Git使用技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。