Git使用總結
集中式VS分布式
個人認為就git這種分布式版本管理系統和類似SVN之類的集中式版本控制系統對比,主要有以下一些好處:
- git分布式系統上每台主機上都有完整的代碼,但是svn上完整的代碼是存在在中央伺服器上的。git上修改代碼之後,會将代碼修改送出到每台主機。其實這裡更好的了解是,這個是我們本地git的工作區間,伺服器的代碼是我們的主分支,我們對于伺服器來說都是次分支。
git在windows的安裝
略
指令總結
關于工作倉庫的解釋:工作倉庫就是你本地存放代碼的檔案夾,當然為了避免不必要的工作量,建議完整的路徑下不要包含中文字元。
相關指令如下
倉庫初始化指令: git init
檢視目前repository狀态: git status
檢視上一次修改: git diff
檢視最近修改的日志 git log
回退版本 git reset –hard HEAD^ 可以回退到上一個版本
回退版本 git reset –hard 送出id 可以回退到特定的版本
檢視送出id git reflog 這個送出id就是上一個指令中使用的送出id
git相關指令解析:将檔案add的時候其實是把檔案加入到.git檔案夾下的名為stage或者index的緩存工作區中,然後使用完commit指令之後才把檔案送出到master倉庫。
git checkout –檔案名 撤銷目前修改
- 将檔案回退到版本庫版本,前提是沒把修改送出(add)到緩存區
- 将檔案回退到緩存區版本,前提是送出了修改(add)到緩存區
删除檔案 git rm 檔案名 (然後再commit 你的修改)
遠端倉庫
這裡進行遠端倉庫的介紹,遠端倉庫,顧名思義就是遠端伺服器上的倉庫,例如github,京東雲彙等代碼托管網站上建立的遠端倉庫。
在git bash中使用以下指令和遠端倉庫連接配接(這裡不介紹遠端倉庫的建立)
git remote add origin (其中還有幾個參數需要配置)
從遠端倉庫下載下傳代碼 git clone 下載下傳位址
分支管理
分支管理的使用情景主要是在團隊開發中,每個人的在自己的工作區間做了工作,然後需要将自己的代碼更新給隊友,這時候就需要考慮分支合并了,其實每個人的主機相對于伺服器來說就是一個分支。其實,我們不可能每個人都在主分支工作,是以,通常我們會建立對于伺服器倉庫的的分支,然後進行工作。
分支建立 git branch 分支名稱
分支切換 git checkout 分支名稱
顯示分支 git branch (這裡的話,帶*号的分支是主分支)
合并分支 git merge 分支名稱 (将指定分支合并到目前分支)
分支是為了團隊合作,是以存在這種情況,分支合并的時候,可能會存在沖突,也就是你們修改了同一個檔案的同一行代碼的時候,會導緻沖突,這是git不會自動把你們的代碼合并,是以需要手動解決沖突。
合并分支的時候手動解決沖突的過程
1. 通過 git status 檢視沖突檔案和沖突情況
2. 手動修改沖突檔案的最終方案,然後送出(注意寫送出注釋)
git上兩種合并模式的介紹一種是FAST FORWARD 模式,在這種模式之下,删除分支之後會丢掉分支資訊。第二種是–no-ff模式,這種模式下,分支資訊不會被删除(分支指針還存在)具體指令如下:
git merge –no-ff -m “merge with no-ff” 分支名稱
bug分支的使用
這個新手入職,大部分都是改bug的工作,是以我這裡單獨的把這個知識拿出來講一下。很可能存在這樣一種情況,你本來有自己相對于伺服器倉庫的自己一個開發的分支,然後,你這時候來了一個修改bug的任務,但是你的開發分支任務沒有完成,這時候你就要考慮,是否需要建立一個分支,來處理這個bug,如果需要的話,你還需要将目前開發分支的狀态保留
保留分支狀态 git stash
然後你建立了bug分支之後,修改完了,送出到主分支,然後在切換回自己的分支進行工作。
多人開發相關操作
當你從遠端倉庫克隆時,實際上Git自動把本地的master分支和遠端的master分支對應起來了,并且,遠端倉庫的預設名稱是origin。
檢視遠端庫的資訊 git remote
檢視遠端庫推送位址 git remote -v
從遠端倉庫抓取分支 git clone 位址
推送分支到遠端伺服器 git push origin 推送的分支名稱
建立遠端的開發分支到本地 git checkout -b 分支名稱 origin/分支名稱
拉取最新送出 git pull
推送時忽略檔案
有時候存在這種情況,你本地的一些配置檔案沒必要往遠端倉庫推送(例如android中的 .class檔案等)
解決方法如下:
在Git工作區的根目錄下建立一個特殊的.gitignore檔案,然後把要忽略的檔案名填進去,Git就會自動忽略這些檔案。你隻需要将你的忽略的檔案類型,按照規範寫入到這個檔案當中去,就可以在送出的時候避免顯示這些檔案的送出了。
思考問題:
假設分支是:
- release 釋出分支
- dev 開發分支
- kl kl的開發分支
- yours 你的分支
- function1,2,3…n 正在開發的功能分支
- bug1,2,3…n
1. 思考一下這些分支哪些應該在伺服器端,哪些應該在用戶端,應該是怎樣一個政策
由于release版本是釋出版本,是以必須是最新的更新,而且必須是完整版本,是以放在伺服器上。
dev的話,在遠端倉庫也可以建立一個dev分支,用來合并最新的開發進度,這樣子就把釋出和開發分離開來了
kl和my分支都是個人開發分支,是以也需要在伺服器上建立分支,因為需要将個人開發的代碼往dev分支上合并。(個人主機的本地分支直接叫master的話)
function分支的話,因為需求在變化是以,沒必要在伺服器上建立特定的分支,個人本地建立一個function分支完成之後,push到伺服器即可。主要是考慮到需求的變化比較大。
bug分支的話,也是建立在個人本地比較好,因為bug分支隻是單單某一時期為了修改一個錯誤,沒必要在伺服器上建立分支(服務分支在開發周期就像一一條線一樣,你bug分支,隻能說是生命周期錯出來的一個點,是以從分支管理和簡潔的角度考慮,沒必要在伺服器建立bug分支)。
2. git log 和 git reflog的使用和復原的使用再加強,結合branch
git log 可以檢視到 送出日志
git reflog 可以檢視上一次送出的commit id
假設我們出現這樣一個問題,我在
3. 再深入”了解GIT是基于修改的”,思考GIT COMMIT,到底COMMIT的是什麼,COMMIT到哪裡,GIT ADD 呢?ADD到哪裡?怎樣對比兩個COMMIT的不同,怎麼檢視對比上次COMMIT,現在修改了哪些内容,具體修改了哪些内容
首先要,描述一下倉庫之間的關系,個人主機上的git init之後的檔案夾是個人的工作區間,然後存在.git這個隐藏檔案夾稱為緩存區和版本庫,然後git會自動幫你建立你的本地分支預設為master。
你使用add指令的時候,是将工作區的檔案或者修改送出到緩存區,然後一系列的add之後調用的commit方法,則是将緩存區的改動推送的本地分支。
可以通過git diff 指令檢視上次的commit 修改了那些部分
4. 如果我開發新功能的時候,忘了新開一個function分支,這時有一個緊急的bug修複。那怎樣做?
可以在目前開發分支上使用git stash指令,實作将目前分支的狀态儲存下來(假設你是在dev分支上進行開發的)
然後你自己需要修複bug的那條分支上建立一個bug分支,進行bug的修複,然後将bug合并後删除,然後切換回你之前的function開發分支。
遠端倉庫操作 ##
檢視所有分支 git branch -a 可以檢視到本地分支和遠端分支在内的所有分支
建立遠端分支
在本地建立分支之後推送到伺服器即可,例如:
git branch release
git push origin release
這樣就等于現在本地建立了一個 release 分支,然後推送到伺服器,等于在伺服器也建立了一個新的 release 分支了。
詳細的 git 學習教程參考 廖雪峰大神的 《git教程》