開始使用Git和GitHub
首先,訪問官方GitHub網(wǎng)站創(chuàng)建一個(gè)帳戶。其次,您必須在命令行上安裝Git。每個(gè)操作系統(tǒng)都應(yīng)附帶一個(gè)默認(rèn)命令行,但您可以查看此開發(fā)人員設(shè)置指南以了解我的設(shè)置。第三,我強(qiáng)烈建議為您的GitHub帳戶設(shè)置SSH。它是可選的,但可以保護(hù)您對(duì)GitHub的訪問權(quán)限。此外,它還省去了繁瑣的任務(wù),當(dāng)您將本地存儲(chǔ)庫的更改推送到GitHub上的遠(yuǎn)程存儲(chǔ)庫時(shí),您始終必須輸入憑據(jù)。
最后但并非最不重要的是,在GitHub上探索和社交。您可以通過訪問人員和組織的個(gè)人資料來探索不同的存儲(chǔ)庫。您可以觀看和加注存儲(chǔ)庫以獲取更新并顯示您的欽佩。您甚至可以開始作為開源貢獻(xiàn)者在存儲(chǔ)庫上做出貢獻(xiàn)。
為了社交,您可以關(guān)注在GitHub上開始有趣項(xiàng)目或討論的人。通過關(guān)注我的帳戶來嘗試獲得您的第一個(gè)社交關(guān)系。我很想看到你使用它。
如果您在使用GitHub時(shí)對(duì)Pull請(qǐng)求和問題的工作流程一無所知,請(qǐng)查看官方GitHub學(xué)習(xí)實(shí)驗(yàn)室。它應(yīng)該提供一切,讓你加快速度。這是開始使用GitHub的好方法。
使用Git和GitHub初始化存儲(chǔ)庫
一開始,你不得不初始化一個(gè)Git存儲(chǔ)庫。您可以使用git init本地計(jì)算機(jī)上項(xiàng)目文件夾中的命令初始化本地存儲(chǔ)庫。
本地存儲(chǔ)庫具有.git文件,其中保存有關(guān)存儲(chǔ)庫的所有信息(例如提交歷史記錄)??梢蕴砑恿硪粋€(gè)文件,即.gitignore文件,以忽略不應(yīng)添加到遠(yuǎn)程存儲(chǔ)庫的某些文件。忽略的文件僅在您的本地存儲(chǔ)庫中。
git init
touch .gitignore
例如,您可能希望忽略.env文件,其中存儲(chǔ)項(xiàng)目的合理環(huán)境變量或node_modules /文件夾,以便不將所有項(xiàng)目依賴項(xiàng)上載到遠(yuǎn)程GitHub存儲(chǔ)庫。
.env
node_modules/
在git init本地項(xiàng)目中使用該命令后,可以在GitHub上創(chuàng)建存儲(chǔ)庫。在那里你可以給它一個(gè)名字,一個(gè)可選的描述和許可證(例如麻省理工學(xué)院)。不要使用復(fù)選框添加README.md。相反,請(qǐng)取消選中該復(fù)選框。然后,您將獲得在下一步中將本地存儲(chǔ)庫鏈接到遠(yuǎn)程存儲(chǔ)庫的說明。
此外,您可能希望在項(xiàng)目中添加README.md文件,然后將其顯示在GitHub上的存儲(chǔ)庫中?;旧?,這是初始化git項(xiàng)目,向其添加.gitignore文件,將其連接到GitHub上的遠(yuǎn)程存儲(chǔ)庫時(shí)需要知道的一切,添加添加,提交和推送序列的更改。您將在下一節(jié)中了解有關(guān)此序列的更多信息。

否則,如果選中該復(fù)選框,您將有一個(gè)準(zhǔn)備就緒的遠(yuǎn)程存儲(chǔ)庫,您可以將其克隆到本地計(jì)算機(jī)以將其作為本地存儲(chǔ)庫。如果要擁有遠(yuǎn)程存儲(chǔ)庫的副本,可以使用git clone <repository_url>本地計(jì)算機(jī)克隆它。
在鏈接本地存儲(chǔ)庫并添加,提交并將初始項(xiàng)目推送到遠(yuǎn)程存儲(chǔ)庫(而不是在克隆它之后)之后,您可以開始調(diào)整項(xiàng)目(本地存儲(chǔ)庫)。之后,您始終遵循添加,提交和推送順序。在下一節(jié)中有關(guān)于此的更多信息。
推送您的更改
在過去幾年中,我注意到我使用的GitHub命令僅分解為我在重復(fù)出現(xiàn)的場景中使用的幾個(gè)基本命令。這些基本命令足以讓我在Web開發(fā)中出現(xiàn)。
擁有本地存儲(chǔ)庫后,您希望“提交”對(duì)代碼庫的更改。每個(gè)提交都保存為更改存儲(chǔ)庫的原子步驟。它保存在Git歷史記錄中,可以在命令行和GitHub上訪問。
提交附帶提交消息。稍后您將看到如何編寫提交消息。此外,會(huì)自動(dòng)生成散列以標(biāo)識(shí)您的提交。您不必在開始時(shí)關(guān)心哈希,但稍后它可以用于跳轉(zhuǎn)到歷史記錄中的特定點(diǎn)或相互比較提交。
提交發(fā)生在您的本地存儲(chǔ)庫中,然后最終將它們“推送”到遠(yuǎn)程存儲(chǔ)庫,在那里每個(gè)人都可以訪問它們。在通過推送將它們同步到遠(yuǎn)程存儲(chǔ)庫之前,您可以在本地累積多個(gè)提交。
您如何從本地存儲(chǔ)庫獲取更改到遠(yuǎn)程存儲(chǔ)庫?有三個(gè)基本命令:add,commit,push。
首先,您可以為下次提交添加全部或僅選定的已更改文件。
git add .
git add <path/to/file>
這些文件將從非暫存文件更改為暫存文件。您可以隨時(shí)驗(yàn)證它git status。文件暫存時(shí),可以提交它們。還有從暫存文件到非暫存文件的方法。
git reset HEAD <path/to/file>
其次,您可以使用提交消息附帶的提交提交暫存文件。該消息描述了您的更改。有兩種提交方式。您可以使用快捷方式commit命令內(nèi)聯(lián)添加提交消息:
git commit -m "<message>"
此外,您可以使用默認(rèn)的commit命令在之后使用多行生成更詳細(xì)的提交消息。
git commit
后一個(gè)命令將打開您的默認(rèn)命令行編輯器。通常,默認(rèn)的命令行編輯器是vim。在vim中,您可以鍵入提交消息。之后,您可以使用:wq哪個(gè)代表寫入和退出來保存并退出vim 。大多數(shù)情況下,您將使用快捷方式提交。它很快并且通常內(nèi)聯(lián)提交消息就足夠了。
現(xiàn)在,在進(jìn)入第三步之前,多個(gè)提交可以在本地存儲(chǔ)庫中累積。最后,在第三步中,您將把一個(gè)命令中的所有提交推送到遠(yuǎn)程存儲(chǔ)庫。
git push origin master
這些是從本地存儲(chǔ)庫到遠(yuǎn)程存儲(chǔ)庫進(jìn)行更改的三個(gè)必要步驟。但是當(dāng)您與其他人協(xié)作時(shí),在推送更改之前可能會(huì)有一個(gè)中間步驟。當(dāng)您在本地存儲(chǔ)庫中進(jìn)行更改時(shí),可能會(huì)發(fā)生其他人已在遠(yuǎn)程存儲(chǔ)庫中推送更改的情況。因此,在允許推送自己的更改之前,必須從遠(yuǎn)程存儲(chǔ)庫中提取所有更改。它可以很簡單:
git pull origin master
但是,我從不直接拉。相反,我拉動(dòng)rebase:
git pull --rebase origin master
拉動(dòng)和拉動(dòng)變形有什么區(qū)別?基本git pull只需將遠(yuǎn)程存儲(chǔ)庫中的所有更改放在更改之上。通過拉動(dòng)反轉(zhuǎn),它是另一種方式。首先是來自遠(yuǎn)程存儲(chǔ)庫的更改,然后您的更改將添加到頂部。從本質(zhì)上講,拉動(dòng)基數(shù)有兩個(gè)好處:
- 它保留了有序的git歷史記錄,因?yàn)槟母氖冀K是最后添加的
- 如果遇到?jīng)_突,它可以幫助您解決沖突,因?yàn)槟梢愿p松地調(diào)整自己的更改
如果從遠(yuǎn)程存儲(chǔ)庫中提取時(shí)已更改但未更改的文件,則會(huì)要求您先保存已更改的文件。在完成所有更改后,您可以再次應(yīng)用存儲(chǔ)。存儲(chǔ)將在本文后面解釋。
Git狀態(tài),日志和歷史記錄
有三個(gè)基本的git命令可以為您提供有關(guān)當(dāng)前和最近更改的項(xiàng)目狀態(tài)。它們不會(huì)更改本地存儲(chǔ)庫中的任何內(nèi)容,只會(huì)向您顯示信息。例如,每當(dāng)要檢查本地暫存和未暫存的更改時(shí),請(qǐng)鍵入:
git status
每當(dāng)您想要查看與最近提交相比的本地非暫停更改時(shí),請(qǐng)鍵入:
git diff
每當(dāng)您想要查看提交的git歷史記錄時(shí),請(qǐng)鍵入:
git log
默認(rèn)設(shè)置git log對(duì)大多數(shù)人沒有幫助。每次提交都占用太多空間,很難掃描歷史記錄。您可以使用以下配置來設(shè)置更簡潔的別名:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
現(xiàn)在你可以用git lg而不是git log。試試看看差異。
分枝
Git Branches用于多種用例。想象一下,您正在為您的項(xiàng)目開發(fā)一項(xiàng)新功能。您希望為其打開一個(gè)新分支,以獨(dú)立于整個(gè)項(xiàng)目跟蹤更改,更具體:獨(dú)立于主分支。在將分支合并到主分支之前,您(或其他人)可以查看更改。
另一個(gè)用例是您在開發(fā)人員團(tuán)隊(duì)中工作。您希望讓每個(gè)人都可以獨(dú)立完成改進(jìn),錯(cuò)誤修復(fù)和功能。因此,從主分支分支出這些用例是有意義的。Git分支的基本命令是什么?您可以自己創(chuàng)建一個(gè)新分支:
git checkout -b <branch>
或者檢查已經(jīng)存在的分支。
git checkout <branch>
當(dāng)分支由另一個(gè)協(xié)作者新創(chuàng)建并且您的本地存儲(chǔ)庫尚不知道時(shí),您可以從遠(yuǎn)程存儲(chǔ)庫中獲取所有分支信息。畢竟分支也是遠(yuǎn)程跟蹤的。之后,您可以簽出本地存儲(chǔ)庫中的分支。
git fetch
git checkout <branch>
進(jìn)入分支后,您可以從遠(yuǎn)程存儲(chǔ)庫中提取它的所有最新更改。
git pull --rebase origin <branch>
現(xiàn)在,您可以開始調(diào)整代碼git add .和git commit它們,并最終推送您的更改。但是,不是將它們推送到主分支,而是將它們推送到分支機(jī)構(gòu)。
git push origin <branch>
這就是你如何為你的項(xiàng)目所謂的功能分支工作。其他開發(fā)人員可以在這些分支上進(jìn)行協(xié)作,最終將分支在Pull Request中合并到master分支。
合并拉取請(qǐng)求
在某些時(shí)候,您希望將分支合并到主分支。在合并之前,您將使用GitHub接口打開Pull Request(PR)。Pull Requests有助于激發(fā)討論和同行評(píng)審,以提高代碼質(zhì)量并在協(xié)作者之間分享知識(shí)。
在打開PR之前,我通常按照這些步驟檢查分支,獲取所有更新以將它們與我自己合并,從主分支獲取所有最近的更改,并強(qiáng)制將所有更改推送到分支本身。
首先,當(dāng)在主分支上時(shí),將主分支更新為最近的更改:
git pull --rebase origin master
二,結(jié)賬分行:
git checkout <branch>
如果您還沒有分支,請(qǐng)先從遠(yuǎn)程存儲(chǔ)庫中獲取所有分支,然后簽出分支:
git fetch
git checkout <branch>
第三,從分支中拉出最近的所有變化:
git pull --rebase origin <branch>
第四,從最近的主分支機(jī)構(gòu)本地改變所有變化:
git rebase master
最后但并非最不重要的是,強(qiáng)制將所有更改推送到遠(yuǎn)程分支:
git push -f origin <branch>
分支與來自所有協(xié)作者的更改,您的更改以及來自主分支的更改同步。最后,當(dāng)在遠(yuǎn)程存儲(chǔ)庫中更新分支時(shí),您可以點(diǎn)擊GitHub上的“Merge Pull Request”按鈕。
解決沖突
有時(shí),當(dāng)您從遠(yuǎn)程存儲(chǔ)庫中提取最近的更改或在分支上對(duì)主服務(wù)器進(jìn)行rebase時(shí),會(huì)遇到?jīng)_突。當(dāng)Git無法解析同一文件上的多個(gè)更改時(shí),就會(huì)發(fā)生沖突。在與多人合作時(shí),這種情況可能比預(yù)期的更頻繁。
例如,假設(shè)它發(fā)生git rebase master在您的分支上。命令行將指示它停止了rebase并向您顯示沖突的文件。這沒有理由恐慌。您可以打開指定的文件并解決沖突。在文件中,您應(yīng)該看到更改分開:來自master(HEAD)和分支(通常是提交消息)的更改。您必須決定要采用哪兩個(gè)版本才能解決沖突。解決所有文件中的所有沖突(通常所有文件都顯示在命令行上)后,您可以繼續(xù)使用rebase:
git add .
git rebase --continue
如果再次運(yùn)行沖突,則可以解決它們并再次運(yùn)行命令。
Git Stash
當(dāng)你想永久地或暫時(shí)地拋棄變化時(shí),通常會(huì)發(fā)生git藏匿。
git stash
后者,當(dāng)您只想暫存時(shí),可以在想要在其間執(zhí)行其他操作時(shí)使用。例如,修復(fù)錯(cuò)誤或代表某人創(chuàng)建PR。
藏匿處是一堆。您可以選擇最新的存儲(chǔ),將其再次應(yīng)用到本地存儲(chǔ)庫。
git stash apply
如果您不希望通過存儲(chǔ)“丟棄”所有更改,而只是選擇文件,則可以使用checkout命令:
git checkout -- <path/to/file>
該文件從未分級(jí)到完全沒有變化。但請(qǐng)記住,雖然存儲(chǔ)允許您從堆中獲取存儲(chǔ),但結(jié)帳會(huì)恢復(fù)文件中的所有更改。因此您無法檢索這些更改。
刪除分支
合并Pull Request后,通常需要?jiǎng)h除遠(yuǎn)程和本地分支。
git branch -d <branch>
git push origin :<branch>
當(dāng)?shù)谝粋€(gè)命令刪除本地計(jì)算機(jī)上的分支時(shí),第二個(gè)命令將刪除GitHub上的遠(yuǎn)程分支。在你之后清理總是好的,所以你應(yīng)該養(yǎng)成這個(gè)習(xí)慣。
交互式Rebase
我必須承認(rèn),它不是Git的必要命令,但我經(jīng)常使用它來組織我在一個(gè)分支上的提交。在我打開它作為其他人的公關(guān)之前,我喜歡有一個(gè)整潔的分支。整理分支意味著以有意義的順序提交提交,重寫提交消息或“壓縮”提交。壓縮提交意味著將多個(gè)提交合并為一個(gè)。
使用交互式rebase時(shí),您可以決定要以交互方式調(diào)整的提交數(shù)。
git rebase -i HEAD?<number>
之后,由于您調(diào)整了Git歷史記錄,因此您需要強(qiáng)制推送您的更改。強(qiáng)制推送將覆蓋遠(yuǎn)程存儲(chǔ)庫中的Git提交。
git push -f origin master
一般來說,你應(yīng)該小心推力。一個(gè)好的經(jīng)驗(yàn)法則是你可以在分支上執(zhí)行它們,但從不在主分支上執(zhí)行它們。在較大的項(xiàng)目中,強(qiáng)制推送通常在編程上不允許在主分支上。
提交消息約定
當(dāng)您與他人協(xié)作或希望自己提交整潔的提交消息時(shí),您可以遵循Git提交消息約定。有一些慣例。我習(xí)慣于遵循Angular社區(qū)中提出的這些內(nèi)容:
- 專長:一項(xiàng)新功能
- 修復(fù):錯(cuò)誤修復(fù)
- docs:文檔更改
- style:代碼樣式更改,不會(huì)更改實(shí)現(xiàn)細(xì)節(jié)
- 重構(gòu):代碼更改既不修復(fù)錯(cuò)誤也不添加功能
- perf:改進(jìn)性能的代碼更改
- 測試:測試代碼時(shí)
- 家務(wù):對(duì)構(gòu)建過程或輔助工具和庫的更改
他們遵循以下語法: <type>(<scope>): <subject>
從命令行獲取的示例可以是:
git commit -m "feat(todo-list) add filter feature"
這就是你如何為自己和你的團(tuán)隊(duì)保持整潔的提交歷史。
Git Aliases
Git別名用于通過使用內(nèi)置的Git命令組成自己的Git命令。別名允許您使Git命令更簡潔或?qū)λ鼈冞M(jìn)行分組。例如,您可以將兩個(gè)Git命令分組,以便在一個(gè)命令中執(zhí)行它們。例如,如果你想刪除一個(gè)分支,這將是有意義的。本地和遠(yuǎn)程刪除將在一個(gè)命令中發(fā)生。像這樣:git nuke。在另一種情況下,你會(huì)縮寫git pull --rebase用gpr。