百度百科:Git(讀音爲/gɪt/)是一個開源的分佈式版本控制系統,能夠有效、高速地處理從很小到很是大的項目版本管理。html
git相對svn,有不少優點,這裏就再也不贅述,你們網上搜索吧。git
git的操做流程是:好比咱們在本地對項目作更新操做,到最後推送到遠程倉庫,須要經歷這幾個步驟:ssh
0.在工做區更新項目分佈式
1.添加到暫存區(add)svn
2.提交到本地倉庫(commit)測試
3.推送到遠程倉庫(push)fetch
詳見:http://www.javashuo.com/article/p-bjtfuclu-bc.htmlspa
雖然有git客戶端,可是建議仍是用命令進行操做,由於命令會了,一個簡單的圖形界面客戶端是很easy的,信不信由你。版本控制
git --version,查看版本指針
git init,初始化本地倉庫(建立一個文件夾,進入這個文件夾,執行git init)
新增文件
git status,查看狀態
git add,將文件添加到暫存區
git commit,文件提交到本地倉庫
提示:
git在commit前,須要初始化配置:設置倉庫人員的用戶名和郵箱地址,這一步必不可少(參考:http://www.javashuo.com/article/p-bycuwwmb-gk.html)
git config --global user.name "uncleyong"
git config --global user.email "168632201@qq.com"
再次執行commit操做
git push,推送到遠程倉庫
由於咱們尚未關聯遠程倉庫,因此暫時不執行
先在遠程倉庫上建立一個項目(若是沒有帳號,能夠註冊一個,https://gitee.com)
輸入倉庫名稱,而後保存便可
複製遠程倉庫地址:https://gitee.com/UncleYong/git_test.git
git remote add添加遠程倉庫,origin能夠理解爲一個別名
推送到遠程倉庫
master表示推送到master分支(主幹分支),-f參數,就是表示強制,因爲咱們建立的是空項目,因此哪怕裏面有內容,也會被覆蓋掉(因此,這個參數要慎用)
輸入帳號
輸入密碼(也能夠配置ssh通訊方式,這樣能夠不用每次都輸入密碼:http://www.javashuo.com/article/p-cvujuhyk-gq.html)
推送成功
訪問:https://gitee.com/UncleYong/git_test
能夠看到,剛剛新增的test.txt文件已經被推送到遠程倉庫
可是,一般,項目不是咱們建立的,那麼:
若是咱們本地沒有這個項目,咱們就要先把項目拉到本地,git clone,作了更新後,再走上面的流程
若是咱們本地已經有這個項目,可是可能不是最新了,好比你的同事往遠處倉庫提交了代碼,此時,你本地的也作了修改,可是還沒提交,可是你要把遠程的拉下來,
操做方式一:git pull,會把你作的修改覆蓋掉,因此不推薦,除非你不想保留你的修改
操做方式二:先git fetch,而後git merge將遠程的變動合併到本地倉庫(下面的分支合併詳細講解)。
克隆空項目,從頭開始
test2.txt提交到暫存區
git reset HEAD 文件名,移除提交到暫存區的文件
git reset HEAD^ 或者 commitid,取消上一次的提交
把以前的提交了
兩次提交記錄
變成一次提交記錄了
把上次的提交了
git reset --soft HEAD^:回到上次提交前的狀態,也就是暫存區的狀態
第二次提交沒了,可是文件在暫存區
下面結果說明,執行git reset --soft後,工做區和暫存區的內容不會改變
修改提交信息,再次提交記錄
另外,還有下面兩個,你們本身實踐吧。
git reset --mixed (默認選項)將HEAD指向指定的提交,暫存區的內容隨之改變,工做區內容不變
git reset --hard 將HEAD指向指定的提交,暫存區跟工做區都會改變
把以前的提交了
git reset --hard HEAD^
每一個項目,通常有多個分支,好比master(主幹分支)、開發分支、測試分支、生產bug分支等等,一個分支不受其它分支的影響,
可是,分支越多,後期合併分支的成本越大,因此,不要隨便建立沒必要要的分支。
建立分支:git branch 分支名,分支名不要包含特殊符號,好比*,/,等等,要見其知意,另外,還能夠建立並切換分支:git checkout -b 分支名
查看全部分支:git branch,分支前面有*號的表示該分支爲當前所在分支
修改分支名:git branch -m 舊分支名 新分支名
切換分支:git checkout 分支名
刪除分支:git branch -d 分支名,可是不能刪除當前所在的分支
切換到master再刪除
用於查看提交歷史(commit的記錄),顯示的順序是由近到遠
顯示的log的含義:
commit id,每一個id都是惟一的
Author,初始化時候的配置信息,做者及郵箱
Date,提交日期
xxx,commit -m的提交說明
查看最近n次的提交:git log -n,n是數字
查看指定做者的提交,若是沒有,就顯示空:git log --author xxx
概要顯示:git log --oneline
git log --graph,一條線串聯整個提交歷史
顯示最近n次提交的不差別:git log -p -n,n是數字
克隆空項目,從頭開始
比較工做區和暫存區的差別(若是暫存區沒有,就和當前分支本地倉庫比較):git diff
比較暫存區和工做區的差別:git diff --cached
比較工做區和當前分支本地倉庫的差別:git diff HEAD,HEAD是指向當前分支的指針
新增文件
若是暫存區和當前分支本地倉庫都沒內容,執行git diff,結果就爲空
提交到本地倉庫
下面執行的git diff結果爲空,由於工做區爲空
修改文件
上面修改後,不add
結果說明:若是暫存區沒有內容,可是當前分支本地倉庫有內容,執行git diff,是工做區和本地倉庫對比,
add後,git diff沒有結果,由於工做區爲空
下圖表示暫存和當前分支本地倉庫對比
再次修改
上面修改後,不add
下面執行結果說明:
若是暫存區有內容,無論當前分支本地倉庫是否有內容,執行git diff,是工做區和暫存區對比,
若是暫存區沒有內容,可是當前分支本地倉庫有內容,執行git diff,是工做區和本地倉庫對比,
工做區和當前分支本地倉庫對比
把上面的都提交了
查看當前分支跟指定的分支的差別:git diff 分支名
建立並切換到test分支
而後修改文件
和master分支比較
查看兩個指定分支(已提交的)的差別(後者和前者的差別):git diff 分支名1 分支名2
提交前,沒有輸出結果
提交後,有輸出結果
查看指定文件的差別(比較工做區和暫存區):git diff 文件名
修改
列出兩個歷史提交的差別(後者與前者相比):git diff commitid1 commitid2
git diff --stat,列出有變動的文件,不顯示變動的具體內容
也能夠比較兩個分支(後者與前者相比)
補充,git diff結果的含義
diff --git a/text.txt b/text.txt,表示文件text.txt的兩個版本
--- a/text.txt,---表示更改前的文件
+++ b/text.txt,+++表示更改後的文件
@@ -2,3 +2,4 @@ hello test,文件差別的區域,-2,3表示變動前從第2行開始,到第3行,+2,4表示變動後從第2行開始,到第四行
第一次修改
第二次修改
test分支:第一次修改
+test分支:第二次修改,+表示新增了一行,-表示刪除了一行,若是對一行內容進行修改,在此處體現出來的就是先刪除一行,再新增一行
git merge 分支名,表示用指定分支和當前分支進行合併
克隆空項目,從頭開始
再建立一個文件並提交
建立並切換到分支test
修改文件
提交
切換到master分支,test2.txt內容沒有變
合併分支,而後能夠看到test分支修改的內容
切換到test分支
修改文件
提交
切到master分支
修改同一個文件
提交
合併test,產生衝突
文件內容
最終改成test分支上的
提交
查看衝突的文件:git diff --name-only --diff-filter=U
回退並查看衝突文件