GitHub的創始人是Linus,使用C語言編寫,也是最初的Linux開發發起人。linux
集中式和分佈式的版本控制不一樣: git
集中式:版本庫是放在中央服務器中的,工做的時候要從服務器取得最新版本以後纔開始工做,工做完以後,在提交的中央服務器。必需要有網絡。github
分佈式: 沒有中央控制系統,每一個人的電腦都有完整的版本庫,中央服務器只有來你們交換修改的文件,服務器
git在不一樣系統上的安裝,自行百度。(我如今以爲Kali 系統作的愈來愈好了,以前在物理機上安裝的時候兼容性不是很好) 網絡
git - config 命令的 --config 參數,表示這臺機器上的全部的倉庫都使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email併發
建立一個空的倉庫 我實在 opt目錄下建立了一個叫作learnGit的倉庫 (pwd是用來顯示當前的目錄) 注:建立完後當前目錄下生成一個 .git文件 經過命令:ls -ah 能夠查看隱藏文件ssh
注:Git只能跟蹤文本文件的控制,沒有辦法控制圖像視頻文件。另一點 Word文件時Microsoft的一種二進制文件,所以沒有辦法跟蹤Word上的改動文件。這裏也不推薦使用記事原本寫代碼,最好使用notepad++(默認編碼設置是UTF-8.)分佈式
將新建的文本添加到倉庫中: 使用 git add 提交文件 ,使用 git commit -m "備註「」 提交的跟蹤信息 測試
git status 命令能夠幫助咱們時刻掌握倉庫當前的狀態, 下載咱們先將readme文件修改 ,而後使用該命令 git status (這個命令跟 linux 下 service status 相似)編碼
上面的顯示 readme文件修改了可是沒有提交 ,若是咱們不知道修改了什麼地方 可使用git diff 來查看修改的地方
能夠看咱們以前添加了一行,知道修改了以後咱們就就將它提交一遍(爲了放心,咱們在 git commit以前再次 git status一下)
最後提交 備註一下
可使用 git log 命令查看版本的歷史記錄
如今來看斑斑的回退 使用命令 git reset -- hard 參數 (在 Git 很重 HEAD 表示當前的版本, 上一個版本是 HEAD^ ,上上一個版本是 HEAD^^ ,若是回退的較多能夠寫成這樣 HEAD ~100 表示第一百個版本)
使用 git log 看看,發現以前的一個記錄沒有了,
若是想撤銷以前的操做,不要關閉窗口,繼續 git reset --hard 加上前面的 一串記錄數據
git 提供了一個記錄每次使用命令 命令 : git reflog
總結 使用 git 回退版本 使用命令 : git reset --hard commit_id
git的目錄理解:
工做區: 就是咱們剛纔創建的一個文件 leanGit。在以前咱們建立倉庫的時候就產生了一個 .git 文件, 他是git的版本控制文件, git版本倉庫中有不少東西,其中最重要的是稱爲stage的暫存區,還有git建立的第一個master,以及master的一個指針 HEAD,(這裏我使用廖老師的圖)
在前面回顧一下 : 把文件添加到倉庫分紅了兩步:第一步第 使用 git add 把文件添加進去I(其實是將文件修改添加到暫存區)--------第二步git commit 將暫存區的全部文件添加到當前分支,由於咱們在git版本庫的時候建立了惟一的一個master分支,因此 git commit就是往 master分支上提交更改。具體的提交變換工程圖解
git管理的是修改,而不是文件 ,爲了說明這個作一個實驗:
首先對readme問價添加一行 ,而後將他添加到倉庫暫存區 ,查看
能夠看到gitcommit 只負責對暫存區的修改,
因此再次提交以後纔會看到結果,更新
如何撤銷修改:在文件提交的的時候發現,文件出現錯誤,爲了及時修改,git提示使用 git checkout -- file 能夠丟棄修改工做區的修改。
廖雪峯說 一種是 readme自自改以後尚未放到暫存取,如今撤銷修改就回到和版本庫如出一轍的狀態,一種是readme已經次該添加到暫存區後,又作了修改,撤銷修改就回到添加暫存區後的狀態,總之就是讓這個文件回到最近一次 gitcommit或者 git add的狀態 。
下面的 使用 git commit 以後使用 git checkout 可是發現一旦使用 該命令 就不能撤銷,只能使用 git reset -- hard HEAD參數來進行版本的回退
root@kali:/opt/learnGit# cat readme.txt
readme here
learn github git is a version control system
git is free software
tianyaming
add a new line
add a new line " my boss is stupid"
root@kali:/opt/learnGit# git commit -m "have use the git checkout"
[master 26aa3fd] have use the git checkout
1 file changed, 1 insertion(+)
root@kali:/opt/learnGit#
root@kali:/opt/learnGit# cat readme.txt
readme here
learn github git is a version control system
git is free software
tianyaming
add a new line
add a new line " my boss is stupid"
root@kali:/opt/learnGit# git checkout -- readme.txt
root@kali:/opt/learnGit# cat readme.txt
readme here
learn github git is a version control system
git is free software
tianyaming
add a new line
add a new line " my boss is stupid"
root@kali:/opt/learnGit#
若是使用了git add提交了暫存區,慶幸的是你麼有使用commit提交 ,可使用 git reset HEAD 《file》來回退 以後在使用 git checkout清除工做區
來一個總結 ,場景一:當你改亂了工做區的某喲個內容,想直接丟掉工做區使用 git checkout -- file ,場景二:當你改亂了某一個文件的內容,還添加到了暫存區,想丟棄修改,第一步使用 git reset HEAD file 回到場景一 ,以後在使用 git checkout --file 丟掉
git 中還有一種操做就是刪除文件:
先添加一個新的文件 test.txt 以後使用 git add 、git commit 提交 到版本控制庫
以後使用rm 命令刪除文件 test ,刪除以後版本庫中的並無刪除,因此使用 命令 git rm test 刪除版本庫 以後使用 git commit 提交版本庫 (注:git checkout 的做用就是用版本庫替換工做區版本)
遠程倉庫的操做:
首先就是在本地使用ssh建立密鑰對, 才用戶倉庫目錄下面看看,有沒有 .ssh 目錄 ,若是有在看下面有木有id_rsa和 id_rsa.pub兩個文件,若是存在直接跳轉下一步
使用 ssh 建立 郵箱GitHub帳戶的祕鑰對 命令: ssh-keygen -t rsa -C " 1214tian@sina.com" 以後會在用戶佔下面產生祕鑰對,複製 公鑰到GitHub上
如今咱們須要將咱們的本地倉庫和GitHub上的倉庫關聯起來,首先登錄GitHub帳戶建立以個git倉庫 learnGit
如今將本地倉庫關聯到GitHub上,使用命令: git remote add origin git@github.com:SueKayTian/learnGit.git
關聯以後將本地倉庫的文件所有推送的遠程GitHub上 使用命令 : git push -u origin master
本地內容推送到遠程,其實是將當前分支master推送到遠程, 因爲遠程是空的,咱們第一次推送的master的時候,加上了參數 -u, 這樣GIt 不但會將本地的master分支內容推送到遠程master分支,還會將本地的master和遠程的master關聯起來,在之後的推送和拉取中簡化命令
第一次關聯後推送的時候會彈出SSH警告 ,在這以後只要本地作了提交就可使用 git push origin master 來推送
分支管理:
建立一個分支使用命令: git checkout -b (分支名字)
git checkout 命令後面加上-b 參數表示建立並切換,至關於下面的命令 :
git branch dev
git checkout dev
以後使用git branch命令查看列出全部分支,當前的分支結構後面會顯示一個 *
那麼如何將 dev 的工做合併到master上面, 下面使用命令 將 dev 合併到master 分支上面, git merge命令用於價格制定分支合併到當前分支下面, 合併以後就能夠放心的刪除以前的 Dev 分支
小結:
查看分支 使用命令: git branch
建立分支: git branch <name>
切換分支: git checkout <name>
建立加上切換分支 : git checkout -b <nmae>
合併分支 : git merge <name>
刪除分支 : git branch -d <name>
解決衝突問題: 其實不少時候在合併的時候會出現衝突,該如何解決了 ?
首先咱們建立一個分支並遷移到當前分支之下,
git 自動提示咱們當前master分支比遠程的master分支超前一個提交。這時咱們在當前master分支下修改 readme文件 ,如今 master和 featurel上都有了本身的型的提交。
這種狀況下git沒法進行快速的會合並,只能視圖將各自的修改合併,可是會出現衝突
當git沒法自動合併分支的時候 ,就必須首先解決衝突問題,提提交在合併。結局衝突的辦法就是使用手動編輯的方法合併成咱們想要的內容,再次提交 可使用 命令 git log --graph 查看分支合併圖
一般合併分支時,會丟掉分支信息,若是可能Git 使用 fast forward模式,可是在這種模式下,刪除分支以後,要強制禁止使用Fast foward模式, Git就會在merge時生成一個新的commit,,這樣 從分支歷史上就能夠看出分支信息
下面使用 --no-ff 方式的git merge 測試
首先建立並切換到 Dev分支下面: 使用命令 : git checkout -b dev
以後修改 readme文件 並提交到當前分支下,
合併的時候命令: git merge --no-ff -m "merge with no-ff "dev
以後使用日誌記錄來查看修改的歷史 : 使用嗎命令: git log --graph --pretty=oneline --abbrev-commit
在實際的開發中,咱們應該按照幾個基本的原則進行分支管理,首先master是很是穩健的分支,僅僅能用來發布新的版本,平時幹活的時候不能再上面幹活。幹活都是在相似Dev的分支上開發,以後再將Dev版本合併發哦master分支上面。每一個人都有本身的分支,時不時合併到Dev分支上面。
bug 如何修復,
當你接到一個代號爲010的bug任務的時候,很天然的你會想建立一個issue-010來修復,可是若是當前正在Dev上進行的工做尚未提交,這個時候能夠利用 stash功能,能夠將當前的工做線程隱藏起來,等到之後恢復現場後繼續工做。
使用 命令 : git stash
Feature功能在軟件開的過程當中總有不少功能會不斷地被添加進來 ,添加一個新的功能的時候由於不但願一些實驗性質的代碼,把主分支搞亂了,因此,每添加一個新的 功能,最好新建有個feature分支,在上面開發,完成後,再進行合併,最後刪除feature分支,