Git是一個免費、開源的版本控制軟件,目前世界上最早進的分佈式版本控制系統(沒有之一)python
版本控制是一種記錄一個或若干個文件內容變化,以便未來查閱特定版本修訂狀況得系統。git
記錄文件的全部歷史變化github
隨時可恢復到任何一個歷史狀態web
多人協做開發或修改面試
錯誤恢復編程
版本控制的工具:安全
- svn 集中式版本控制系統服務器
- git 分佈式版本控制系統分佈式
CVS及SVN都是集中式的版本控制系統,而Git是分佈式版本控制系統,集中式和分佈式版本控制系統有什麼區別呢:svn
集中式版本控制系統,版本庫是集中存放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此要先從中央服務器取得最新的版本,而後開始幹活,幹完活了,再把本身的活推送給中央服務器。
中央服務器就比如是一個圖書館,你要改一本書,必須先從圖書館借出來,而後回到家本身改,改完了,再放回圖書館。
集中式版本控制系統最大的毛病就是必須聯網才能工做。
分佈式版本控制系統根本沒有「中央服務器」,每一個人的電腦上都是一個完整的版本庫,這樣,你工做的時候,就不須要聯網了,由於版本庫就在你本身的電腦上。
既然每一個人電腦上都有一個完整的版本庫,那多我的如何協做呢?比方說你在本身電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,大家倆之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。
和集中式版本控制系統相比,分佈式版本控制系統的安全性要高不少,由於每一個人電腦裏都有完整的版本庫,某一我的的電腦壞掉了沒關係,隨便從其餘人那裏複製一個就能夠了。而集中式版本控制系統的中央服務器要是出了問題,全部人都無法幹活了。
在實際使用分佈式版本控制系統的時候,其實不多在兩人之間的電腦上推送版本庫的修改,由於可能大家倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。
所以,分佈式版本控制系統一般也有一臺充當「中央服務器」的電腦,但這個服務器的做用僅僅是用來方便「交換」你們的修改,沒有它你們也同樣幹活,只是交換修改不方便而已。
Git的優點不單是沒必要聯網這麼簡單,後面咱們還會看到Git極其強大的分支管理,把SVN等遠遠拋在了後面。
Github是全球最大的社交編程及代碼託管網站(https://github.com/)。
Github能夠託管各類git庫,並提供一個web界面(用戶名.github.io/倉庫名)
Git是版本控制軟件
Github是項目代碼託管的平臺,藉助git來管理項目代碼
項目背景:這個創業者想開發選課系統
首先在你建立的項目的文件夾裏面右鍵--->點擊Gir Bash Here---->吧git運行起來。
git init,初始化,表示即將對當前文件夾進行版本控制
git init
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD
由於咱們建立Git版本庫時,Git自動爲咱們建立了惟一一個master分支,因此,如今,git commit就是往master分支上提交更改。
你能夠簡單理解爲,須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支。
git add . #全部的文件 git add README.md #具體添加的文件
git status查看當前狀態,紅色表明未跟蹤的文件,綠色表明跟蹤的文件(能夠被版本庫管理)
查看Git當前狀態,如:那些文件被修改過、那些文件還未提交到版本庫等。
將暫存區的文件提交到版本庫的分支。
必定記得先add,後commit,add以後是沒有放到版本里的,只有commit的時候纔有版本
查看提交記錄,即:歷史版本記錄
Git把管理的文件分爲了兩個區域四個狀態。
add到暫存狀態的時候成綠色了,在commit的時候就沒有了
提供了這個回滾的功能。
HEAD
指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。
用git log
能夠查看提交歷史,以便肯定要回退到哪一個版本。
用git reflog
查看命令歷史,以便肯定要回到將來的哪一個版本。
git diff HEAD -- readme.txt
命令能夠查看工做區和版本庫裏面最新版本的區別git checkout -- file
。git reset HEAD <file>
,就回到了場景1,第二步按場景1操做。- 開發直播功能
當項目開發到一半的時候,就是在此時線上運行平臺出現Bug須要緊急修復,以前的版本出現bug了怎麼辦?
解決思路:使用分支
默認會有一個master的分支。只作線上的版本,注意不要在master分支上修改,要修改的話就建立一個bug分支
一、建立一個修復bug的分支:git branch bug ,這個bug分支是在master分支上建的,至關於拷貝了一份
二、查看一共有幾個分支 : git branch
三、跳轉到bug分支:git checkout bug
四、跳轉到master分支:git branch master
五、建立一個開發新功能的分支:git branch dev #只作開發的版本
如今就有三個分支了,每一個分支都是不同的,bug修復完了,如今就要合併在master上了。
六、master和bug分支合併:git merge bug
七、刪除bug分支:git branch -d bug
八、繼續開發,切到dev:git branch dev
九、開發完畢,master和dev合併:git merge dev
切換以前必定記得把你的代碼提交一下
git add .
git commit -m '修改bug'
合併的時候可能出現衝突,可能不出現,出現衝突了就得手動解決
@-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git branch bugdev # 建立分支bugdev @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ ls __pycache__/ main.py* Manager.py* pickle_util.py* School.py* Student.py* Teacher.py* @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git checkout bugdev #切換分支bugdev Switched to branch 'bugdev' M core/main.py @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ touch b.log #增長文件 @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ git add . #提交到暫存區 @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ git commit -m 'bugdev' #提交到版本庫,修復bug [bugdev 7fc00b8] bugdev 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 core/b.log @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ git checkout master #切換到master分支 Switched to branch 'master' @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ ls __pycache__/ main.py* Manager.py* pickle_util.py* School.py* Student.py* Teacher.py* @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git merge bugdev # 合併bugdev分支 Updating 8562916..7fc00b8 Fast-forward core/b.log | 0 core/main.py | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 core/b.log @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ ls #查看文件內容,多了b.log文件 __pycache__/ b.log main.py* Manager.py* pickle_util.py* School.py* Student.py* Teacher.py* @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git branch -d bugdev #刪除bugdev分支 Deleted branch bugdev (was 7fc00b8). @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git branch #查看全部分支 dev * master $ git checout dev 繼續開發dev內容 開發完內容以後,在master上合併dev內容 $ git checkout master $ git merge dev
流程圖
branch相關經常使用命令: git branch 分支名稱 建立分支 git checkout 分支名稱 切換分支 git branch -m 分支名稱 建立並切換到指定分支 git branch 查看全部分支 git branch -d 分支名稱 刪除分支 git merge 分支名稱 將指定分支合併到當前分支
面試題:當公司代碼出現bug時候怎麼辦?
解答:建立一個bug分支,修復bug後,合併到主分支上,而後刪除bug分支
合併+將提交記錄合併到一條主線上,提交記錄整潔
雲端須要一個存放代碼的地方用Github或碼雲等
公共的
- Github是用來作代碼託管的
- 碼雲,作代碼託管
- csdn code ,作代碼託管
內部搭建:
- gitlab
一、登陸Github
在家裏:
就會有這樣一個地址,咱們就能夠用這個地址來提交
git remote add origin https://github.com/XXX/study1.git #給遠程項目起一個別名origin git push -u origin master #把本地項目分支提交到GitHub遠程項目
在公司:
家裏: git add . git commit -m 'xx' git remote add origin https://github.com/WuPeiqi/greenlu.git git push origin master 公司: # 新公司第一次獲取代碼 方式一 git clone https://github.com/WuPeiqi/greenlu.git 方式二 git init git remote add origin https://github.com/WuPeiqi/greenlu.git git pull origin master 直接拿回來 方式三 git init git remote add origin https://github.com/WuPeiqi/greenlu.git 這的兩句至關於git pull origin master 這一句 git fetch origin master 拿到分支上了 git merge origin/master 合併在一塊兒 # 往後 git pull origin master # 或者 git fetch origin master git merge origin/master # 若是你在本地修改問題,又add,又提交,在線上去拿的時候,或許會衝突
當你在家的時候吧代碼上線了。到了公司之後吧線上的代碼拉回來。
git pull origin dev開始寫代碼了。寫完以後add commit。。。這時候忘了往github上提交了回到家的時候,那今天寫的代碼沒提交,怎麼辦呢?回公司太晚了,在寫一遍浪費時間,或許你還記着今天寫的代碼,就在這基礎上又開發了,這下提升了警記了,就記得提交了 add 、commit 、git push origin dev次日又到公司了,那昨天的代碼怎麼辦呢、、?是拉下來呢?仍是推上去呢?若是你推上去的話,沒有衝突還好,若是有衝突的話,那你把你的衝突都上線了,不讓你提交,因此咱們要先拉下來先去吧代碼拉下來,git pull origin dev 可能會有衝突,解決衝突。