版本控制工具 - Githtml
https://git-scm.com/downloads 下載git工具,安裝完成後,有兩種方式使用gitgit
1.使用windows的cmd工具執行git命令,這須要配置環境變量,將git目錄下的git.exe所在目錄添加到pathgithub
2.若是不喜歡使用cmd,能夠直接打開Git Bash,這也是一個命令行工具,用於執行git命令。算法
以上兩種工具均可以操做倉庫和倉庫的文件。你能夠經過命令將已經存在的項目變成倉庫,也能夠從新建立一個新項目再經過命令將其變成倉庫,還能夠根據已經存在的倉庫(Source))進行克隆。windows
Git相關的概念
版本庫(version)
當倉庫建立完成後,會出現一個名爲.git的隱藏目錄,該目錄被稱爲版本庫。緩存
工做區(work)
倉庫中的除了.git目錄的其餘任何目錄都稱爲工做區。 bash
暫存區(stage)
暫時存放向版本庫添加的文件的區域,這個區域也在版本庫中。你能夠在工做區中建立文件或修改文件,而後經過git命令將新建立的文件或改動過的文件提交到暫存區,再經過git的commit命令將這些改動提交到master分支結構中,master分支結構是版本庫中自動建立的一個區域,它以時間順序保存了每一次改動事後的文件。工做區的全部文件都必須先add到暫存區,而後才能commit到master中。這個過程就是將文件提交到版本庫以即可以被追蹤監視,若是某個文件連一次都沒有提交到暫存區或者分支結構中,那麼在工做區中對該文件的任何修改都不會被監視到。服務器
如下將工做區的兩個文件add到暫存區併發
而後commit到master中,這樣暫存區的文件會被清空。ssh
分支(Branch)
咱們提交的修改都提交到master分支結構中,但你也能夠建立新的分支,好比當你提交一個只完成30%的文件源代碼,這個源代碼沒有完成,但你提交到了遠程倉庫,當別人從遠程倉庫下載文件後,這個文件的代碼由於不完整致使了不能正常運行,而這些源代碼是由你編寫的,別人不負責完善,因此形成了錯誤。針對這個問題,你能夠建立一個分支結構,分支都是在本地建立的,遠程永遠不會出現你本身建立的本地分支,除非你將自定義分支推送到遠程倉庫。你對文件的修改都提交到分支中保存,別人看不到你的分支,也不可能從遠程下載到你分支中的文件文件,這樣就不會影響到別人,由於別人下載的文件是從遠程master中下載的,這樣你的分支就只屬於你本身管理。當你完善了你負責的文件以後,再把你的分支與master分支結構合併起來便可。
爲了便於理解,能夠畫圖,master分支結構如圖,每提交一次更改(commit),就會向右多出一個文件版本
使用git命令能夠建立本身的分支結構,好比建立一個名爲dev的分支,這個分支會先指向master,而後當你向dev提交修改時,它會向前增長文件版本,但這個操做只在分支上完成,不會進入master。當你在分支完成本身的任務後,可使用git命令將分支合併到主結構master中。如圖:
最後提醒:暫存區是一個公共空間,假如向master分支add了一個文件到暫存區,但還沒有commit到分支結構中,那麼這個文件在處於任何分支結構的工做區中都是可見的。
遠程倉庫(遠程鏈接名稱[默認是origin])
由於Git是分佈式版本控制系統,因此咱們能夠搭建一個提供Git倉庫服務的中央服務器,不過你也能夠直接使用GitHub網站提供的Git倉庫服務,省去本身手動搭建服務器的開銷。原始版本天然是存儲在中央服務器的Git倉庫中,咱們從遠程下載這個倉庫,而後修改文件再提交上傳便可。
Git命令
建立倉庫
cd:進入目錄
pwd:顯示當前所在目錄,注意,使用git的操做文件的命令時必須先確保已經進入了即將要操做的文件的所在目錄,這正是cd的做用,cd進入目錄,再使用其餘命令去操做文件。
git init:將當前目錄轉變爲倉庫,這會在當前目錄生成一個.git的隱藏目錄,它能夠監視當前目錄下的任何目錄的改動,不要試圖修改該目錄的任何文件,不然Git倉庫將失去做用。
還 能夠直接在目錄中右鍵,這樣能夠在當前目錄打開git bash
配置帳戶
git config --global user.name "用戶名" :設置倉庫使用者的帳戶
git config --global user.email "用戶名" :設置倉庫使用者的電郵
git config user.name:顯示帳戶
git config user.email:顯示電郵
向版本庫添加文件
將項目目錄轉變爲倉庫後,項目中的文件或新添加的文件都必須經過命令發送到master分支結構中存儲。唯其如此,git才能夠實現版本控制。如下在倉庫目錄中新建了一個txt文檔
在工做區建立了新文件,還須要經過命令將新文件添加到暫存區,而後經過commit命令提交到master分支結構中。注意,add和commit並不是必須連着使用,你能夠在把文件add到暫存區後不使用commit,這樣文件只存儲在暫存區而不會進入版本庫的master分支結構中。
git add fileName1 fileName2:將文件添加到暫存區
git commit -m"description":提交全部處於暫存區的文件到master中,即把暫存區的文件所有提交到版本庫保存。提交時必須使用-m提交具備說明性的文字描述,也即,提交時順便提交一個說明(-m""),以便於其餘開發人員理解。
對比工做區和版本庫的版本
git diff :比較工做區與暫存區的不一樣
git diff head -- fileName:比較工做區與分支版本庫的不一樣
git diff --cached:比較暫存區與分支版本庫的不一樣
兩個區域的文件版本有不一樣時,此命令會輸出提示信息,不然無顯示。如今假設test.txt文件有這樣一段字符:hello world sam,在文件字符末尾添加新字符welcom,接着add該文件到暫存區,接下來再次在test.txt中追加字符good boy,而後commit提交全部暫存區文件到版本庫,最後使用diff命令會發現輸出的對比中,綠色字體表示工做區的文件,該文件有good boy字符,而版本庫中的文件卻沒有good boy字符。這是因commit只會提交處於暫存區的文件,而good boy的版本並未進入暫存區。
查看文件狀態
git status:查看倉庫中哪些文件被修改或刪除
只有提交到版本庫的文件纔會被git監視,也只有被監視的文件才能夠經過git status查看到文件的相關狀態。若是一個文件未提交到版本庫,那麼對該文件作出的任何改動都不會被git發現。
如今修改test.txt,再hello world字符後添加新字符sam,而後保存並關閉文件。接着輸入命令查看倉庫狀態。命令行會提示兩條信息:
1.Changes not staged for commit:test.txt被改動過(modified)。若是忘記了哪些文件作過改動卻未將改動提交到版本庫,此時也可使用git status命令進行查看,以便提交修改。提交一次改動就至關因而一次新的歷史版本,從此想要回退到某個歷史版本就須要從git中獲取。注意,若是你對文件改動了N次,但都沒有提交,則歷史版本就不會有這個記錄,直到提交後,這N次改動纔會被當成一個歷史版本。
2.Untracked files:倉庫中的子目錄:.vs目錄、ConsoleApp目錄、MyProgram目錄下的文件未被監視,請使用git add 和git commit命令將這些文件添加到版本庫。
保存文件改動
文件改動後須要提交修改到版本庫,使用的命令與添加文件的命令是同樣的(git add和git commit命令)。
查看改動的歷史版本
git log:查看改動歷史
git log --pretty=oneline :查看改動歷史(簡潔版)
查看改動的歷史版本的head頭
每一個版本都有一個基於SHA1算法的head頭,用來表示版本的惟一性。
git reflog:查看歷史版本的head頭信息
時光穿梭
git reset --hard headCode:將文件重置爲指定的版本
經過git reflog獲得歷史版本的頭信息後,再使用git reset --hard headCode將文件重置爲指定版本
撤回暫存區文件
git reset HEAD fileName:將暫存區中的指定文件撤回,即刪掉。
將工做區文件替換爲版本庫中的最新版本
git checkout -- fileName:修改或刪除某個文件,但還未更新提交到版本庫(暫存區或master分支結構中),則可使用此命令將文件替換爲該文件進入版本庫中的最近一次提交的版本
好比修改了a.txt,添加了hello字符,但這個修改並未提交到版本庫,此時想要還原到上一次提交到版本庫的版本,可以使用checkout,命令完成後,a.txt會恢復到沒有hello字符的版本。
刪除工做區文件
rm fileName:刪除工做區文件,但不會刪除版本庫中的文件
也即,刪除後還能夠經過checkout將版本庫中的最近一次提交的版本還原到工做區。若是rm後再commit,會提示該文件的刪除操做不能提交到版本庫,也即commit是無效的
同時刪除工做區和版本庫中的文件
git rm fileName:刪除工做區的文件,但仍是能夠經過reset還原該文件。
git commit -m"description":提交刪除操做到當前分支,刪除記錄會存檔
建立遠程倉庫
第一步:註冊Github帳戶
第二步:打開git bash,再命令行中鍵入ssh-keygen -t rsa -C "'你註冊GitHub帳戶鎖使用的電郵地址'" (注意此處的電郵地址須要用一對雙引號包含一對單引號,單引號包含電郵地址才能夠,不然會提示too many arguments),這個命令會根據你提供的電郵生成一個私匙和一個公匙,用於你向GitHub傳輸加密數據時所提供的身份憑據。
第三步:命令行會提示你按Enter鍵,每按一次Enter則會建立相應的文件,不用管,一路Enter到底直到出現下圖的提示即完成
第四步:打開本地目錄C:\Users\你的windows帳戶名\,看到.ssh目錄,打開.ssh目錄後看到下面兩個鑰匙文件則說明上述步驟已經成功
第五步:登陸GitHub網站,點擊頭像 - Settingss - 進入設置界面,以下:
第六步:打開.ssh目錄中的id_rsa.pub文件,將公匙copy一份粘貼到SSH Key中:
添加完成後,如圖:
你能夠添加多個SSH Key,你本身所使用的每一臺PC均可以建立這樣的鑰匙以供你在多臺PC上鍊接遠程倉庫。鏈接遠程倉庫須要使用Git命令,該命令會致使GitHub網站讀取你本地的SSH Key,將這個Key與Git遠程倉庫中註冊的Key進行匹配,若是遠程倉庫有這個Key,你才能夠推送數據到遠程倉庫中。
建立遠程倉庫
點擊頭像旁邊的+號 - new Repositories
你能夠將本地倉庫推送到你在GitHub建立的遠程倉庫中,使兩個倉庫合併爲一個,也能夠把遠程倉庫克隆到本地。
刪除遠程倉庫
進入settings - Repositories - 點擊你的倉庫進入倉庫頁面 - setting - 拉到底 - delete Repository
建立與本地關聯的遠程倉庫鏈接
git remote add 遠程鏈接名稱 git@github.com:Gihub帳戶名/倉庫名.git:建立遠程鏈接,在git bash中應先cd到與遠程倉庫目錄相同的本地倉庫目錄時此命令纔有效
遠程鏈接名稱默認origin,你能夠自定義,如:
git remote add GitHub git@github.com:Gihub帳戶名/倉庫名.git
刪除遠程倉庫鏈接
git remote rm 遠程鏈接名稱[默認是origin]
查看遠程倉庫鏈接
git remote -v:查看當前與本地關聯的遠程鏈接
抓取遠程倉庫到本地倉庫
git pull --rebase 遠程鏈接名稱[默認是origin] master:遠程倉庫合併到本地倉庫,必須先執行此命令,而後纔可使用其餘命令將本地倉庫的文件推送到遠程倉庫。
若是輸入此命令後提示如下錯誤:
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
解決辦法:
git remote set-url 遠程鏈接名稱[默認是origin] git@github.com:Gihub帳戶名/倉庫名.git
推送本地分支到遠程倉庫
git push -u 遠程鏈接名稱[默認是origin]] 分支名:推送到遠程的指定分支,加-u表示默認推送到此分支,下次只須要使用git push命令而不須要再次提供分支名就能夠繼續往該分支推送數據
git push 遠程鏈接名稱[默認是origin] 分支名:推送到遠程的指定分支
將本地自定義分支推送到遠程倉庫
下面例子中遠程倉庫尚未建立coldfood分支,但你在本地能夠建立它,而後把該分支推送到Github。這樣作是由於想要將coldfood共享於多個開發人員,不然也不必把本地分支推送到Github。
從遠程倉庫克隆自定義分支
git checkout -b dev 遠程鏈接名稱[默認是origin]/dev:將遠程倉庫的自定義分支克隆到本地倉庫
若是另外一個開發人員要從遠程克隆某個咱們所共享的Git倉庫,而git遠程倉庫並非由他建立,如今假設倉庫裏有自定義的coldfood分支,那麼他克隆到本地後默認是沒有coldfood分支結構的,可使用git branch查看,命令行只會顯示master分支。
創建本地分支和遠程分支連接
git branch --set-upstream 本地分支名 遠程鏈接名稱[默認是origin]/遠程分支名:將遠程的自定義分支與本地自定義分支關聯起來
若是另外一個開發人員要從遠程克隆某個咱們所共享的Git倉庫,而git遠程倉庫並非由他建立,他克隆完分支以後,將修改的文件往分支提交,接着嘗試推送到遠程倉庫對應的分支上,那麼這會失敗,由於尚未將該分支與遠程關聯起來。
遠程推送衝突
git pull 遠程鏈接名[默認是origin]:抓取遠程的文件
當兩我的都修改了同一個文件,A先推送到遠程倉庫,而後B再推送,那麼B的推送會失敗,由於遠程會嘗試merge,此時會出現合併衝突。解決辦法是B應該先從抓取遠程該文件,這個文件時A修改後的提交,而後在本地手動解決衝突(打開抓取的文件,將B的修改追加或替換到A修改的文件中)後再推送。
Auto-merging 1.txt //提示:1.txt存在衝突,遠程的1.txt時最新版本,你須要手動修改衝突
CONFLICT (content): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
克隆遠程倉庫到本地
git clone git@github.com:Gihub帳戶名/倉庫名.git:將遠程倉庫克隆到本地,在git bash中應cd到本地某個目錄時此命令纔有效
克隆的倉庫存放在本地x目錄,則須要先cd到x目錄後再使用clone命令,好比遠程倉庫MyProgram須要克隆到本地的yin目錄中:
建立分支
git branch 分支名稱:建立自定義的分支結構
查看全部分支
git branch:列出全部分支
綠色表示當前工做區所使用的分支
切換分支
git checkout 分支名稱:從其餘分支結構切換到指定的分支結構中
切換以後,add、commit等操做都會指向當前分支。
刪除分支
git branch -d 分支名稱:刪除指定的空分支,刪除前必須先切換到其餘分支中,好比切換到master中,以後才能夠刪除指定分支
git branch -D 分支名稱:強行刪除非空的分支,若是分支存在文件則刪除時會提醒還沒有merge,即默認狀況下任何分支中存在文件版本則必須將其merge合併到主分支master中,此命令無視此規則,強行刪除。
合併分支
git merge 分支名稱:將指定分支合併到master中,合併後,指定分支繼續存在,你還能夠向分支提交修改。必須切換到master後才能執行此命令。
假設工做區有一個test.txt文件,文件中有hello world字符,該文件默認是提交到master分支結構中。若是後來你建立了本身的分支,好比建立了一個名爲coldfood的分支,而後對test.txt文件追加了一個字符sam,接着提交修改到coldfood,那麼當checkout到master後,工做區的test.txt文件會變成在master分支結構中的版本,也即打開文件後看不到字符sam。此時使用merge對分支進行合併,合併後,分支中的最新版本的文件就會替換掉在master中的最新版本。也即test.txt文件末尾會出現字符sam。
分支與工做區的關係
1.工做區中任何尚未首次提交到版本庫的非遠程倉庫下載的文件不屬於任何分支(包括master),無論切換到哪一個分支能在工做區看到這些文件
23.將Github遠程倉庫合併到本地倉庫後,工做區中全部的文件默認處於暫存區中,也即切換到任何分支都能在工做區看到這些文件
3.若是一個文件在每一個分支中都有提交過,那麼將分支merge時將會發生合併衝突,須要手動解決衝突,在這種狀況下merge時,會提示相似下面的信息:
Auto-merging 1.txt //合併master和coldFood分支上的1.txt爲一個版本
CONFLICT (content): Merge conflict in readme.txt //合併發生了衝突
Automatic merge failed; fix conflicts and then commit the result. //合併 錯誤,請手動修復衝突,再commit修改
merge衝突發生後,git會將文件進行修改,打開文件能夠看到下面的信息,它顯示了在兩個不一樣分支上的相同文件的數據,HEAD是提交到master分支結構的數據,而coldfood是提交到coldfood分支的數據。如今只須要修改該文件爲你想要提交的數據而後在master上add、commit便可。
修改成:
合併分支模式
合併分支模式是指合併分支並手動刪除分支以後,是否保存合併分支時的歷史記錄。
Fast forward模式
git merge 分支名稱
這是默認merge時git使用的合併模式(快速合併),當分支被手動刪除後,git log將不會保存合併分支時的歷史記錄
禁用Fast forward模式
git merge --no-ff -m "description" 分支名稱
使用此模式,刪除分支後,git log仍然會保存合併分支時的歷史記錄
Bug分支
git stash:將暫存區的文件隱藏
git stash pop:刪除隱藏文件並將文件顯示在暫存區中
git stash list:查看隱藏的文件列表
良好的習慣是每次修改完文件都commit到分支結構中,咱們知道暫存區是公共區域,無論你切換到哪一個分支,在工做區你均可以看到該文件。若是你只是把文件add到暫存區,那麼該文件在處於任何分支的工做區中都將是可見的,這很容易引發迷惑,由於下一次你打開工做區看到該文件時,你可能已經不知道它是屬於哪一個分支中的文件。而假現在天你的代碼並無寫完,因此你並不想commit,此時你可能想先提交到暫存區保存起來,若是你這樣作,那麼在處於任何分支的工做區中都能看到這個文件,而你不想看到它,以爲脹眼?那就只能使用stash命令將暫存區的文件隱藏起來。如下在coldfood分支中隱藏了一個3.txt的文件,再經過stash pop刪除隱藏文件並顯示在暫存區中。
版本號
版本號默認狀況下不會隨推送進入遠程倉庫,僅本地有效。
git tag:查看版本號列表
git show 版本號:查看指定版本的詳細信息
git tag tagName:爲當前分支中的最新提交的文件版本打版本號
git tag tagName commitHeadCode:爲指定了head頭信息的commit打版本號
git tag -a tagName -m"description" commitHeadCode:爲指定了head頭信息的commit打版本號,同時指定了描述
雖然能夠獲取某個commit的記錄,可是用版本號來標識版本更簡單,畢竟要獲得一個commit的記錄須要提供head,而head只是一堆6a5819e...,而版本號多是這樣v1.1。切換到某個分支,再使用此命令便可。雖然能夠爲每一次的commit都打一個版本號,但你可能在上一次commit時忘記了打版本號,經過查看git log找到head,補上版本號便可:
6a5819e merged bug fix 101 //6a5819e是head頭
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt
git tag v0.9 6a5819e
刪除版本號
git tag -d 版本號:刪除指定版本號,並不刪除文件
將版本號推送到遠程
git push 遠程鏈接名稱[默認是origin] 版本號:推送指定的本地版本號到遠程倉庫
git push 遠程鏈接名稱[默認是origin] --tags:推送本地全部版本號到遠程倉庫
刪除遠程版本號
$ git push 遠程鏈接名稱[默認是origin] :refs/tags/版本號:先要在本地刪除指定的版本號,以後才能使用此命令
git push 遠程鏈接名稱[默認是origin] --delete tag 版本號:同上
添加例外
有些文件並不須要添加到倉庫,好比windows自帶的Thumbs.db、ehthumbs.db、Desktop.ini、編譯生成的中間文件,但當你輸入git status時,Git
會提醒你Untracked files(文件未被跟蹤),若是有潔癖,可使用.gitignore文件定義文件例外。這使用例外以後,status會忽略未被跟蹤的文件。
在windows中打開記事本,編輯以下信息,而後另存爲.gitignore。
Thumbs.db
ehthumbs.db
Desktop.ini
若是某些文件已經被歸入了Git,則修改.gitignore是無效的。解決方法就是先把本地緩存刪除(改變成未track狀態),而後再提交。
git add .
git commit -m 'update .gitignore'
最後將.gitignore文件commit一下就能夠了。
GitHub開源倉庫
你能夠對GitHub網站上的任何一個開源的倉庫進行Fork,將倉庫Fork到本身的GitHub帳戶上,而後經過git命令克隆到本地。
建議提交
若是你對個人源碼感興趣,你確定想搞到本地加以研究,此時你須要將開源的倉庫fork到你的GitHub上,而後再clone到本地。而後你發現源碼能夠繼續優化,因此你花了一個月修改源碼,接着你確定想通知我,此時你使用Git命令pull request向我發起建議提交的申請,若是我以爲你改得不錯,我就接受你的修改,此時我會將你的提交merge到個人倉庫中。瞭解pull request能夠移步至:建立 Pull Request
使用碼雲
也可使用碼雲託管你的源代碼,註冊完成後點擊頭像 - 設置 - SSH Key - 添加公匙,操做與GitHub是同樣的:https://gitee.com
本地同時關聯GitHub和碼雲
git remote add github git@github.com:xxx/zzz.git //關聯到GitHub倉庫
git remote add gitee git@gitee.com:xxx/zzz.git //關聯到碼雲倉庫
git remote -v //查看當前與本地關聯的遠程Git倉庫鏈接
git pull github //抓取github
git pull gitee //抓取碼雲
git push github master //推送到github
git push gitee master //推送到碼雲
在VisualstudioCode中使用git
先配置環境變量,將git.exe所在目錄添加到path。而後在vscode的設置配置文件中輸入如下代碼正確指定git.exe的目錄便可.在vscode中使用git status查看文件是否被監視,若是列出的文件標題名是紅色則還未跟蹤,若是是綠色則還未被提交。使用git add . 將項目文件添加到版本庫中。
"files.autoSave": "afterDelay",
"editor.fontFamily": "'Arial Narrow',Consolas, 'Courier New', monospace",
"terminal.integrated.fontFamily": "monospace",
"editor.fontSize": 12,
"git.path": "C:/Program Files/Git/cmd " 不能寫成"C:\Program Files\Git\cmd "
}