GIT介紹
Git 是一個開源的分佈式版本控制軟件,用以有效、高速的處理從很小到很是大的項目版本管理。 Git 最初是由Linus Torvalds設計開發的,用於管理Linux內核開發。Git 是根據GNU通用公共許可證版本2的條款分發的自由/免費軟件,安裝參見:http://git-scm.com/html
GitHub是一個基於Git的遠程文件託管平臺(同GitCafe、BitBucket和GitLab等)。git
Git自己徹底能夠作到版本控制,但其全部內容以及版本記錄只能保存在本機,若是想要將文件內容以及版本記錄同時保存在遠程,則須要結合GitHub來使用。使用場景:github
- 無GitHub:在本地 .git 文件夾內維護歷時文件
- 有GitHub:在本地 .git 文件夾內維護歷時文件,同時也將歷時文件託管在遠程倉庫
其餘:django
集中式:遠程服務器保存全部版本,用戶客戶端有某個版本
分佈式:遠程服務器保存全部版本,用戶客戶端有全部版本服務器
GIT安裝
安裝:https://git-scm.com/downloadsapp
GIT基本使用
先進入你要管理的文件夾,例如咱們進入一個django項目文件夾分佈式
打開GIT工具ide
git init 初始化,表示即將對當前文件夾進行版本控制工具
初始化後,會在當前目錄自動建立 .git 文件夾,該文件是Git中最重要的文件夾,由於Git相關文件以及版本都將保存在該文件夾中,有了它,媽媽不再用擔憂我好多文件來記錄版本了,經過Git命令能夠將全部版本保存在 .git 文件中post
git status 查看Git當前狀態,如:那些文件被修改過、那些文件還未提交到版本庫等
上圖中紅色的文件就是還未管理的文件
git add . git add 文件名,將指定文件添加到版本庫的暫存狀態
添加完成後再次查看狀態git status
能夠看到這些文件都變綠了,都被管理起來了
git commit -m "描述信息" 將暫存區的文件提交到版本庫的分支
注意:執行git commit 命令時,可能會提示進行用戶和郵箱的配置,該配置用於記錄當前版本由那個用戶提交
- git config --local user.name 'xxx'
- git config --local user.email 'you@example.com'
提交完成後再次查看狀態git status
發現當前工做目錄已經空了,這時若是對一個文件進行修改,再查看
會發現該文件又出現了,此時能夠再次提交
這樣咱們就又了兩個版本了,如何查看呢
git log 查看提交記錄,即:歷史版本記錄
能夠看到每個版本都對應一段字符串,若是要回滾到第一次提交
git reset --hard daf67abd92c4425f61575200da54b56d8978b380
這時再查看歷史記錄git log
發現第一次修改的版本沒有了,要如何找到呢
git reflog
切換回第一次修改
代碼開發到一半,須要修改前一個版本的bug
有時候當咱們正在開發時,可能上一個版本出現了bug,須要緊急修復,這時該怎麼辦呢,這裏有兩種方式
方式一:使用git stash
咱們可使用git stash命令,這樣咱們寫了一半的代碼就會被保存到一個暫存區域,而後代碼會回滾到咱們修改前的版本,也就是有bug的版本,咱們就能夠進行bug修復了,修復完bug後,咱們進行提交
提交完成後咱們須要回到咱們以前開發了一半的狀態繼續進行開發,這時須要執行git stash pop將以前開發了一半的內容從暫存區再次拿到工做區進行開發
特別的:執行 git stash pop 命令時,可能會遇到衝突,由於在緊急修復bug的代碼和經過stash存儲在「某個地方」的代碼會有重合部分,因此執行 git stash pop 時候就會出現衝突,有衝突解決衝突便可
![](http://static.javashuo.com/static/loading.gif)
a. 原來內容:
from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲專區') b. 開發到一半直播功能: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲專區') def live(request): print('開發到一半') return HttpResponse('....') c. 執行git stash,回到當前版本未修改狀態: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲專區') d. 修復Bug並提交: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲xxxxx專區') e. 繼續開發直播功能 git stash pop,此時會出現衝突: MacBook-Pro-4:pondo wupeiqi$ git stash pop Auto-merging app01/views.py CONFLICT (content): Merge conflict in app01/views.py 表示app01/views.py存在衝突須要解決,此時文件內容爲: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): <<<<<<< Updated upstream: # 修復Bug時更改的內容 return HttpResponse('非洲xxxx區') ======= # 修復Bug前正在開發新功能時的內容 return HttpResponse('非洲專區') def live(request): print('剛開發到一半') return HttpResponse('直播功能') >>>>>>> Stashed changes 須要自行解決衝突,而後繼續開發,如: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲xxxx區') def live(request): print('剛開發到一半') return HttpResponse('直播功能')
git stash其它相關命令
git stash 將當前工做區全部修改過的內容存儲到「某個地方」,將工做區還原到當前版本未修改過的狀態 git stash list 查看「某個地方」存儲的全部記錄 git stash clear 清空「某個地方」 git stash pop 將第一個記錄從「某個地方」從新拿到工做區(可能有衝突) git stash apply 編號, 將指定編號記錄從「某個地方」從新拿到工做區(可能有衝突) git stash drop 編號,刪除指定編號的記錄
方式二:使用分支
分支學習:branch稱爲分支,默認僅有一個名爲master的分支。通常開發新功能流程爲:開發新功能時會在分支dev上進行,開發完畢後再合併到master分支
咱們要開發時通常要先建立一個dev分支,並在dev分支上進行開發,master分支上通常放咱們開發完成的代碼
- git branch 分支名稱 建立分支
- git checkout 分支名稱 切換分支
- git branch -m 分支名稱 建立並切換到指定分支
- git branch 查看全部分支
- git branch -d 分支名稱 刪除分支
- git merge 分支名稱 將指定分支合併到當前分支
假如咱們如今正在dev分支上開發,忽然master分支上的前一個版本出現了bug,須要緊急修復咱們須要進行以下操做
dev(開發) 當要緊急修復bug了 a. [dev]將 dev 中如今正在開發的功能提交到dev git add . git commit -m 'xxx' b. 切換回主分支 git checkout master c. 建立並切換到bug分支 git branch bug git checkout bug 在bug分支上進行修復.... git add . git commit -m 'xxx' d. git checkout master 將修復好的bug分支合併到主分支 git merge bug git branch -d bug 刪除bug分支
git merge 時也可能會出現衝突,解決衝突的方式上述stash相同,即:找到衝突文件,手動修改衝突並提交,此處再也不敖述
git rebase
git rebase也是用來合併的,只是和git merge有一點小區別,git merge合併的提交記錄仍是兩條線,而git rebase會將提交記錄合併到一條主線
git rebase 合併+將提交記錄合併到一條主線=> 提交記錄整潔 若是產生衝突: 解決完衝突後 git rebase --skip
遠程git倉庫
上面咱們使用git都是將全部的內容存在本地,若是咱們既在公司寫代碼,回了家也要寫呢,這時咱們就須要一個遠程的倉庫,將咱們的代碼保存在這個遠程倉庫中
GitHub,一個基於Git實現的代碼託管的平臺,能夠將內容以及版本記錄在遠程也保存一份,這樣就不用U盤咯(相似於雲盤)。PS: 相似GitHub的產品還有許多,如:GitLab、Bitbucket、碼雲等
基於GitHub實現代碼託管,須要一下步驟:
- 註冊GitHub
- 建立倉庫,建立完倉庫後會有一個URL代指該倉庫,如:
- git能夠是用該URL進行向遠程推送版本信息或獲取版本信息
這樣咱們就能夠在家和在公司都進行開發了,具體步驟
a. 註冊帳戶 + 建立項目 + 拷貝地址 https://gitee.com/wupeiqi/xianglong.git b. 家,本地代碼推送遠程 cd 項目目錄 git remote add origin https://gitee.com/wupeiqi/xianglong.git 給遠程地址建立一個別名origin,這個別名能夠任意寫 git push origin master 將本地內容推送到遠程的master分支 git push origin dev 將本地內容推送到遠程的dev分支 繼續寫代碼 git add . git commit -m '提交記錄' git push origin dev c. 第一次公司 下載代碼 git clone https://gitee.com/wupeiqi/xianglong.git 適合在一個空目錄執行,這句命令就至關於下面的好幾個命令 或 建立目錄 cd 目錄 git init git remote add origin https://gitee.com/wupeiqi/xianglong.git git pull origin master 建立dev分支 git checkout dev git pull origin dev 繼續寫代碼 git add . git commit -m '提交記錄' git push origin dev d. 回家 拉代碼: git pull origin dev 繼續寫: 繼續寫代碼 git add . git commit -m '提交記錄' git push origin dev
久而久之,將Git和GitHub結合使用作到避免電腦損壞形成數據丟失以及多地開發的問題,上文執行過程當中執行 【git pull origin 分支】命令等同於【git fetch origin 分支】+ 【git merge origin/分支】,而且在執行過程當中可能會出現衝突,緣由是因爲本地代碼和獲取的最新代碼有重合部分,那麼就須要本身手動解決衝忽然後再繼續開發
協同開發
以前咱們都是一我的在作開發,如今業務變複雜了,須要多人協同開發了,該怎麼辦呢
多人協同開發:每一個人建立一個分支 master dev - kouxinlong - heng
咱們能夠在dev下每人再建立一個分支,每一個人在本身的分支中開發,開發完一個功能後再合併到dev分支,固然在合併以前咱們也能夠進行檢查,能夠再dev再建一個review分支
公司是否作代碼的review?誰來作?怎麼作? master dev - review(組長作代碼review) - kouxinlong - heng 通常:小功能合併;1/2/3
review完沒有問題的代碼再合併到dev分支上
github中如何和別人一塊兒開發
- 合做者,將其餘用戶添加到倉庫合做者中以後,該用戶就具備向當前倉庫提交代碼。
- 組織,建立一個組織,而後再該組織下能夠建立多個項目,組內成員能夠向組內全部項目提交代碼。PS:也能夠對某個項目指定合做者
協同開發命令和以上步驟相似,此處就再也不從新寫代碼,而是使用文件描述三人協同開發整個過程。
- 建立程序
- 用戶A建立程序,提交到GitHub
- 用戶B克隆項目
- 用戶C克隆項目
- 開發功能
- 用戶A開發功能1
- 用戶B開發功能2
- 用戶C開發功能3
- 提交
- 用戶A提交功能1,並push(A用戶手速快,先提交。)
- 用戶B提交功能2,沒法push,由於GitHub上已經有其餘人提交的新代碼。
解決方法:從GitHub上獲取最新代碼併合併到本地,提交本身開發的功能2。 - 用戶C提交功能3,沒法push,沒法提交,由於GitHub上已經有其餘人提交的新代碼。
解決方法:從GitHub上獲取最新代碼併合併到本地,提交本身開發的功能3。 - 獲取最新代碼
- 用戶A獲取最新代碼
- 用戶B獲取最新代碼
- 用戶C獲取最新代碼
給別人的代碼提意見
從上面咱們知道要想修改別人的代碼須要成爲別人的合做者,可是有些牛逼的代碼是不會讓你成爲合做者的,那麼咱們要怎麼作呢
找到想搞的項目,fork一下,而後這個項目就在本身倉庫出現了
從本身倉庫獲取代碼並進行編輯提交
建立並提交一個pull request,而後等待原做者是否贊成這個pull request,若是贊成那麼在做者的源代碼中就推出現我提交的功能
.gitignore 文件
建立 .gitignore 文件,編寫git忽略哪些文件
以斜槓「/」開頭表示目錄; 以星號「*」通配多個字符; 以問號「?」通配單個字符 以方括號「[]」包含單個字符的匹配列表; 以歎號「!」表示不忽略(跟蹤)匹配到的文件或目錄;
當咱們在github上建立項目時能夠根據語言自動生成ignore文件