git
和github
不是同一個東西。Git
是一款免費、開源的分佈式版本控制系統,而github
是基於git
的代碼託管平臺
且同時也具備版本記憶功能。git
是分佈式版本管理系統。git
是由linux
的創造者linus
開發的。CVS
和SVN
的集中式版本控制方式,git
使用分佈式進行版本控制。將較而言,git
分佈式版本控制能夠實現本地化的版本庫,工做時沒必要聯網;git
具備強大的分支管理能力,穩定性更高。(便捷)首先打開hash.exe
輸入用戶名和郵箱html
//配置全局用戶信息 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" //修改當前用戶信息 $ git config user.name 你的目標用戶名; $ git config user.email 你的目標郵箱名;
利用git
本地倉庫進行版本控制能夠簡單的理解爲:a 持有實際文件的物理工做目錄,b 暫存區,c 本地倉庫(git在本地默認創建的一個master分支)linux
其中a-->b
是由add
實現,而b-->c
是由commit
實現。git
git
在本地進行版本庫存儲git
在本地指定地點創建倉庫(或者是指向克隆下來的倉庫):github
cd e:/github_projects/tisikcci.github.io
初始化一個git
倉庫:web
init
初始化以後,會在tisikcci.github.io
文件夾下生成一個默認隱藏的.git
文件夾vim
添加遠程庫:在本地的learngit倉庫下運行命令:$ git remote add origin 倉庫地址
安全
向這個隱藏的文件夾中添加文件:README.md
(能夠是別的文件,要將這個文件放在.git同級文件夾下):bash
git add README.md
也能夠一次添加多個文件
,相似於:服務器
git add README1.md README2.md README3.md
將文件存入本地倉庫(當前分支),同時添加改動或者說是更新說明:(-m
後這裏的‘first commit’應該是與本次提交或者更新有關係有實際意義的說明,方便之後溯源)app
git commit -m'first commit'
在上面的3,4步驟過程後可使用如下命令看到內容的變更
git status
第一次提交時:git push -u origin master
可使用如下代碼查看git版本庫的修改或者說是更新次數(使用q能夠退出這個命令)
git log
若是以爲這樣獲得的信息太多,可使用下面的命令,使得每次修改信息漂亮的顯示在同一行
git log --pretty=oneline
也能夠選定查看最近2次的版本更新信息:
git log -n 2
能夠利用reset
實現版本回退:
git reset --hard head^
注意:HEAD
表示當前版本(就是一個指針),在後面加一個^
,表示(指向)上一個版本,前第N
個版本是HEAD~N
,回退之後想恢復以前最新的版本或者是某次特定的版本,能夠利用以下代碼查找操做代碼庫的關鍵步驟 歷史記錄的ID
實現:
git reflog
根據ID,好比是441736f,前進到回退前的某個版本
git reset --hard 441736f
commit
以後又對項目中的某個文件內容進行了更新,能夠利用如下命令回到離commit最近的狀態(就是丟棄掉沒有進行add操做的更改內容,回到上次commit操做時的狀態)
git checkout -- 文件名
這裏本質是利用本地版本庫中的相同文件替換了本地文件夾中的文件,因此看起來是回到以前commit操做時的狀態了(可是若是更改已經add了,除非放棄add
操做內容,不然下次commit
又會更新本地倉庫)。更進一步,撤銷已經add到暫存區但沒有commit到本地分支的文件
git reset head 文件名
以上過程當中可使用如下命令查看具體文件的內容
cat 文件名
刪除本地版本庫中的文件
首先說一下一種特殊狀況:本地的文件夾中的項目相關文件被刪除了,但沒有更新本地的版本庫,若是這時想恢復被刪除的項目相關文件,能夠利用如下命令:
git checkout -- 文件名
第二種狀況是真的想刪除本地倉庫中的相關文件,利用如下代碼刪除本地文件夾中的文件(也能夠手動刪除)
rm 文件名
而後利用如下代碼刪除本地倉庫中的文件
git rm 文件名
而且利用git commit進行保存
git commit -m"remove 文件名"
新建一個分支,能夠利用
git branch 分支名 git checkout 分支名
上面的代碼分別表示新建一個分支,並將head(指針)指向新建的指針,也可使用下面的方式直接
實現新建一個分支並使head指向它
git checkout -b 分支名
能夠利用下面的命令分別查看本地分支,遠程分支和全部分支,當前指向分支前會加*號
git branch<br>git branch -r<br>git branch -a
刪除已經存在的指定本地分支,遠程分支(注意要先將指針指向其餘分支才能刪除此分支)
git branch -d 分支名 git push origin :分支名
重命名分支
git branch -m 原分支名 新分支名
在新分支上提交內容,對以前的主分支master
並不會有影響,能夠利用以下方式再切換回主分支
git checkout master
此時head
會從新指向master
,將master
替換爲別的分支,能夠實現切換到任意指定分支
將新創建的分支合併到主分支(首先要切換回主分支)
git merge 新分支
合併後,就能夠利用上面給出的方法刪除新分支
若是想保留新建的分支,並推送到遠程倉庫,能夠利用
git push origin 新建的分支
能夠給項目進度添加版本號,經過添加標籤的方式實現
git tag 版本號
經過省略版本號能夠直接查看已經添加的版本號
git tag
能夠給之前的某次提交補加版本號,只要查找到以前commit操做對應的ID,好比:441736f
git tag 版本號 441736f
能夠利用以下的方式實如今添加標籤時添加說明
git tag -a 版本號 -m "版本說明"
能夠經過如下命令查看指定版本內容
git show 版本號
刪除不想要的標籤
git tag -d 已經存在的標籤(版本號)
能夠將本地標籤推送到遠程倉庫
git push 遠程主機名(好比origin) 版本號
好比:
git push origin v1.0
將本地全部的版本號都推送到遠程倉庫
git push origin --tags
若是想刪除遠程倉庫的版本號,須要進行兩步
a. 首先要刪除本地版本號(標籤)
b. 再刪除遠程版本號
git push origin :refs/tags/版本號
利用以上步驟,基本能夠實現利用git本地進行操做
,如下要實現將本地git倉庫同步到遠程倉庫(例如github,固然也能夠本身在一臺PC上搭建一個服務器,做爲遠程倉庫)
利用github充當遠程倉庫是一種很不錯的方式,git本地倉庫和github能夠經過SSH加密,利用多種方式進行數據傳輸:HTTP(s)、SSH、Git、本地協議等,前兩種比較經常使用。
bash.exe
中輸入.ssh
目錄裏就能夠建立id_rsa
和id_rsa.pub
這兩個文件,一路回車github
上Github
,找到右上角的圖標,打開點進裏面的Settings
,再選中裏面的SSH and GPG KEYS
,點擊右上角的New SSH key
,而後Title
裏面隨便填,再把剛纔id_rsa.pub
裏面的內容複製到Title
下面的Key
內容框裏面,最後點擊Add SSH key
,這樣就完成了SSH Key
的加密測試是否鏈接成功
ssh -T git@github.com
Github
上創建一個你想和本地倉庫進行同名的倉庫(名字相同)利用上面的cd...
指向本地倉庫的位置,而後關聯到Github
的遠程倉庫:
git remote add origin git@github.com:tisikcci/tisikcci.github.com.git
關聯好以後,能夠把本地倉庫中的內容推送到Github上
的遠程倉庫了
在首次進行推送的時候,須要:
git pull --rebase origin master(若是初始化的倉庫有文件好比README要先和本地合併) git push -u origin master
此處加 -u
是用來將本地master
和遠程master
進行關聯的,之後再次推送就不須要再加了,origin
是遠程主機的名字,能夠經過如下代碼來查看
git remote
或者是
git remote -v
這個主機名字是能夠人爲指定的。首次推送以後,下次再向遠程倉庫master
分支推送項目時,只須要
git push origin master
上面提到能夠人爲指定遠程主機的名字,在將遠程倉庫克隆到本地的時候,能夠實現
git clone -o 新主機名 https://github.com/tisikcci/first-static-web-page.git/
若是使用默認的主機名而且克隆到本地指定的位置,能夠利用
git clone https://github.com/tisikcci/first-static-web-page.git/
本地地址
最好是直接利用SSH
協議進行clone
,以下
git clone 倉庫的SSH地址 本地創建的空文件夾地址 git clone git@github.com:tisikcci/test.git e:/github_projects/zz
就將遠程倉庫的test
克隆到了本地的zz
文件夾中。
git pull
命令git pull
命令用於從另外一個存儲庫或本地分支獲取並集成(整合)。git pull命令的做用是:取回遠程主機某個分支的更新,再與本地的指定分支合併,它的完整格式稍稍有點複雜。
使用語法
git pull [options] [<repository> [<refspec>…]]
描述
將遠程存儲庫中的更改合併到當前分支中。在默認模式下,git pull
是git fetch
後跟git merge FETCH_HEAD
的縮寫。
更準確地說,git pull使用給定的參數運行git fetch,並調用git merge將檢索到的分支頭合併到當前分支中。 使用--rebase,它運行git rebase而不是git merge。
示例
$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
好比,要取回origin主機的next分支,與本地的master分支合併,須要寫成下面這樣 -
$ git pull origin next:master
若是遠程分支(next)要與當前分支合併,則冒號後面的部分能夠省略。上面命令能夠簡寫爲:
$ git pull origin next
上面命令表示,取回origin/next
分支,再與當前分支合併。實質上,這等同於先作git fetch
,再執行git merge
。
$ git fetch origin $ git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,創建一種追蹤關係(tracking)
。好比,在git clone
的時候,全部本地分支默認與遠程主機的同名分支,創建追蹤關係,也就是說,本地的master分支自動」追蹤」origin/master
分支。
Git也容許手動創建追蹤關係。
$ git branch --set-upstream master origin/next
上面命令指定master
分支追蹤origin/next
分支。
若是當前分支與遠程分支存在追蹤關係,git pull
就能夠省略遠程分支名。
$ git pull origin
上面命令表示,本地的當前分支自動與對應的origin主機」追蹤分支」(remote-tracking branch)
進行合併。
若是當前分支只有一個追蹤分支,連遠程主機名均可以省略。
$ git pull
上面命令表示,當前分支自動與惟一一個追蹤分支進行合併。
若是合併須要採用rebase
模式,可使用–rebase
選項(rebase
可查看下文)。
$ git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
git fetch
和git pull
的區別git fetch
:至關因而從遠程獲取最新版本到本地,不會自動合併。
$ git fetch origin master $ git log -p master..origin/master $ git merge origin/master
以上命令的含義:
- 首先從遠程的`origin`的`master`主分支下載最新的版本到`origin/master`分支上 - 而後比較本地的`master`分支和`origin/master`分支的差異 - 最後進行合併
上述過程其實能夠用如下更清晰的方式來進行:
$ git fetch origin master:tmp $ git diff tmp $ git merge tmp
git pull
:至關因而從遠程獲取最新版本並merge
到本地
git pull origin master
上述命令其實至關於git fetch
和 git merge
在實際使用中,git fetch更安全一些,由於在merge前,咱們能夠查看更新狀況,而後再決定是否合併。
rebase
模式假設你如今基於遠程分支"origin"
,建立一個叫"mywork"
的分支。
$ git checkout -b mywork origin
如今咱們在這個分支作一些修改,而後生成兩個提交(commit)
.
$ vi file.txt $ git commit $ vi otherfile.txt $ git commit //vi命令是UNIX操做系統和類UNIX操做系統中最通用的全屏幕純文本編輯器。Linux中的vi編輯器叫vim,它是vi的加強版(vi Improved),與vi編輯器徹底兼容,並且實現了不少加強功能
可是與此同時,有些人也在"origin"
分支上作了一些修改而且作了提交了. 這就意味着"origin"
和"mywork"
這兩個分支各自"前進"了,它們之間"分叉"了。
在這裏,你能夠用"pull"
命令把"origin"
分支上的修改拉下來而且和你的修改合併; 結果看起來就像一個新的"合併的提交"(merge commit)
:
可是,若是你想讓"mywork"
分支歷史看起來像沒有通過任何合併同樣,你也許能夠用 git rebase
:
$ git checkout mywork $ git rebase origin
這些命令會把你的"mywork"
分支裏的每一個提交(commit)
取消掉,而且把它們臨時保存爲補丁(patch)
(這些補丁放到".git/rebase"目錄中),而後把"mywork"
分支更新到最新的"origin"
分支,最後把保存的這些補丁應用到"mywork"
分支上。
當'mywork'
分支更新以後,它會指向這些新建立的提交(commit)
,而那些老的提交會被丟棄。 若是運行垃圾收集命令(pruning garbage collection)
, 這些被丟棄的提交就會刪除. (請查看 git gc
)
如今咱們能夠看一下用合併(merge)
和rebase
所產生的歷史的區別:
在rebase
的過程當中,也許會出現衝突(conflict)
. 在這種狀況,Git會中止rebase
並會讓你去解決 衝突;在解決完衝突後,用"git-add"
命令去更新這些內容的索引(index)
, 而後,你無需執行 git-commit
,只要執行:
$ git rebase --continue
這樣git會繼續應用(apply)
餘下的補丁。
在任什麼時候候,你能夠用--abort
參數來終止rebase
的行動,而且"mywork"
分支會回到rebase
開始前的狀態。
$ git rebase --abort
多人協做開發,就不能使用master
分支了,而是要每一個開發者單獨拉一個分支,使用git checkout -b <branchname>
,運行git branch
能夠看到本地全部的分支名稱。
本身的分支,若是想同步master
分支的內容,可運行git merge master
。切換分支可以使用git checkout <branchname>
。
在本身的分支上修改了內容,能夠將本身的分支提交到遠程服務器
git checkout -b <branchname> //建立並切換分支 git add . git commit -m "xxx" git push origin <branchname>
最後,待代碼測試沒問題,再將本身分支的內容合併到master
分支,而後提交到遠程服務器。
git checkout master //切換分支 git merge <branchname> //合併分支 git push origin master...
詳細版
首先,咱們建立dev
分支,而後切換到dev
分支:
$ git checkout -b dev Switched to a new branch 'dev'
git checkout命令加上-b參數表示建立並切換,至關於如下兩條命令:
$ git branch dev $ git checkout dev Switched to branch 'dev'
而後,用git branch命令查看當前分支:
$ git branch * dev master
git branch
命令會列出全部分支,當前分支前面會標一個*號。
而後,咱們就能夠在dev
分支上正常提交,好比對readme.txt
作個修改,加上一行:
Creating a new branch is quick.
而後提交:
$ git add readme.txt $ git commit -m "branch test" [dev b17d20e] branch test 1 file changed, 1 insertion(+)
如今,dev分支的工做完成,咱們就能夠切換回master分支:
$ git checkout master Switched to branch 'master'
切換回master
分支後,再查看一個readme.txt
文件,剛纔添加的內容不見了!由於那個提交是在dev分支上,而master
分支此刻的提交點並無變.
如今,咱們把dev
分支的工做成果合併到master
分支上:
$ git merge dev Updating d46f35e..b17d20e Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)
git merge命令用於合併指定分支到當前分支。合併後,再查看readme.txt的內容,就能夠看到,和dev分支的最新提交是徹底同樣的。
注意到上面的Fast-forward
信息,Git
告訴咱們,此次合併是「 快進模式」,也就是直接把master
指向dev
的當前提交,因此合併速度很是快。
固然,也不是每次合併都能Fast-forward
,咱們後面會講其餘方式的合併。
合併完成後,就能夠放心地刪除dev分支了:
$ git branch -d dev Deleted branch dev (was b17d20e).
刪除後,查看branch,就只剩下master分支了:
$ git branch * master
由於建立、合併和刪除分支很是快,因此Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工做效果是同樣的,但過程更安全。
Git鼓勵大量使用分支:
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
綁定本地分支到遠程服務器分支: git branch --set-upstream-to origin/[遠程分支名] [本地分支名]
推送本地更新到遠程分支: git push <遠程庫名>(origin) [本地分支名]:[遠程分支名]
克隆遠程分支:git clone -b [遠程分支名] [遠程倉庫地址]
獲取遠程服務器的指定分支: git pull <遠程庫名>(origin) <遠程分支名>:<本地分支名>