Image credit: XKCD
我曾經(jīng)想過:“如果有一個(gè)最常見的 Git的列表,以及它們的功能是什么,這不是極好的嗎?”
多年之后,我編制了這樣一個(gè)列表,并且給出了一些實(shí)踐,讓新手們甚至中開發(fā)人員都能從中發(fā)現(xiàn)有用的東西。
為了保持實(shí)用性,我將這個(gè)列表與我過去一周實(shí)際使用的 Git 命令進(jìn)行了比較。
幾乎每個(gè)開發(fā)人員都在使用 Git,當(dāng)然很可能是 GitHub。但大多數(shù)開發(fā)者大概有 99% 的時(shí)間只是使用這三個(gè)命令:
gitadd--all gitcommit-am"" gitpushoriginmaster
如果你只是單槍匹馬,或者參加一場(chǎng)黑客馬拉松或開發(fā)一次性的應(yīng)用時(shí),它工作得很好,但是當(dāng)穩(wěn)定性和可維護(hù)性開始成為一個(gè)優(yōu)先考慮的事情后,清理提交、堅(jiān)持分支策略和提交信息的規(guī)范性就變得很重要。
我將從常用命令的列表開始,使新手更容易了解 Git 能做什么,然后進(jìn)入實(shí)踐。
經(jīng)常使用的命令要想在倉庫中初始化 Git,你只需輸入以下命令即可。如果你沒有初始化 Git,則不能在該倉庫內(nèi)運(yùn)行任何其他的 Git 命令。
gitinit
如果你在使用 GitHub,而且正在將代碼推送到在線存儲(chǔ)的 GitHub 倉庫中,那么你正在使用的就是遠(yuǎn)程倉庫。該遠(yuǎn)程倉庫的默認(rèn)名稱(也稱為別名)為 origin。如果你已經(jīng)從 Github 復(fù)制了一個(gè)項(xiàng)目,它就有了一個(gè) origin。你可以使用命令 git remote -v 查看該 origin,該命令將列出遠(yuǎn)程倉庫的 URL。
如果你初始化了自己的 Git 倉庫,并希望將其與 GitHub 倉庫相關(guān)聯(lián),則必須在 GitHub 上創(chuàng)建一個(gè),復(fù)制新倉庫提供的 URL,并使用 git remote add origin 命令,這里使用 GitHub 提供的 URL 替換 。這樣,你就可以添加、提交和推送更改到你的遠(yuǎn)程倉庫了。
最后一條命令用在當(dāng)你需要更改遠(yuǎn)程倉庫時(shí)。如果你從其他人那里復(fù)制了一個(gè)倉庫,并希望將遠(yuǎn)程倉庫從原始所有者更改為你自己的 GitHub 帳戶。除了改用 set-url 來更改遠(yuǎn)程倉庫外,流程與 git remote add origin 相同。
gitremote-v gitremoteaddorigin gitremoteset-urlorigin
復(fù)制倉庫最常見的方式是使用 git clone,后跟倉庫的 URL。
請(qǐng)記住,遠(yuǎn)程倉庫將連接到克隆倉庫原屬于的帳戶。所以,如果你克隆了一個(gè)屬于別人的倉庫,你將無法推送到 GitHub,除非你使用上面的命令改變了 origin。
gitclone
你很快就會(huì)發(fā)現(xiàn)自己正在使用分支。如果你還不理解什么是分支,有許多其他更深入的教程,你應(yīng)該先閱讀它們,再繼續(xù)下面的操作。(這里是一個(gè)教程)
命令 git branch 列出了本地機(jī)器上的所有分支。如果要?jiǎng)?chuàng)建一個(gè)新的分支,可以使用命令 git branch ,其中 表示分支的名字,比如說 master。
git checkout 命令可以切換到現(xiàn)有的分支。你也可以使用 git checkout -b 命令創(chuàng)建一個(gè)新的分支并立即切換到它。大多數(shù)人都使用此命令而不是單獨(dú)的 branch 和 checkout 命令。
gitbranch gitbranch gitcheckout gitcheckout-b
如果你對(duì)一個(gè)分支進(jìn)行了一系列的更改,假如說此分支名為 develop,如果想要將該分支合并回主分支(master)上,則使用 git merge 命令。你需要先檢出(checkout)主分支,然后運(yùn)行 git merge develop 將 develop 合并到主分支中。
gitmerge
如果你正在與多個(gè)人進(jìn)行協(xié)作,你會(huì)發(fā)現(xiàn)有時(shí) GitHub 的倉庫上已經(jīng)更新了,但你的本地卻沒有做相應(yīng)的更改。如果是這樣,你可以使用 git pull origin 命令從遠(yuǎn)程分支中拉取最新的更改。
gitpullorigin
如果您好奇地想看到哪些文件已被更改以及哪些內(nèi)存正在被跟蹤,可以使用 git status 命令。如果要查看每個(gè)文件的更改,可以使用 git diff 來查看每個(gè)文件中更改的行。
gitstatus gitdiff--stat命令實(shí)踐
很快你會(huì)到達(dá)一個(gè)階段,這時(shí)你希望你的提交看起來整潔一致。你可能還需要調(diào)整你的提交記錄,使得提交更容易理解或者能還原一個(gè)意外的有破壞性的更改。
git log 命令可以輸出提交的歷史記錄。你將使用它來查看提交的歷史記錄。
你的提交會(huì)附帶消息和一個(gè)哈希值,哈希值是一串包含數(shù)字和字母的隨機(jī)序列。一個(gè)哈希值示例如下:c3d882aa1aa4e3d5f18b3890132670fbeac912f7。
gitlog
假設(shè)你推送了一些可能破壞了你應(yīng)用程序的東西。你最好回退一個(gè)提交然后再提交一次正確的,而不是修復(fù)它和推送新的東西。
如果你希望及時(shí)回退并從之前的提交中檢出(checkout)你的應(yīng)用程序,則可以使用該哈希作為分支名直接執(zhí)行此操作。這將使你的應(yīng)用程序與當(dāng)前版本分離(因?yàn)槟阏诰庉嫐v史記錄的版本,而不是當(dāng)前版本)。
gitcheckoutc3d88eaa1aa4e4d5f
然后,如果你在那個(gè)歷史分支中做了更改,并且想要再次推送,你必須使用強(qiáng)制推送。
注意:強(qiáng)制推送是危險(xiǎn)的,只有在絕對(duì)必要的時(shí)候才能執(zhí)行它。它將覆蓋你的應(yīng)用程序的歷史記錄,你將失去之后版本的任何信息。
gitpush-foriginmaster
在其他時(shí)候,將所有內(nèi)容保留在一個(gè)提交中是不現(xiàn)實(shí)的。也行你想在嘗試有潛在風(fēng)險(xiǎn)的操作之前保存當(dāng)前進(jìn)度,或者也許你犯了一個(gè)錯(cuò)誤,但希望在你的版本歷史中避免尷尬地留著這個(gè)錯(cuò)誤。對(duì)此,我們有 git rebase。
假設(shè)你在本地歷史記錄上有 4 個(gè)提交(沒有推送到 GitHub),你要回退這是個(gè)提交。你的提交記錄看起來很亂很拖拉。這時(shí)你可以使用 rebase 將所有這些提交合并到一個(gè)簡(jiǎn)單的提交中。
gitrebase-iHEAD~4
上面的命令會(huì)打開你計(jì)算機(jī)的默認(rèn)編輯器(默認(rèn)為 Vim,除非你將默認(rèn)修改為其他的),提供了幾個(gè)你準(zhǔn)備如何修改你的提交的選項(xiàng)。它看起來就像下面的代碼:
pick130deo9oldestcommitmessage pick4209feisecondoldestcommitmessage pick4390gnethirdoldestcommitmessage pickbmo0dnenewestcommitmessage
為了合并這些提交,我們需要將 pick 選項(xiàng)修改為 fixup(如代碼下面的文檔所示),以將該提交合并并丟棄該提交消息。請(qǐng)注意,在 Vim 中,你需要按下 a 或 i 才能編輯文本,要保存退出,你需要按下 Esc 鍵,然后按 shift + z + z。不要問我為什么,它就是這樣。
pick130deo9oldestcommitmessage fixup4209feisecondoldestcommitmessage fixup4390gnethirdoldestcommitmessage fixupbmo0dnenewestcommitmessage
這將把你的所有提交合并到一個(gè)提交中,提交消息為 oldest commit message。
下一步是重命名你的提交消息。這完全是一個(gè)建議的操作,但只要你一直遵循一致的模式,都可以做得很好。這里我建議使用 Google 為 Angular.js 提供的提交指南。
為了更改提交消息,請(qǐng)使用 amend 標(biāo)志。
gitcommit--amend
這也會(huì)打開 Vim,文本編輯和保存規(guī)則如上所示。為了給出一個(gè)良好的提交消息的例子,下面是遵循該指南中規(guī)則的提交消息:
feat:addstripecheckoutbuttontopaymentspage -addstripecheckoutbutton -writetestsforcheckout
保持指南中列出的類型的一個(gè)優(yōu)點(diǎn)是它使編寫更改日志更加容易。你還可以在頁腳(再次,在指南中規(guī)定的)中包含信息來引用問題。
注意:如果你正在協(xié)作一個(gè)項(xiàng)目,并將代碼推送到了 GitHub,你應(yīng)該避免重新引用(rebase)并壓縮(squash)你的提交。如果你開始在人們的眼皮子底下更改版本歷史,那么你可能會(huì)遇到難以追蹤的錯(cuò)誤,從而給每個(gè)人都帶來麻煩。
Git 有無數(shù)的命令,但這里介紹的命令可能是您最初幾年編程所需要知道的所有。
Sam Corcos 是 Sightline Maps 的首席開發(fā)工程師和聯(lián)合創(chuàng)始人,Sightline Maps 是最直觀的 3D 打印地形圖的平臺(tái),以及用于構(gòu)建 Phoenix 和 React 的可擴(kuò)展生產(chǎn)應(yīng)用程序的教程網(wǎng)站 LearnPhoenix.io。使用優(yōu)惠碼:freecodecamp 取得 LearnPhoenix 的20美元。