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