分佈式相比於集中式的最大區別在於開發者能夠將代碼提交到本地,每一個開發者經過克隆,在本地機器上拷貝一個完整的git倉庫。git
下圖是經典的git開發過程:
github
git的功能特性以下:服務器
- 從服務器上克隆完整的git倉庫(包括代碼和版本信息)到單機上;
- 在本身的機器上根據不一樣的開發目的,建立分支,修改代碼;
- 在單機上本身建立的分支上提交代碼;
- 在單機上合併分支;
- 把服務器上最新版的代碼fetch下來,而後跟本身的主分支合併;
- 生成補丁,把補丁發送給主開發者;
git能夠安裝在Windows、mac、Linux等操做系統之上,這裏將寫下如何安裝在Linux系統之上,及其基本操做。ssh
很是簡單,就一條命令,以下:分佈式
[root@git ~]# yum -y install git
[root@git /]# mkdir /git [root@git /]# cd git/ [root@git git]# git init # 初始化爲git庫 Initialized empty Git reposi tory in /git/.git/ [root@git git]# ls -a #初始化成功後,會生成一個.git的隱藏目錄 . .. .git #生成的隱藏目錄是用來跟蹤管理版本庫的,不建議隨便修改其目錄中的文件, #若是改亂了,就把git庫給破壞了。
在git版本庫中,有三個重要的概念:工做區、暫存區、版本庫。ide
- 工做區:就是你的系統中能夠看到的目錄;
- 暫存區:通常存放在.git目錄下的index文件中,因此也會將暫存區叫作索引;
- 版本庫:工做區中的有一個.git隱藏目錄,這個不算工做區,而是git的版本庫。
下面這個圖展現了工做區、版本庫中的暫存區和版本庫之間的關係:測試
上圖中,左側爲工做區,右側爲版本庫,在版本庫中標記爲「index」的區域就是暫存區,標記爲「master」的是master分支表明的目錄樹。fetch
當對工做區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工做區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。操作系統
當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。3d
當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。
當執行 "git rm --cached <file>" 命令時,會直接從暫存區刪除文件,工做區則不作出改變。
當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區所有或指定的文件替換工做區的文件。這個操做很危險,會清除工做區中未添加到暫存區的改動。
當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。
[root@git git]# git config --global user.name "zyz" [root@git git]# git config --global user.email "zyz@zyz.com" [root@git git]# echo "aaaa" > test.txt [root@git git]# git add test.txt [root@git git]# git commit -m "第一次提交" #將暫存區的文件提交到版本庫,而且必定要使用「-m」選項註明提交說明 [master (root-commit) 9ec7631] 第一次提交 1 file changed, 1 insertion(+) create mode 100644 test.txt [root@git git]# echo bbbb >> test.txt # 修改測試文件 [root@git git]# git status # 查看狀態他會說咱們這個文件發生更改須要添加 # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: test.txt # no changes added to commit (use "git add" and/or "git commit -a") [root@git git]# git add test.txt # 添加到暫存區 [root@git git]# git status # 再次查看狀態他會說須要再次提交這個文件 # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: test.txt # [root@git git]# git commit -m "第二次提交" # 提交完畢 [master 8c3c7db] 第二次提交 1 file changed, 1 insertion(+) [root@git git]# git status # 再次查看狀態 # On branch master nothing to commit, working directory clean [root@git git]# echo cccc >> test.txt # 修改第一個測試文件 [root@git git]# echo "第二個測試文件" > test2.txt # 新建幾個測試文件 [root@git git]# echo "第三個測試文件" > test3.txt [root@git git]# git add test.txt test2.txt test3.txt # 添加到暫存區 [root@git git]# git status # 查看狀態 # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: test.txt # 修改 # new file: test2.txt # 新文件 # new file: test3.txt # 新文件 # #上面是提示git被修改,而且添加了兩個新的文件 [root@git git]# git commit -m "提交多個版本" # 將暫存區的多個版本進行提交 [master 92e5155] 提交多個版本 3 files changed, 3 insertions(+) create mode 100644 test2.txt create mode 100644 test3.txt [root@git git]# git log --pretty=oneline # #查看提交記錄,一行對應一次提交記錄 92e5155ccbb59913cd717a539a11529b786a564b 提交多個版本 8c3c7dbc6eb90d64899df1d23c0546fe1ffbe064 第二次提交 9ec7631c3c93990f71db83ae04e8b387aa1213d6 第一次提交 #至此,git庫下的全部文件都被提交了,那麼,我如今將本地的全部文件都刪除,查看下git的狀態是什麼 [root@git git]# rm test* #刪除當前目錄下全部的測試文件 [root@git git]# git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: test.txt # 刪除 # deleted: test2.txt # deleted: test3.txt #上述提示了刪除了三個文件,下面說的是修改了可是還沒有提交 no changes added to commit (use "git add" and/or "git commit -a") #那麼,我如今若想恢復刪除的文件呢?只需進行如下操做: [root@git git]# git reflog --pretty=oneline # 查看 提交記錄 92e5155 HEAD@{0}: commit: 提交多個版本 8c3c7db HEAD@{1}: commit: 第二次提交 9ec7631 HEAD@{2}: commit (initial): 第一次提交 [root@git git]# ls # 肯定沒有任何測試文件 [root@git git]# git reset --hard 92e5155 # #版本回滾到指定提交的位置 HEAD is now at 92e5155 提交多個版本 [root@git git]# ls #再次查看,被刪除的文件又回來了 test2.txt test3.txt test.txt #那麼,如今我想要恢復到第一次提交的時候呢? [root@git git]# git reflog --pretty=oneline # 一樣須要查看提交日誌 92e5155 HEAD@{0}: commit: 提交多個版本 8c3c7db HEAD@{1}: commit: 第二次提交 9ec7631 HEAD@{2}: commit (initial): 第一次提交 [root@git git]# git reset --hard HEAD@{2} #對,在版本回滾時,不但能夠指定第一列的ID號,也能夠指定其HEAD字段 HEAD is now at 9ec7631 第一次提交 [root@git git]# ls #再次查看當前工做目錄下,恢復到了最初只有一個測試文件的狀態 test.txt [root@git git]# git reset --hard 92e5155 #再次恢復到測試文件最多的時候 HEAD is now at 92e5155 提交多個版本 [root@git git]# ls test2.txt test3.txt test.txt
關於撤銷修改,其實在上面已經展現出來如何從版本庫中撤銷修改了,那麼下面將介紹如何從暫存區、工做臺進行撤銷修改
1.從工做臺撤銷修改
[root@git git]# cat test.txt #肯定當前文件內容 aaaa bbbb cccc [root@git git]# echo dddd >> test.txt #修改文件內容 [root@git git]# cat test.txt # #查看修改後的文件 aaaa bbbb cccc dddd [root@git git]# git checkout -- test.txt #對工做臺執行撤銷操做 [root@git git]# cat test.txt #確認新添加的內容被撤銷 aaaa bbbb cccc
2.從暫存區撤銷修改
[root@git git]# echo "123123" > aaa.txt # 建立一個新的測試文件 [root@git git]# git add aaa.txt # 添加到暫存區 [root@git git]# git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: aaa.txt # 新文件 # [root@git git]# git reset HEAD aaa.txt # 撤銷 [root@git git]# git status #再次查看git的狀態,提示提交爲空,還提示使用git add創建提交 # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # aaa.txt # 這裏已經顯示不是新文件 nothing added to commit but untracked files present (use "git add" to track) #提交爲空,可是存在還沒有跟蹤的文件(使用 "git add" 創建跟蹤)
3.從版本庫中刪除指定版本
[root@git git]# rm test.txt #刪除本地文件 root@git git]# git rm test.txt #使用git執行rm命令 rm 'test.txt' [root@git git]# git commit -m "刪除文件" #提交到版本庫 [master f9bccab] 刪除文件 1 file changed, 3 deletions(-) delete mode 100644 test.txt
至此,都只是git版本庫的基本操做,那麼?咱們如何將咱們的git
庫關聯到github上呢?下面是兩種狀況下的關聯方法。
狀況一:本地有git庫,github庫是空的:
1.首先須要先建立一個空的github庫。
自行註冊github帳號並登錄,比較簡單,這裏就不寫了。
在主機上生成祕鑰對,並上傳至github上:
[root@git git]# ssh-keygen -t rsa -C "848369866@qq.com" #執行此命令後,一路按回車便可,「-C」後面是本身的郵箱地址 [root@git git]# cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEKmiwENbVxLSn2tRDUAFVh3muJFXJYqjuOPU+RfCIb42Bv2w52zzasY4rEPgPc865b+NTLk4Xkw4SEEl7qzObf/kDyqtM0d7PjCR+E4/u9MKHo+evgtNJwrNXeoycKc1EHKYWRqAbJ79QulwqDPU7Z2DC9I0ML1Kf6ipRe4biN58imyt/YLxVj9RnmWS6r+umkSM4ukn4DKHGfI1DJxIWEk2jwgQKBmdBB06YZvHBn6VOKaIlCSSHCAWZ51D6EDT8LdZ4jwZmbqN0ypBFG7E6KM5oYPE1hIRnbcy+HB7jYCptNmZhv2eamHH+yL+oMe2Wn/wxwc1gTRfl9Epz1LD7 848369866@qq.com
在github上操做以下,以便添加公鑰:
輸入github帳號的密碼進行驗證:
肯定添加成功:
2.回到新建立的庫:
[root@git git]# ls -a . .. aaa.txt .git test2.txt test3.txt [root@git git]# git remote add origin git@github.com:zhangyz-nb/test01.git #執行提示的第一條命令 [root@git git]# git push -u origin master #進行提交,因爲是第一次上傳,因此須要使用「-u」選項 #若是執行上述命令後,提示須要輸入「yes」,輸入便可 Counting objects: 13, done. Delta compression using up to 2 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (13/13), 1021 bytes | 0 bytes/s, done. Total 13 (delta 0), reused 0 (delta 0) To git@github.com:zhangyz-nb/test01.git * [new branch] master -> master Branch master set up to track remote branch master from origin. #提示已經提交成功了。
至此,F5刷新咱們github上剛剛建立的庫的頁面,就能夠看到咱們工做臺目錄下的那些文件了,以下:
上述已經演示瞭如何將本地的git版本庫關聯到遠端的github的空庫。
那麼這裏將展現如何將github已存在的庫(庫中有內容)下載到本地。
因爲在第五步操做時,已經設置好了郵箱及ssh祕鑰等操做,因此這裏就能夠省略這兩部操做了,若是沒有配置郵箱及ssh祕鑰,可參考第五個段落進行配置。
這裏就將第五步建立的github庫下載到本地。
找到github建立的庫,以下:
[root@git git]# git clone git@github.com:zhangyz-nb/test01.git Cloning into 'test01'... #執行命令「git clone」,後面的路徑就是咱們複製的github上的ssh路徑 Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts. remote: Enumerating objects: 13, done. remote: Counting objects: 100% (13/13), done. remote: Compressing objects: 100% (6/6), done. remote: Total 13 (delta 0), reused 13 (delta 0), pack-reused 0 Receiving objects: 100% (13/13), done. [root@git git]# cd test01/ [root@git test01]# ls test2.txt test3.txt [root@git test01]# echo "clone success..." > succed # 建立一個新的測試文件 [root@git test01]# ls succed test2.txt test3.txt [root@git test01]# git add succed # 添加到暫存區 [root@git test01]# git commit -m "clone succes" # 提交 [master 4b662bd] clone succes 1 file changed, 1 insertion(+) create mode 100644 succed [root@git test01]# git push origin master # 將本地文件推送到github Counting objects: 4, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@github.com:zhangyz-nb/test01.git f9bccab..4b662bd master -> master [root@git test01]# git remote # 查看遠端版本庫信息 origin
回到github上,刷新庫的頁面,便可看到新提交的文件,以下: