閑言碎語(yǔ)
?剛工作沒(méi)幾年,最開(kāi)始使用的是 svn,感覺(jué)操作簡(jiǎn)單,就是多人開(kāi)發(fā)的時(shí)候管理代碼賊麻煩。后來(lái)?yè)Q了新公司后使用 Git 管理代碼,發(fā)現(xiàn)這玩意簡(jiǎn)直不要太好用,尤其是可以建分支,減少了工作中很多麻煩的操作。于是乎我變成了 Git 的忠實(shí)粉絲。我使用的是 Win 電腦,最開(kāi)始不知道 Git 命令,也懶得去敲,所以一直使用 sourceTree 來(lái)操作(也推薦小白先用該工具理解操作的含義后再考慮用命令方式操作)。后來(lái)發(fā)現(xiàn)用工具沒(méi)有用命令行那樣裝*,所以也開(kāi)始了解一些常用的 Git 命令,于是乎就有了這篇文。文中的一些概念都是我理解后白話的,如有什么不足,歡迎糾正補(bǔ)充。
概念介紹
1. 區(qū)分“本地操作”與“遠(yuǎn)程操作”
?本地操作:表示操作的是本地電腦的文件夾中的文件。
?遠(yuǎn)程操作:表示操作的是遠(yuǎn)程倉(cāng)庫(kù)(如: gitLab 、碼云等第三方代碼管理倉(cāng)庫(kù))中的文件。
2. 區(qū)分“工作區(qū)”、“暫存區(qū)”與“待推送區(qū)”
?注意:工作區(qū)、暫存區(qū)與待推送區(qū)都是指本地操作。(名字是我自己理解后起的,歡迎糾正為正規(guī)名稱(chēng))
?工作區(qū):表示正在修改或修改過(guò)的文件的存儲(chǔ)區(qū)域,也就是文件夾中的文件。
?暫存區(qū):表示將修改過(guò)的文件打上標(biāo)識(shí),標(biāo)記為已經(jīng)確認(rèn)修改完成的文件,體現(xiàn)在文件夾中的 .git 文件。
?待推送區(qū):表示更換暫存區(qū)中的文件標(biāo)識(shí),標(biāo)記為本地代碼已經(jīng)全部修改完畢,可以推送到遠(yuǎn)程倉(cāng)庫(kù)了,體現(xiàn)在文件夾中的 .git 文件。
3. 區(qū)分主線與分支
?主線:新建的遠(yuǎn)程倉(cāng)庫(kù)默認(rèn)會(huì)生成一個(gè) master 分支。
?分支:根據(jù)業(yè)務(wù)需求創(chuàng)建的分支,常用的有 feature 分支(功能分支)、bug 分支(問(wèn)題修復(fù)分支)
?ps: 建議不要直接在 master 分支上開(kāi)發(fā),而是從 master 上新建 feature 分支,待開(kāi)發(fā)完成、測(cè)試無(wú)誤后合并到 master 上。
4. Git 標(biāo)簽
?標(biāo)簽通常用于代碼封版的時(shí)候使用。作用于 commitID 上,因?yàn)閏ommitID 是一串無(wú)規(guī)則字符串,不易區(qū)分和理解,所以添加標(biāo)簽可以方便區(qū)分版本與代碼回溯,并且可通過(guò)標(biāo)簽快速找到對(duì)應(yīng)的 commitID。
實(shí)際場(chǎng)景中使用Git命令
一、本地代碼已經(jīng)寫(xiě)完,如何推送到第三方代碼管理倉(cāng)庫(kù)(如:碼云等)的新建項(xiàng)目中?
- 打開(kāi) Git 命令工具,進(jìn)入到本地代碼文件夾,執(zhí)行
git init初始化該文件夾。 - 執(zhí)行
git remote add origin + 遠(yuǎn)程項(xiàng)目地址,關(guān)聯(lián)本地文件夾與遠(yuǎn)程庫(kù)。 - 執(zhí)行
git status,查看被修改過(guò)的文件。 - 如果忘記修改了哪些內(nèi)容,可以執(zhí)行
git diff + 步驟3中顯示的修改過(guò)的文件路徑(注意:一定按照步驟3顯示的文件按路徑寫(xiě),精確到文件名稱(chēng)與后綴),查看完可以通過(guò)q或者shift+z+z(按住 shift 同時(shí)按兩次 z 鍵)退出。 - 如果有一些文件不想修改,可以執(zhí)行
git checkout -- 文件路徑來(lái)撤銷(xiāo)修改。 - 確認(rèn)沒(méi)問(wèn)題了,執(zhí)行
git add 文件路徑來(lái)一個(gè)個(gè)添加文件,或者執(zhí)行git add 文件夾路徑添加整個(gè)文件夾下的文件,再或者執(zhí)行git add -A添加全部文件到暫存區(qū)。
************** PS:到此為止,結(jié)束了“工作區(qū)”的操作 ************** - 如果此時(shí)需要干點(diǎn)別的,這次的代碼下次管理的話,可以執(zhí)行
git stash將代碼進(jìn)行存儲(chǔ)(當(dāng)然它也將工作區(qū)中的代碼一起存儲(chǔ)了),之后要是想看存儲(chǔ)了哪些,可以執(zhí)行git stash list,如果想恢復(fù)就執(zhí)行git stash apply +list中的id。更多儲(chǔ)藏命令,請(qǐng)參照本文命令整理。 - 如果有些文件不想提交了,可執(zhí)行
git reset HEAD +文件路徑,將文件退回到工作區(qū),再由工作區(qū)放棄修改。 - 確認(rèn)沒(méi)啥問(wèn)題就可以執(zhí)行
git commit -m +"提交備注",將代碼提交到待推送區(qū)。注意:一定要寫(xiě)提交備注,方便以后查看知道提交了什么功能等。
************** PS:到此為止,結(jié)束了“暫存區(qū)”的操作 ************** - 如果不想推送到遠(yuǎn)程倉(cāng)庫(kù),可執(zhí)行
git reset --hard HEAD^,退回到上一次提交的版本。 - 確認(rèn)沒(méi)啥問(wèn)題,執(zhí)行
git push -u origin +自己的分支,將代碼推送到遠(yuǎn)程。(第一次推送需要添加-u,以后可以省略)更多撤銷(xiāo)待推送區(qū)代碼命令,請(qǐng)參照本文命令整理。
************** PS:到此為止,所有操作結(jié)束 **************
二、我想查看之前都提交了什么東西,怎么操作?
?執(zhí)行 git log 可以查看詳細(xì)的提交信息(包括 commitID、提交人、提交時(shí)間、提交備注)。
?如果只想看 CommitID 和 提交備注,可執(zhí)行 git log --pretty=oneline。<br/>  如果只看某個(gè)文件的提交記錄,可打開(kāi)指定文件所在的文件夾,執(zhí)行git log --pretty=oneline +指定文件名`。
三、線上、內(nèi)網(wǎng)、測(cè)試三種環(huán)境的代碼怎么區(qū)分?
這里就要用到 Git 最好用的功能了(個(gè)人認(rèn)為)—— 分支!
- Git 項(xiàng)目自帶一個(gè) master 分支(主線),可以以它為線上環(huán)境。
- 在 master 分支上執(zhí)行
git checkout -b +分支名,可以創(chuàng)建并切換到該分支,以它為內(nèi)網(wǎng)環(huán)境。這里暫命名為 dev 分支 - 在從 master 分支上新建一個(gè)測(cè)試分支,這里暫命名為 dev-test 分支。
- 三種環(huán)境搭建完成后,可以在 dev 分支中進(jìn)行日常開(kāi)發(fā)工作,開(kāi)發(fā)完成后,執(zhí)行
git checkout dev-test切換到 dev-test 分支,然后執(zhí)行git merge dev -m +"合并備注"將 dev 分支中的代碼合并到 dev-test 分支,或者執(zhí)行git merge --on-ff -m +"合并備注"可以合并分支并生成合并日志,然后測(cè)試成功之后再合并到 master 上進(jìn)行發(fā)版。 - 如果你忘記你又哪些分支時(shí),可執(zhí)行
git branch查看所有分支名,分支名前面帶星號(hào)的就是當(dāng)前分支。 - 在測(cè)試期間如果出現(xiàn) bug ,可新建 bug 分支(
git checkout -b bug-***),在修復(fù)后再合并到 dev 分支,然后執(zhí)行git branch -d +分支名將該分支刪除。 - 這里的所有操作都是本地操作!如果想在遠(yuǎn)程倉(cāng)庫(kù)也有你新建的分支,需要執(zhí)行
git push origin +分支名推送到遠(yuǎn)程倉(cāng)庫(kù)。
怎么從現(xiàn)有的遠(yuǎn)程倉(cāng)庫(kù)獲取代碼開(kāi)發(fā)呢?
- 執(zhí)行
git clone +遠(yuǎn)程倉(cāng)庫(kù)代碼地址將遠(yuǎn)程的 master 代碼拉取到本地。 - 拉取到本地后,如果想再拉取分支上的代碼,可執(zhí)行
git pull origin +遠(yuǎn)程分支名將指定分支拉去到本地。 - 如果你是參與開(kāi)源項(xiàng)目,最好拉去代碼后新建一個(gè)自己分支,開(kāi)發(fā)結(jié)束后,可以將分支推送到遠(yuǎn)程倉(cāng)庫(kù),由項(xiàng)目管理者確認(rèn)是否要合并你的代碼。
本地代碼保存到多個(gè)第三方管理倉(cāng)庫(kù)該怎么操作呢?
- 先將本地代碼關(guān)聯(lián)到一個(gè)第三方管理倉(cāng)庫(kù)
git remote add origin +第三方管理倉(cāng)庫(kù)地址,然后將代碼推送。 - 代碼推送成功后,執(zhí)行
git remote remove origin取消關(guān)聯(lián),再執(zhí)行步驟1中的命令,關(guān)聯(lián)其他的第三方倉(cāng)庫(kù)。 - 如果不知道現(xiàn)在關(guān)聯(lián)的是哪一個(gè)倉(cāng)庫(kù)了,可執(zhí)行
git remote -v查看當(dāng)前管理的倉(cāng)庫(kù)地址。
多人開(kāi)發(fā)時(shí)代碼該如何管理呢?
- 從開(kāi)發(fā)分支(暫叫 dev 分支)上新建自己的功能分支(feature 分支),然后進(jìn)行開(kāi)發(fā)。
- 開(kāi)發(fā)完成,先執(zhí)行
git pull拉取 dev 分支上最新的代碼。然后執(zhí)行git push origin dev將自己的代碼推送到遠(yuǎn)程倉(cāng)庫(kù)。 - 如果拉取 dev 分支后提示有沖突時(shí),需要手動(dòng)對(duì)沖突代碼進(jìn)行取舍,處理結(jié)束后再提交推送。
- 如果 git pull 提示 no tracking information,則說(shuō)明本地分支與遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建,用命令 git branch --set-upstream-to=遠(yuǎn)程主分支/遠(yuǎn)程分支 本地分支。
常用命令整理
本地操作
-
git init:初始化文件夾為 git 倉(cāng)庫(kù) -
git add +文件路徑:將文件添加到“暫存區(qū)” -
git commit -m +提交備注: 將文件提交到“待推送區(qū)” -
git status:查看被修改過(guò)的文件 -
git deff +文件路徑:比較查看文件修改了哪些內(nèi)容 -
git log:查看詳細(xì)的提交記錄 -
git log --pretty=oneline:僅查看包含 commitID 和提交備注的提交記錄 -
git log --pretty=oneline +文件名:到某個(gè)文件夾下執(zhí)行該代碼,查看指定文件的提交記錄 -
q或shift+z+z:退出查看日志或記錄 -
git checkout -- 文件路徑:撤銷(xiāo)“工作區(qū)”修改的文件內(nèi)容 -
git reset HEAD 文件路徑:撤銷(xiāo)“暫存區(qū)”修改的文件內(nèi)容 -
git reset --hard HEAD^:回退到上個(gè)版本(上一次的commit) -
git reset --hard HEAD~10: 回退到上10個(gè)版本 -
git reset --hard +commitID:退回到指定 commit -
git reflog:查看之前的 commitID -
git rm +文件路徑:刪除指定文件
遠(yuǎn)程操作
-
git remote add origin 遠(yuǎn)程倉(cāng)庫(kù)地址:關(guān)聯(lián)遠(yuǎn)程庫(kù) -
git remote remove origin:取消關(guān)聯(lián) -
git push -u origin +本地分支名: 將分支推送到遠(yuǎn)程倉(cāng)庫(kù) -
git clone +遠(yuǎn)程代碼地址:拉取遠(yuǎn)程倉(cāng)庫(kù)代碼 -
git pull origin +遠(yuǎn)程倉(cāng)庫(kù)分支: 拉取指定遠(yuǎn)程倉(cāng)庫(kù)分支代碼 -
git remote -v:查看遠(yuǎn)程倉(cāng)庫(kù)詳細(xì)信息(倉(cāng)庫(kù)連接地址)
分支操作
-
git checkout -b +分支名:創(chuàng)建并切換分支 -
git checkout +分支名:切換分支 -
git branch +分支名:創(chuàng)建分支 -
git branch:查看分支 -
git merge +被合并分支名:合并分支 -
git merge v--on-ff -m +合并描述: 合并分支并生成合并日志 -
git branch -d +分支名:刪除分支 -
git branch -D +分支名:強(qiáng)制刪除分支 -
git log --graph --pertty=oneline -abbrev-commit:查看分支合并情況
儲(chǔ)藏管理
-
git stash:儲(chǔ)藏當(dāng)前“工作區(qū)”內(nèi)容 -
git stash list:查看儲(chǔ)藏內(nèi)容 -
git stash apply:恢復(fù)儲(chǔ)藏內(nèi)容到工作區(qū),但不刪除儲(chǔ)藏內(nèi)容 -
git stash apply +儲(chǔ)藏內(nèi)容的key:恢復(fù)指定儲(chǔ)藏內(nèi)容 -
git stash drop:刪除儲(chǔ)藏內(nèi)容 -
git stash drop +儲(chǔ)藏內(nèi)容的key:刪除指定儲(chǔ)藏內(nèi)容 -
git stash pop +儲(chǔ)藏內(nèi)容的key:恢復(fù)并刪除指定儲(chǔ)藏內(nèi)容
標(biāo)簽管理
-
git tag +標(biāo)簽名:創(chuàng)建標(biāo)簽,默認(rèn)打在最新的 commitID 上 -
git tag +標(biāo)簽名 +commitID:在指定 commitID 上創(chuàng)建標(biāo)簽 -
git tag:查看所有標(biāo)簽,按字母排序 -
git show +標(biāo)簽名:查看指定標(biāo)簽信息 -
git tag -a +標(biāo)簽名 -m +標(biāo)簽描述:創(chuàng)建帶描述的標(biāo)簽 -
git tag -d +標(biāo)簽名:刪除指定標(biāo)簽 -
git push +遠(yuǎn)程分支 +標(biāo)簽名:推送指定本地標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù) -
git push +遠(yuǎn)程分支名 --tags:推送全部未推送的本地標(biāo)簽
結(jié)束語(yǔ)
該文章參考廖雪峰老師的 Git 教程+平常搜索收集的,感謝廖雪峰老師和各位提供命令筆記的同學(xué)們。同時(shí)該文章中如有操作命令錯(cuò)誤或者您有其他常用命令,歡迎下方留言。