一靡羡、簡(jiǎn)介
1.概述
Git 是一個(gè)開(kāi)源的分布式版本控制系統(tǒng)隆判,用于敏捷高效地處理任何或小或大的項(xiàng)目麻蹋。
Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開(kāi)發(fā)而開(kāi)發(fā)的一個(gè)開(kāi)放源碼的版本控制軟件。
Git 與常用的版本控制工具 CVS, Subversion 等不同佛嬉,它采用了分布式版本庫(kù)的方式夜只,不必服務(wù)器端軟件支持垒在。
2.工作流程
一般工作流程如下:
- 克隆 Git 資源作為工作目錄。
- 在克隆的資源上添加或修改文件扔亥。
- 如果其他人修改了场躯,你可以更新資源。
- 在提交前查看修改旅挤。
- 提交修改踢关。
-
在修改完成后,如果發(fā)現(xiàn)錯(cuò)誤粘茄,可以撤回提交并再次修改并提交签舞。
3.基本配置
-
git config: 環(huán)境設(shè)置命令
通常情況下,安裝完Git后的第一件事就是設(shè)置用戶(hù)名稱(chēng)和郵件地址柒瓣。每一個(gè)Git的提交都會(huì)使用這些信息儒搭,如果不設(shè)置則無(wú)法進(jìn)行提交。git config --global user.name "goto456" // 設(shè)置用戶(hù)名稱(chēng) git config --global user.email "goto456@126.com" // 設(shè)置郵件地址
使用--global參數(shù)表示設(shè)置了全局的環(huán)境芙贫,如果想對(duì)與特定的項(xiàng)目使用不同的用戶(hù)名和郵件地址搂鲫,則可已在該項(xiàng)目目錄下不使用--global參數(shù)設(shè)置不同的用戶(hù)名和郵件地址。
git config --list命令可以列出當(dāng)前Git所有的配置信息磺平。
-
ssh-keygen: 生成SSH公鑰
生成公鑰之前先檢查系統(tǒng)中是否已經(jīng)有了公鑰魂仍,公鑰一般在~/.ssh/目錄下。如果該目錄下存在id_rsa.pub文件褪秀,這就是公鑰(id_rsa 文件是私鑰)蓄诽;如果不存在此文件薛训,甚至連.ssh目錄都不存在媒吗,則需要用 ssh-keygen 命令來(lái)生成。如下所示:ssh-keygen // 然后一直按回車(chē)鍵
這就可以生成 SSH key 了乙埃,公鑰id_rsa.pub文件的內(nèi)容大致如下所示:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/bdrJjo6HNCuzhpTZNVsTju5NnksTca2kRzfbZlFs+8S4bs8hTlo6aV/GJPkTT0zxJfuOgfd4B4O8Xh0NQg51Zl4yCsFdnIKFA0tgBOg/H5oi48Ypoo8hHfvtxqYrG1Blhf0t6HhkHz9Fd8StCUIDQv7yHHvuuPFumh3/8PNG8DDPQqWsqXmK2XozT goto456@126.com
二闸英、基本命令
1.獲取倉(cāng)庫(kù)
獲取一個(gè) Git 倉(cāng)庫(kù)有2中方法:
本地初始化一個(gè)倉(cāng)庫(kù)
從遠(yuǎn)程克隆一個(gè)倉(cāng)庫(kù)到本地
對(duì)于第1種方式,如果想對(duì)本地現(xiàn)有的一個(gè)項(xiàng)目用 Git 來(lái)管理介袜,可以直接進(jìn)入該項(xiàng)目的目錄下執(zhí)行如下命令甫何,就可以將其初始化成一個(gè) Git 倉(cāng)庫(kù)了:git init
對(duì)于第二種方式,也是最常用的方式遇伞,比如你在 GitHub 上(或者其他代碼托管網(wǎng)站)已經(jīng)建立了一個(gè)項(xiàng)目辙喂,你就可以將該項(xiàng)目從遠(yuǎn)程克隆到本地,這就有了該項(xiàng)目在本地的 Git 倉(cāng)庫(kù)。
git clone git@github.com:goto456/leetcode.git // 通過(guò)ssh方式克隆
git clone https://github.com/goto456/leetcode.git // 通過(guò)https方式克隆
以上2種方式有如下區(qū)別:
- https方式:不管是誰(shuí)巍耗,只要拿到該項(xiàng)目的 url 可以隨便 clone秋麸,但是在 push 到遠(yuǎn)程的時(shí)候需要驗(yàn)證用戶(hù)名和密碼;
- ssh方式:需要現(xiàn)將你電腦的SSH key(SSH公鑰)添加到GitHub(或者其他代碼托管網(wǎng)站)上炬太,這樣在 clone 項(xiàng)目和 push 項(xiàng)目到遠(yuǎn)程時(shí)都不需要輸入用戶(hù)名和密碼灸蟆。
2.工作區(qū)、暫存區(qū)和版本庫(kù)
工作區(qū)(Working Directory):就是你在電腦里能看到的目錄
版本庫(kù)(Repository):工作區(qū)有一個(gè)隱藏目錄.git亲族,這個(gè)不算工作區(qū)炒考,而是Git的版本庫(kù)。
Git的版本庫(kù)里存了很多東西霎迫,其中最重要的就是稱(chēng)為stage(或者叫index)的暫存區(qū)斋枢,還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master
,以及指向master的一個(gè)指針叫HEAD知给。
3.提交修改
-
git status 查看當(dāng)前狀態(tài)
可以在任何時(shí)候使用該命令查看當(dāng)前的狀態(tài)杏慰。一般會(huì)顯示當(dāng)前所處的分支,以及當(dāng)前工作區(qū)是否干凈炼鞠,是否有文件要提交缘滥。
當(dāng)你克隆遠(yuǎn)程倉(cāng)庫(kù)到本地后,通過(guò)該命令查看當(dāng)前狀態(tài)時(shí)谒主,顯示信息如下圖所示:
當(dāng)你修改了一個(gè)文件后朝扼,再用該命令查看當(dāng)前狀態(tài),顯示信息如下圖所示:
-
git diff: 顯示變更內(nèi)容
當(dāng)你對(duì)文件進(jìn)行了修改霎肯,想查看進(jìn)行了哪些修改時(shí)擎颖,可以通過(guò)該命令查看。
git diff命令會(huì)顯示修改的文件中哪些內(nèi)容進(jìn)行了修改观游,包括新增了哪些內(nèi)容搂捧,刪除了哪些內(nèi)容。git diff README.md //后面接文件名懂缕,表示只顯示該文件的變更
例如:我對(duì) README.md 文件進(jìn)行了修改允跑,刪除了1行,新增了2行搪柑,然后用該命令查看進(jìn)行了哪些修改聋丝,如下圖所示: (“+” 表示新增的內(nèi)容,“-” 表示刪除的內(nèi)容)
-
git add: 添加到暫存區(qū)
無(wú)論你新增了一個(gè)文件或者對(duì)已有的文件進(jìn)行了修改工碾,都需要將其添加到暫存區(qū)弱睦,然后提交到版本庫(kù)。git add hello.txt //后面接文件名渊额,表示將某個(gè)文件添加到暫存區(qū) git add . //后面接一個(gè)點(diǎn)况木,表示將全部文件添加到暫存區(qū)
如果是刪除的文件垒拢,用git add -A 文件名,或者git rm 文件名 添加到暫存區(qū)
-
git commit: 提交到版本庫(kù)
該命令是將添加到暫存區(qū)的變更提交到版本庫(kù):git commit -m "變更的說(shuō)明信息"
4.撤銷(xiāo)修改與版本回退
- 撤銷(xiāo)文件的修改包括以下兩個(gè)場(chǎng)景:
從工作區(qū)撤銷(xiāo)某個(gè)文件修改(修改當(dāng)然也包括刪除):
從暫存區(qū)撤銷(xiāo)某個(gè)文件修改:git checkout -- filename //filename替換為你想撤回的文件名
git reset HEAD filename //filename替換為你想撤回的文件名
- 回退版本
git log: 查看歷史提交
如果發(fā)現(xiàn)提交了一個(gè)錯(cuò)誤版本火惊,想回退到上個(gè)版本時(shí)子库,就可以通過(guò)該命令來(lái)查看所有的歷史版本,以選擇回退到歷史的哪個(gè)版本矗晃。
執(zhí)行后仑嗅,如下圖所示:git log //查看歷史版本 git log --graph //以圖形的方式查看歷史
git reset: 回退版本
常用于回退版本或者在各個(gè)版本間進(jìn)行跳躍切換。 我們可以先用 git log 看一下當(dāng)前歷史版本张症,如下圖所示:
如果要回退兩個(gè)版本仓技,則只需要輸入:git reset HEAD~2
或者git reset --hard a8336834b50daafa0793370
5.拉取與提交
git pull: 拉取遠(yuǎn)程分支到本地并合并
一般是本地分支的進(jìn)度落后于遠(yuǎn)程分支時(shí),需要使用該命令俗他。
命令:git pull origin master
origin 表示遠(yuǎn)程代碼庫(kù)的一個(gè)別名(也可以修改為其他名字脖捻,可通過(guò) git remote 修改),master 表示需要拉取合并的分支名稱(chēng)兆衅。
命令:git pull --rebase origin master
用 rebase 的方式進(jìn)行地沮,不會(huì)產(chǎn)生 merge 保持分支干凈、整潔git push: 推送本地分支到遠(yuǎn)程
當(dāng)修改完成羡亩,本地的改動(dòng)都已經(jīng)提交到本地庫(kù)摩疑,則可以將本地分支推送到遠(yuǎn)程代碼庫(kù)了。
命令:git push origin master
origin 表示遠(yuǎn)程代碼庫(kù)的一個(gè)別名(也可以修改為其他名字畏铆,可通過(guò) git remote 修改)雷袋,master 表示需要推送的分支名稱(chēng)。
如果辞居,push 的過(guò)程中提示當(dāng)前分支進(jìn)度落后于遠(yuǎn)程的分支楷怒,則需要通過(guò) git pull 命令來(lái)拉取遠(yuǎn)程最新?tīng)顟B(tài)和本地分支進(jìn)行合并,完成之后再 push 到遠(yuǎn)程就可以了瓦灶。
6.標(biāo)簽管理
git tag: 標(biāo)簽的操作
用于給某次提交打個(gè)標(biāo)簽鸠删,例如截止到某次提交后完成了某個(gè)重大版本的開(kāi)發(fā),則可以在該次提交打上一個(gè)版本的 tag 贼陶。
命令:git tag v1.0
為當(dāng)前提交打上 v1.0 的標(biāo)簽
命令:git tag v1.0 ab1591eb4e06c1e93fdd50126b9fab8a88d89155
為這個(gè)節(jié)點(diǎn)打上 v1.0 的標(biāo)簽
命令:git tag -a <tagname> -m "blablabla..."
可以指定標(biāo)簽信息刃泡;
命令:git tag
可以查看所有標(biāo)簽。
命令:git show tag_name
顯示某個(gè) tag 的詳細(xì)信息(git show commit_id 顯示某次提交的詳細(xì)信息)
命令:git push origin <tagname>
可以推送一個(gè)本地標(biāo)簽每界;
命令:git push origin --tags
可以推送全部未推送過(guò)的本地標(biāo)簽捅僵;
命令:git tag -d <tagname>
可以刪除一個(gè)本地標(biāo)簽家卖;
命令:git push origin :refs/tags/<tagname>
提交到遠(yuǎn)端眨层。
三、分支使用及場(chǎng)景
1.分支總覽
2.創(chuàng)建上荡、刪除與合并分支
git branch
用于顯示本地所有分支以及當(dāng)前所在哪個(gè)分支趴樱。圖中顯示本地有 master 和 dev 兩個(gè)分支馒闷,并且正處在 master 分支上。git branch -vv
還能看到遠(yuǎn)程分支與關(guān)聯(lián)情況:
git branch branchName
用于新建名為 branchName 的新分支叁征。后接origin/dev纳账,標(biāo)識(shí)創(chuàng)建分支并關(guān)聯(lián)dev分支:git branch -D branchName
用于刪除名為 branchName 的分支:git checkout branchName
用于從當(dāng)前分支切換到名為 branchName的分支上:git checkout -b branchName
用于新建名為 branchName的分支并切換到該分支上。后面同樣可以接origin/dev這樣的參數(shù)捺疼,表示并關(guān)聯(lián)遠(yuǎn)程的dev分支:git merge
命令用于合并指定分支到當(dāng)前分支疏虫。需要注意的是,如果對(duì)同一份文件做了不同的修改啤呼,就會(huì)產(chǎn)生沖突卧秘,這時(shí)候需要手動(dòng)解決沖突,再提交官扣,完成merge翅敌。
例如以下文件就是在merge的時(shí)候產(chǎn)生的沖突:
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
3.分支策略管理
在實(shí)際開(kāi)發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先惕蹄,master分支應(yīng)該是非常穩(wěn)定的蚯涮,也就是僅用來(lái)發(fā)布新版本,平時(shí)不能在上面干活卖陵;
那在哪干活呢遭顶?干活都在dev分支上,也就是說(shuō)泪蔫,dev分支是不穩(wěn)定的液肌,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí)鸥滨,再把dev分支合并到master上嗦哆,在master分支發(fā)布1.0版本;
你和你的小伙伴們每個(gè)人都在dev分支上干活婿滓,每個(gè)人都有自己的分支老速,時(shí)不時(shí)地往dev分支上合并就可以了。
所以凸主,團(tuán)隊(duì)合作的分支看起來(lái)就像這樣:
4.臨時(shí)保存工作現(xiàn)場(chǎng)
修復(fù)bug時(shí)橘券,我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并卿吐,最后刪除旁舰;
當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下嗡官,然后去修復(fù)bug箭窜,修復(fù)后,再git stash pop衍腥,回到工作現(xiàn)場(chǎng)磺樱;
5.從某個(gè)分支的提交復(fù)制粘貼到另一個(gè)分支
git cherry-pick <commit>
也可以用AndroidStudio工具纳猫,進(jìn)行cherry-pick,這里就不詳細(xì)展開(kāi)了
6.AndroidStudio查看git操作
這里主要介紹常用的git diff圖形化界面: