算是personal tech debt吧,趁周末有時(shí)間,把這部分訓(xùn)練一下。這部分是純粹基礎(chǔ)的內(nèi)容,但對(duì)于日常工作,目前來(lái)說(shuō)是夠了的,可能和我本身就是Junior的職位有關(guān)。
使用基礎(chǔ)包括以下兩個(gè)部分:
- Source Tree與Git連接
- Git commit/pull/push/merge/fetch/branch
整個(gè)流程配合一個(gè)簡(jiǎn)單的Sample Project。
Source Tree與Git連接
- 下載及安裝Source Tree
這一步請(qǐng)自行完成。至于為什么要用Source Tree,而不用git命令行工具,這個(gè)是個(gè)人選擇,如果用命令行,可以略過(guò)本文,因?yàn)楸疚牡闹攸c(diǎn)是在如何用Source Tree使用Git。
下一步之前,你需要有一個(gè)Git賬戶。 - 連接Git和Source Tree。
打開(kāi)安裝好的Source Tree,在右上角??里添加自己的Git賬號(hào)即可,https和ssh方式都可以,如果你對(duì)ssh方式不熟悉,可以先使用https,用賬號(hào)密碼的方式來(lái)處理。將來(lái)有需要了,可以進(jìn)一步了解ssh方式。
使用Source Tree進(jìn)行第一次Commit
- 擁有一個(gè)project
有一個(gè)項(xiàng)目,或者repo,是進(jìn)行提交的前提。本著簡(jiǎn)單的角度出發(fā),可以在Github的自己的主頁(yè)建立一個(gè)名字叫做demo的project/repo,然后打開(kāi)這個(gè)repo,點(diǎn)擊綠色按鈕clone or download,就可以得到https的repo地址,復(fù)制這個(gè)地址。 - 連接reop到Source Tree
在Source Tree小窗選擇new-clone from url,填入url后,選擇https方式,即可連接完畢。這幾步比較簡(jiǎn)單,如果出現(xiàn)問(wèn)題,請(qǐng)自行搜索一下解決方案。 - 初次commit
當(dāng)你剛才添加repo到Source Tree之后,其實(shí)你做了幾件事。- 添加repo給Source Tree管理
- 在本地建立了一個(gè)repo
- 本地的repo與遠(yuǎn)程repo之間建立了關(guān)聯(lián)
意義:本地和遠(yuǎn)程的倉(cāng)庫(kù),就像是公司電腦和家里辦公的電腦。兩臺(tái)電腦一般來(lái)說(shuō),希望保持文件一致性(假設(shè)你一直工作在一個(gè)項(xiàng)目,而不是家里與公司工作內(nèi)容不同)。但是,這種同步性,并不是自動(dòng)的,這里就會(huì)出現(xiàn)各種各樣的問(wèn)題,以及后續(xù)操作的復(fù)雜性。這一點(diǎn)先要交代一下,不然后面的工作比較難的理解。
我們假設(shè)本地的倉(cāng)庫(kù)叫做demo_local,遠(yuǎn)程的叫做demo_remote,兩個(gè)倉(cāng)庫(kù)都針對(duì)一個(gè)項(xiàng)目project。這里可能會(huì)出現(xiàn)若干種狀態(tài),只提出來(lái),不要管解決,先給自己一個(gè)現(xiàn)實(shí)印象。假設(shè)當(dāng)前兩個(gè)倉(cāng)庫(kù)是保持一致的,文件內(nèi)容完全統(tǒng)一。然后我們有可能做出改動(dòng),從而導(dǎo)致兩個(gè)倉(cāng)庫(kù)內(nèi)容不同:
- 我們修改了demo_local;
- 我們修改了demo_remote;修改demo_remote可以通過(guò)很多種方式達(dá)到,比如Github網(wǎng)頁(yè)或者其他人在你的項(xiàng)目提交了內(nèi)容;
之后的內(nèi)容,就會(huì)在這種不同的基礎(chǔ)上,提一下我們的解決辦法。但在此之前,邏輯上我們得提出目的:有不同,我們需要做什么?比如: - 我們修改了demo_local,我們希望遠(yuǎn)程也更新這部分修改;
- 修改了demo_remote,我們希望本地也能與遠(yuǎn)程保持一致;
對(duì),這就是我們的目的,到這里,可能比較能理解,操作其實(shí)比較容易的。
先說(shuō)最基本的,我們要改一下本地的內(nèi)容。
你可以隨意在demo文件夾增加一個(gè)文件,比如說(shuō)test.java,然后會(huì)發(fā)現(xiàn)source tree中出現(xiàn)了這種改變,此時(shí)我們可以commit,并選中push change immediately to ...這樣,第一個(gè)commit就完成了,同時(shí),遠(yuǎn)程也同步了這次commit。
commit & push
剛才進(jìn)行的兩個(gè)操作就是:先本地提交,再上傳更新到遠(yuǎn)程。
如果你不選擇push...選項(xiàng),那就是只有本地提交,可以之后再push,分開(kāi)進(jìn)行。如果是這樣,Source Tree會(huì)用標(biāo)記1提示你,你有一個(gè)本地commit沒(méi)有提交到遠(yuǎn)程。
簡(jiǎn)單的部分結(jié)束了,接下來(lái)的部分,得自己通過(guò)項(xiàng)目感受一下
接下來(lái)的內(nèi)容,是理解一下Source Tree的每個(gè)按鈕。我沒(méi)有按照項(xiàng)目順序來(lái)說(shuō)這部分。如果希望step by step tutorial,可以搜尋其他的文檔,有很多。這里只說(shuō)每個(gè)按鈕的意義和作用分別是什么。至于他們?cè)趺春蚫emo關(guān)聯(lián),請(qǐng)自己嘗試項(xiàng)目后,再來(lái)看下面的內(nèi)容是什么意思。
下面的按鈕,并未按照Source Tree界面的順序來(lái)??赡苊總€(gè)人心里都有一個(gè)“不懂”-“懂”的順序,從而有希望優(yōu)先理解的順序。
- Fetch按鈕
從遠(yuǎn)程獲取內(nèi)容,比如其他人,或者你自己用其他工具/電腦提交了更新,本地的repo不知道,需要fetch才行;
Fetch并不專門針對(duì)某一個(gè)分支,而是會(huì)將所有的分支更新都拉回來(lái)。 - Pull按鈕
將從遠(yuǎn)程拉取的更新,并入到本地;比如其他更新在遠(yuǎn)程已經(jīng)有了,但本地沒(méi)有同步,先Fetch后,pull就會(huì)真正并入,F(xiàn)etch相當(dāng)于change,pull相當(dāng)于apply change; - Push按鈕
在本地的更新,commit,如果不與remote同步,會(huì)保持在本地,同時(shí)push按鈕會(huì)出現(xiàn)本地更新commit的次數(shù),如果需要與遠(yuǎn)程同步,就用push。 - Branch按鈕
新建分支,或者刪除現(xiàn)有分支 - Merge按鈕
當(dāng)希望將遠(yuǎn)程的其他分支并入當(dāng)前分支,比如master更新了,希望將本地branch1中并入master的改動(dòng),那么就需要merge。
merge需要選擇對(duì)象。比如master做了兩個(gè)commit改動(dòng),G1和G2,只希望并入G1,那么就選擇G1的master節(jié)點(diǎn),并入當(dāng)前branch1,同時(shí)處理沖突。
Merge的意思,是將別的分支的內(nèi)容,合并到當(dāng)前分支,這里需要注意,合并的意思是:我知道m(xù)aster修改了,我已經(jīng)將改動(dòng)的部分拉回來(lái)看了,有沖突,我選擇了希望保留的部分,也保留了自己想要的卻和master不一樣的部分。處理完沖突后,merge完成,完成的內(nèi)容并不是以master為準(zhǔn)的。graph會(huì)出現(xiàn)分支合并的形狀,注意這里表示的是動(dòng)作,而不是內(nèi)容。我做出了合并的動(dòng)作,但合并的內(nèi)容還是branch1自己決定的。 - 沖突處理
沖突出現(xiàn)后,比如希望merge master的內(nèi)容,點(diǎn)了merge后,出現(xiàn)了沖突,處理的順序是,首先在文件中處理,哪些更新需要保留,那些需要修改;
修改完成后,重新commit因此,就會(huì)完成合并動(dòng)作。 - Pull request
這個(gè)和Merge就不是一個(gè)意思了,Pull request是指將當(dāng)前branch1的內(nèi)容,提交至master,也就是分支的工作,合并入master主體工作,代表著分支工作的完成,因此,預(yù)期是分支在此之后就不會(huì)再存在了,所以,流程是不同的。
Pull request發(fā)出后,首先也是要處理沖突,選擇好要處理的部分,確認(rèn)提交后,就可以完成merge了。
這里的merge一旦完成,兩個(gè)分支master和branch1就會(huì)保持一致了,這個(gè)和merge完全不同,這里的意思是:我做出了要求合并入master的動(dòng)作,合并的內(nèi)容能否通過(guò)由master沖突處理決定,一旦處理完成,branch1的內(nèi)容也會(huì)和處理的結(jié)果保持一致。
理論上來(lái)說(shuō),完成了pull request之后,分支就可以不要了,但如果想保留,其實(shí)不刪除的話,還是可以繼續(xù)更新的,就如同是剛剛從master建的分支一樣。
其實(shí),看過(guò)不少git的教程,但其實(shí)最真實(shí)的感受就是:你得感覺(jué)得到需求在哪里,才能理解那些設(shè)置的原因是什么。同時(shí)你得理解邏輯過(guò)程,才能理解每個(gè)操作可能出現(xiàn)的問(wèn)題和后果。
此篇稍微記錄一下對(duì)于Git技術(shù)債還款的第一部分。給自己點(diǎn)個(gè)贊??