境搭建與核心工作流實戰(zhàn):從本地安裝到遠(yuǎn)程協(xié)作)
1. 從零開始的Git環(huán)境搭建為什么你需要兩個“版本”如果你剛開始接觸代碼管理或者正準(zhǔn)備加入一個軟件開發(fā)團隊那么“Git”這個詞你肯定繞不過去。很多人一上來就被各種教程搞懵了一會兒讓去官網(wǎng)下載安裝一會兒又說可以直接在網(wǎng)頁上操作。這“網(wǎng)頁版”和“Windows版”到底有什么區(qū)別我該用哪個今天我就以一個過來人的身份幫你把這兩件事徹底捋清楚讓你從安裝到第一次提交代碼每一步都走得明明白白。簡單來說Git網(wǎng)頁版和Git Windows版是同一核心工具在不同場景下的兩種“面孔”它們解決的問題完全不同。你可以把Git想象成一套強大的“版本控制系統(tǒng)”引擎。Git Windows版就是把這臺引擎完整地安裝到你的本地電腦上讓你擁有全部的控制權(quán)可以在自己的機器上創(chuàng)建倉庫、管理歷史、進(jìn)行各種復(fù)雜的操作。而Git網(wǎng)頁版通常指GitHub、Gitee、GitLab等代碼托管平臺的網(wǎng)頁界面則是別人已經(jīng)搭建好的、基于這臺引擎的“在線服務(wù)中心”。你通過瀏覽器訪問它主要用它來瀏覽別人的代碼、進(jìn)行代碼審查、管理團隊協(xié)作任務(wù)或者把你本地引擎處理好的代碼“同步”到云端。所以對于新手我的建議非常明確兩者你都需要但學(xué)習(xí)的起點和核心是Git Windows版即本地Git命令行工具。網(wǎng)頁版是你看世界和與人協(xié)作的窗口而本地版是你真正干活、創(chuàng)造內(nèi)容的工具。沒有本地Git你就無法在電腦上寫代碼并管理它的版本沒有網(wǎng)頁版托管平臺你的代碼就難以分享和備份。接下來我會手把手帶你完成這兩部分的安裝與基礎(chǔ)使用過程中穿插我踩過的坑和總結(jié)的技巧保證你看完就能上手。2. Git Windows版安裝避開默認(rèn)選項里的“坑”首先我們搞定本地環(huán)境。訪問Git的官方網(wǎng)站git-scm.com下載Windows安裝程序。這個過程看似一路“Next”就行但其實有幾個關(guān)鍵選項選錯了后面會非常麻煩。2.1 安裝過程中的關(guān)鍵配置解析運行下載好的Git-2.xx.x-64-bit.exe安裝文件。在“Select Components”組件選擇界面我建議你保持默認(rèn)勾選即可但務(wù)必理解它們是什么Git Bash Here和Git GUI Here這會在你的文件資源管理器右鍵菜單中添加兩個選項非常方便。在任意文件夾里右鍵就能快速在此處打開Git命令行或圖形界面。Associate .gitconfiguration files with the default text editor*將.git后綴的配置文件與你的默認(rèn)文本編輯器關(guān)聯(lián)。建議勾選方便以后直接編輯Git配置文件。接下來是重頭戲“Choosing the default editor used by Git”。這里讓你選擇Git的默認(rèn)文本編輯器。當(dāng)你進(jìn)行提交commit而不寫提交信息時或者解決沖突時Git會打開這個編輯器讓你輸入內(nèi)容。強烈不建議新手選擇默認(rèn)的“Vim”除非你熟悉Vim的操作按i進(jìn)入插入模式輸入內(nèi)容按Esc后輸入:wq保存退出。對于Windows用戶一個更友好的選擇是“Use the Nano editor”或者下拉選擇“Notepad”如果你安裝了的話。這里為了絕對簡單我們可以先選擇“Use the Nano editor”它的操作提示在屏幕底部相對直觀。然后是“Adjusting your PATH environment”環(huán)境變量調(diào)整。這是最重要的步驟之一。有三個選項Use Git from Git Bash only只在Git Bash里使用Git。這是最安全但最局限的選項你只能在Git Bash這個特定軟件里運行g(shù)it命令。Git from the command line and also from 3rd-party software推薦選擇此項。它會把Git的可執(zhí)行文件路徑添加到系統(tǒng)的PATH環(huán)境變量中。這意味著你不僅可以在Git Bash里用還可以在Windows自帶的命令提示符CMD或PowerShell里直接輸入git命令甚至像VSCode這樣的第三方軟件也能直接調(diào)用。這為你未來的開發(fā)提供了最大的靈活性。Use Git and optional Unix tools from the Command Prompt將Git和一些Unix工具都添加到PATH。這可能會與你系統(tǒng)已有的工具產(chǎn)生沖突一般不推薦。在“Choosing HTTPS transport backend”選擇HTTPS傳輸后端時使用默認(rèn)的“Use the OpenSSL library”即可。它負(fù)責(zé)處理當(dāng)你通過https://地址克隆倉庫時的加密連接?!癈onfiguring the line ending conversions”配置行尾轉(zhuǎn)換是另一個容易出問題的地方。Windows和Linux/macOS系統(tǒng)對于文本文件行尾的標(biāo)記方式不同。這里的選擇至關(guān)重要Checkout Windows-style, commit Unix-style line endings推薦選擇此項。它的含義是當(dāng)你從遠(yuǎn)程倉庫拉取代碼到Windows電腦時checkoutGit會把行尾轉(zhuǎn)換為Windows風(fēng)格CRLF而當(dāng)你提交代碼時commitGit又會自動將行尾轉(zhuǎn)換回Unix風(fēng)格LF。這樣保證了你的倉庫內(nèi)部統(tǒng)一使用LF避免不同開發(fā)者因系統(tǒng)不同導(dǎo)致整個文件都被標(biāo)記為修改的混亂局面。Checkout as-is, commit as-is不進(jìn)行任何轉(zhuǎn)換。除非你明確知道所有協(xié)作者都在同一種系統(tǒng)下工作否則不推薦。Checkout Unix-style, commit Unix-style無論檢出還是提交都使用Unix風(fēng)格LF。這適合純Linux/macOS開發(fā)環(huán)境在Windows上使用某些編輯器時可能會看到所有文字?jǐn)D在一行。最后在“Choose the default behavior ofgit pull”中關(guān)于git pull命令的默認(rèn)行為我建議選擇“Rebase”而不是“Merge”。簡單來說“Merge”會產(chǎn)生一個額外的合并提交讓提交歷史線出現(xiàn)分叉再合并的“岔路”而“Rebase”則是將你的提交“變基”到目標(biāo)分支的最新點之后使得提交歷史保持一條整潔的直線。對于新手理解“Rebase”需要時間但從一開始就養(yǎng)成使用它的習(xí)慣對你日后維護(hù)清晰的提交歷史大有裨益。你可以先記住這個選擇。剩下的選項如“Use a credential helper”使用憑據(jù)管理器一定要啟用。它會安全地保存你的GitHub/Gitee賬號密碼不用每次推送都重復(fù)輸入。2.2 安裝驗證與基礎(chǔ)配置安裝完成后在開始菜單找到“Git”文件夾打開“Git Bash”。你會看到一個黑底綠字的命令行窗口。輸入以下命令檢查是否安裝成功git --version如果顯示了類似git version 2.xx.x.windows.1的信息恭喜你安裝成功。接下來進(jìn)行最重要的全局配置這相當(dāng)于給你的Git工具刻上“名字”git config --global user.name 你的用戶名 git config --global user.email 你的郵箱這個用戶名和郵箱至關(guān)重要它會被記錄在你每一次提交中。請使用你將在GitHub或Gitee等平臺注冊的郵箱這樣你的提交才能和你的平臺賬號關(guān)聯(lián)起來展示正確的貢獻(xiàn)者頭像和信息。你可以用以下命令查看所有配置git config --list --global一個實用的配置是設(shè)置默認(rèn)分支名為main現(xiàn)代倉庫的默認(rèn)選擇并美化日志輸出格式git config --global init.defaultBranch main git config --global alias.lg log --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit配置完別名后以后輸入git lg就能看到非常直觀、帶分支圖的提交歷史了。3. 核心工作流本地Git的第一次實戰(zhàn)安裝配置好我們立刻來體驗一個完整的本地Git工作流。請打開Git Bash并切換到一個你打算存放代碼的目錄比如D:\Projects。3.1 創(chuàng)建倉庫與“暫存區(qū)”概念首先創(chuàng)建一個練習(xí)用的文件夾并進(jìn)入mkdir my-first-git-repo cd my-first-git-repo將這個文件夾初始化為一個Git倉庫git init你會看到提示Initialized empty Git repository in D:/Projects/my-first-git-repo/.git/。這時一個隱藏的.git文件夾被創(chuàng)建它就是這個倉庫所有的“記憶中樞”。現(xiàn)在創(chuàng)建一個簡單的文件比如README.md并用記事本或VSCode寫入一些內(nèi)容例如# My First Git Project。關(guān)鍵概念來了在Git中你的工作目錄Working Directory和最終的版本庫Repository之間有一個叫做“暫存區(qū)”Staging Area或“索引”Index的中間層。為什么需要它它允許你精心挑選本次提交要包含哪些文件的哪些改動而不是一股腦把所有修改都提交上去。查看當(dāng)前倉庫狀態(tài)git status你會看到README.md被列為“Untracked files”未跟蹤的文件。Git發(fā)現(xiàn)了它但還沒有開始管理它的版本。將它添加到暫存區(qū)git add README.md再次運行g(shù)it status你會看到README.md在“Changes to be committed”下面變成了綠色。這意味著它已被暫存準(zhǔn)備被“拍快照”了。注意git add .命令可以添加當(dāng)前目錄下所有變更的文件到暫存區(qū)非常方便但添加前務(wù)必用git status確認(rèn)一下避免把臨時文件或配置文件如包含密碼的也加進(jìn)去。3.2 提交、查看歷史與“后悔藥”將暫存區(qū)的內(nèi)容創(chuàng)建為一個永久的快照提交git commit -m feat: add initial README file-m后面是提交信息。提交信息務(wù)必認(rèn)真寫好的提交信息像日記能讓未來的你或同事一眼看懂這次改動的目的。常見的格式約定是類型(范圍): 描述例如fix(login): correct password validation logic。提交后用我們剛才設(shè)置的別名查看歷史git lg如果沒配置別名用git log --oneline --graph也可以看到簡化版現(xiàn)在我們試試修改README.md增加一行內(nèi)容。然后再次git status會看到文件在“Changes not staged for commit”下面紅色。這意味著Git檢測到了工作目錄中的修改但修改還沒有進(jìn)入暫存區(qū)。你可以再次git add README.md然后git commit -m “...”。但這里我想分享一個更快捷的組合命令它相當(dāng)于git add .git commit -mgit commit -am docs: update README with description注意-a參數(shù)只會添加那些已經(jīng)被Git跟蹤tracked的文件的修改到暫存區(qū)并提交。對于新增的未跟蹤文件它無效仍需先用git add。萬一你提交信息寫錯了怎么辦或者不小心提交了不該提交的文件這就是“后悔藥”時間修改上一次提交的信息git commit --amend -m “新的提交信息”。這會將新的信息覆蓋上一次提交前提是上一次提交還沒有推送到遠(yuǎn)程倉庫否則會引發(fā)混亂。從暫存區(qū)撤回一個文件如果你git add了某個文件但又反悔了可以用git restore --staged 文件名Git 2.23或git reset HEAD 文件名舊命令將它從暫存區(qū)移回工作區(qū)。丟棄工作區(qū)的修改危險git restore 文件名或git checkout -- 文件名。這個操作不可逆會永久丟棄你對文件尚未暫存的修改慎用4. 連接遠(yuǎn)程倉庫本地與網(wǎng)頁版的橋梁本地玩得轉(zhuǎn)現(xiàn)在我們要把本地倉庫和網(wǎng)頁版以GitHub為例連接起來實現(xiàn)代碼的備份與協(xié)作。4.1 在GitHub上創(chuàng)建遠(yuǎn)程倉庫登錄GitHub點擊右上角“”號選擇“New repository”。填寫倉庫名如my-first-git-repo選擇公開Public或私有Private。初始化選項這里千萬不要勾選“Add a README file”、“Add .gitignore”或“Choose a license”。因為我們本地已經(jīng)有一個倉庫和README.md了如果勾選GitHub會創(chuàng)建一個全新的、有初始提交的倉庫這會導(dǎo)致我們本地倉庫和遠(yuǎn)程倉庫歷史不一致在第一次推送時需要進(jìn)行額外的合并操作增加復(fù)雜度。我們就創(chuàng)建一個完全空的遠(yuǎn)程倉庫。點擊“Create repository”創(chuàng)建。創(chuàng)建成功后你會看到一個快速設(shè)置頁面其中顯示了倉庫的HTTPS地址如https://github.com/你的用戶名/my-first-git-repo.git和SSH地址。4.2 關(guān)聯(lián)并推送代碼回到你的Git Bash在本地倉庫目錄下執(zhí)行以下命令將本地倉庫與遠(yuǎn)程倉庫關(guān)聯(lián)起來。這里使用HTTPS地址git remote add origin https://github.com/你的用戶名/my-first-git-repo.gitorigin是給這個遠(yuǎn)程倉庫起的一個別名習(xí)慣上叫origin你可以改成別的但沒必要。接下來將本地倉庫的main分支推送到遠(yuǎn)程倉庫的main分支并建立追蹤關(guān)系git push -u origin main-u參數(shù)是--set-upstream的簡寫它建立了本地main分支與遠(yuǎn)程origin/main分支的追蹤關(guān)系。設(shè)置好后以后在這個分支上只需要輸入git push或git pull即可Git就知道要和哪個遠(yuǎn)程分支交互。第一次推送如果使用HTTPS會彈窗或命令行要求你輸入GitHub的用戶名和密碼。注意現(xiàn)在GitHub已不再支持賬戶密碼驗證你需要使用“Personal Access Token”個人訪問令牌作為密碼。你需要在GitHub的Settings - Developer settings - Personal access tokens中生成一個具有repo權(quán)限的token用它來代替密碼。推送成功后刷新你的GitHub倉庫頁面就能看到本地代碼已經(jīng)同步上來了。至此你的本地Git和Git網(wǎng)頁版就成功打通了。4.3 克隆獲取別人的代碼更多時候你是從遠(yuǎn)程倉庫獲取代碼克隆。使用git clone命令git clone https://github.com/某個開源項目/倉庫名.git這個命令會做三件事1. 將遠(yuǎn)程倉庫的所有代碼和歷史下載到本地2. 自動創(chuàng)建一個以倉庫名命名的文件夾3. 自動設(shè)置好遠(yuǎn)程地址別名origin??寺⊥瓿珊笾苯舆M(jìn)入該文件夾你就已經(jīng)在一個配置好的Git倉庫里了可以立即開始工作。5. 分支管理團隊協(xié)作與功能開發(fā)的基石分支是Git的“殺手锏”功能它讓你能在一條獨立的時間線上開發(fā)新功能或修復(fù)Bug而不影響主線main分支。5.1 創(chuàng)建與切換分支假設(shè)你要開發(fā)一個新功能“用戶登錄”。首先基于當(dāng)前分支通常是main創(chuàng)建一個新分支并切換到它git checkout -b feature-user-login-b表示創(chuàng)建并切換。這條命令等價于先git branch feature-user-login創(chuàng)建分支再git checkout feature-user-login切換分支。在Git 2.23版本后更推薦使用git switch命令來切換分支語義更清晰git switch -c feature-user-login # 創(chuàng)建并切換到新分支 git switch main # 切換回main分支在新分支上你可以放心地修改代碼、多次提交所有這些操作都只存在于feature-user-login分支上main分支絲毫未變。5.2 合并分支與解決沖突當(dāng)功能開發(fā)完成并測試通過后你需要將它合并回main分支。首先切換回main分支并拉取最新的遠(yuǎn)程變更git switch main git pull origin main # 確保本地main是最新的然后執(zhí)行合并git merge feature-user-login如果feature-user-login分支的修改和main分支的修改沒有沖突Git會進(jìn)行“快進(jìn)合并”Fast-forward或自動創(chuàng)建一個合并提交。沖突Conflict是新手最常遇到也最頭疼的問題。它發(fā)生在兩個分支修改了同一文件的同一區(qū)域時。Git無法自動決定該保留哪個修改必須由你手動解決。當(dāng)合并發(fā)生沖突時Git會標(biāo)記出沖突的文件。打開這些文件你會看到類似這樣的標(biāo)記 HEAD 這是main分支上的內(nèi)容 這是feature-user-login分支上的內(nèi)容 feature-user-login你需要做的就是與團隊成員溝通決定保留哪一部分或者進(jìn)行整合。手動編輯文件刪除這些標(biāo)記并保留你最終想要的內(nèi)容。將解決完沖突的文件添加到暫存區(qū)git add 沖突文件名。完成合并提交git commit。Git會為你預(yù)填一個合并信息的提交消息。5.3 變基保持歷史的整潔前面安裝時我們選擇了rebase作為git pull的默認(rèn)策略這里再深入一下。git rebase變基是另一種整合分支變化的方式。與merge創(chuàng)建新的合并提交不同rebase會把你當(dāng)前分支的提交“重新播放”到目標(biāo)分支的最新提交之后。例如當(dāng)你在feature分支開發(fā)時main分支已經(jīng)有了新的提交。為了讓你的提交歷史看起來像是基于最新的main開發(fā)的一條直線你可以在feature分支上執(zhí)行g(shù)it rebase main這個過程可能會遇到?jīng)_突解決方式與合并沖突類似但需要為每一個重播的提交解決可能出現(xiàn)的沖突。解決后用git rebase --continue繼續(xù)。重要經(jīng)驗永遠(yuǎn)不要對已經(jīng)推送到遠(yuǎn)程倉庫、且可能被其他人使用的分支執(zhí)行變基。變基會重寫提交歷史如果其他人基于你變基前的歷史進(jìn)行了工作將會產(chǎn)生極其復(fù)雜的混亂。變基的黃金法則只對你本地、尚未推送的分支進(jìn)行變基。6. Git網(wǎng)頁版GitHub的核心功能與高效使用本地Git是引擎GitHub這類網(wǎng)頁版就是車庫、展覽廳和協(xié)作中心。除了瀏覽代碼它的這幾個功能你必須會用。6.1 Issue與Pull Request協(xié)作的標(biāo)準(zhǔn)化流程Issue問題/議題用于跟蹤Bug、提議新功能、討論想法。它是所有工作的起點。一個好的Issue應(yīng)該描述清晰、有可復(fù)現(xiàn)的步驟或明確的需求。Pull RequestPR拉取請求這是GitHub協(xié)作的核心。當(dāng)你在自己的分支上完成了一個功能或修復(fù)后你向項目的維護(hù)者發(fā)起一個PR請求他們將你的分支合并到主分支。PR頁面包含了代碼差異對比、討論區(qū)、CI/CD狀態(tài)檢查等。通過PR進(jìn)行的代碼審查Code Review是保證代碼質(zhì)量的關(guān)鍵環(huán)節(jié)。標(biāo)準(zhǔn)工作流通常是發(fā)現(xiàn)Bug或想到新功能 - 創(chuàng)建一個Issue - 從main分支拉出一個新分支進(jìn)行開發(fā) - 開發(fā)完成并提交 - 推送到你的遠(yuǎn)程倉庫 - 在GitHub上對該分支發(fā)起一個指向原始項目main分支的PR - 等待審查、討論、修改 - 審查通過后被合并Merge或變基合并Rebase and Merge。6.2 Fork與Star參與開源與收藏項目Fork分叉如果你想?yún)⑴c一個你并沒有直接寫入權(quán)限的開源項目你可以先Fork它。這會在你的個人賬號下創(chuàng)建一個該項目的完整副本。你可以在自己的副本里任意修改然后通過向原項目發(fā)起PR來貢獻(xiàn)你的代碼。Star星標(biāo)相當(dāng)于收藏或點贊方便你日后快速找到感興趣的項目也是對作者的一種鼓勵。6.3 .gitignore文件忽略不該提交的文件這個文件雖然是在本地倉庫創(chuàng)建但其管理是網(wǎng)頁版瀏覽代碼整潔度的關(guān)鍵。在項目根目錄創(chuàng)建一個名為.gitignore的文件在里面列出你希望Git完全忽略的文件或文件夾模式例如# 忽略操作系統(tǒng)自動生成的文件 .DS_Store Thumbs.db # 忽略IDE或編輯器配置文件 .vscode/ .idea/ *.swp # 忽略依賴安裝目錄 node_modules/ __pycache__/ # 忽略編譯產(chǎn)物 *.class *.exe *.dll build/ dist/GitHub為各種語言提供了通用的.gitignore模板在創(chuàng)建倉庫時可以選擇非常方便。一個好的.gitignore能避免將臨時文件、本地配置、依賴包等無關(guān)內(nèi)容提交到倉庫保持倉庫的純凈。7. 常見問題排查與高效技巧錦囊最后分享一些我踩過坑后總結(jié)的經(jīng)驗?zāi)軒湍愦蠓嵘省?.1 連接失敗與認(rèn)證問題git push提示Support for password authentication was removed如前所述GitHub已禁用密碼驗證。解決方案使用SSH密鑰或Personal Access Token。SSH方式推薦一勞永逸在本地生成SSH密鑰對ssh-keygen -t ed25519 -C “your_emailexample.com”將公鑰~/.ssh/id_ed25519.pub文件內(nèi)容添加到GitHub的SSH Keys設(shè)置中。然后將遠(yuǎn)程倉庫地址從HTTPS改為SSHgit remote set-url origin gitgithub.com:用戶名/倉庫名.git。Token方式生成Token在推送時用Token代替密碼??梢詫oken添加到系統(tǒng)的憑據(jù)管理器避免每次輸入。git clone或git push速度極慢可能是網(wǎng)絡(luò)問題??梢試L試配置Git代理如果你有合法的網(wǎng)絡(luò)加速服務(wù)或者使用國內(nèi)鏡像源如Gitee進(jìn)行克隆。7.2 命令遺忘與幫助系統(tǒng)記不住命令太正常了。善用幫助git help 命令打開該命令的詳細(xì)手冊英文。git 命令 -h或git 命令 --help顯示該命令的簡要用法。git status你的最佳伙伴任何時候不確定狀態(tài)先運行它。tldr git-commit如果你安裝了tldr工具它可以給出命令的常用示例比原生man更友好。7.3 圖形化工具輔助命令行強大但圖形化工具GUI在查看歷史、解決沖突、暫存部分文件時更直觀。Git官方自帶git gui和gitk。更流行的第三方工具有Sourcetree免費功能全面跨平臺。GitHub Desktop與GitHub深度集成對新手極其友好。VS Code內(nèi)置的Git工具對于使用VS Code的開發(fā)者其源代碼管理面板提供了非常優(yōu)秀的圖形化操作足以應(yīng)對日常大部分需求。我的建議是從命令行開始學(xué)理解核心概念。在熟悉了基本流程后可以借助GUI工具來提高某些操作如可視化分支歷史、交互式暫存的效率。兩者結(jié)合使用效果最佳。學(xué)習(xí)Git是一個漸進(jìn)的過程不要指望一天掌握所有命令。從最基本的clone,add,commit,push,pull開始在實際項目中反復(fù)使用。遇到問題就查每解決一個實際問題你的理解就加深一層。記住版本控制的核心思想是“記錄快照”和“管理分支”把握住這個核心所有的命令都是圍繞它服務(wù)的工具?,F(xiàn)在打開你的終端和瀏覽器開始你的第一次git commit吧。