集中式:svn
svn每次存的都是差異,需要的硬碟空間會小一點,可是復原速度會很慢。
優點:代碼存放在單一伺服器上,便于項目管理
缺點:
伺服器當機:員工寫的代碼得不到保障
伺服器故障:整個項目的曆史記錄都會丢失
分布式:git
git每次存的都是項目完整快照,需要的硬碟空間會大一點(git團隊對代碼做了極緻壓縮,最終需要的實際空間比svn多不了太多,可是git的復原速度很快)
優點:完全的分布式
缺點:學習起來比svn難一點
特點:
- 直接記錄快照,而非差異比較
- 幾乎所有操作都是本地執行
- 時刻保持資料完整性
- 多數操作僅添加資料
- 檔案的三種狀态(已送出、已修改、已暫存)
安裝:一直next 就ok;
安裝成功 滑鼠右鍵會有 git bash here顯示;
window 清屏是cls,git 清屏是clear;
git --version 手敲到指令面闆,複制不行;
git config 配置使用者資訊:
git config --global user.name "username" //引号裡的為個人的使用者名
git config --global user.email "email" //引号裡的為個人的郵箱
git config --global -- unset user.name //删除全局配置使用者名
git config --global -- unset user.email //删除全局配置郵箱
git config --list //檢視是否配置成功 最後兩行能看到name和email
區域:
- 工作區
- 暫存區
- 版本庫
對象:
- git對象
key:val 組成的鍵值對(key是val對應的hash);
鍵值對在git内部是一個blob類型
- 樹對象
- 送出對象
建立檔案: echo 'jiajia' > test.txt (txt檔案裡寫jiajia文字)
看目前目錄下有哪些檔案: ll
看對應目錄下的檔案和目錄:find ./ (他的上級目錄)
看對象目錄下的檔案:find ./ type f
删除檔案:rm file.txt
檔案重命名:mv file.txt file666.txt
檢視檔案内容:cat file666.txt
進入檔案内容:vim file666.txt
按i鍵 進入編輯模式
按esc退出編輯,再按冒号進入指令模式
按wq儲存退出
按q!強制退出 不儲存
set nu 設定行号
檢視暫存區目前的樣子:git ls-files -s
初始化倉庫:git init
檢視檔案的狀态:git status
檢視哪些修改還沒有暫存:git diff
檢視哪些修改已經被暫存了,還沒送出:git diff --stage
檢視曆史記錄:git log
檢視曆史記錄 一行展示:git log -- pretty=oneline (簡寫 git log --oneline)
檢視項目的分叉
将修改添加到暫存區:git add ./
将暫存區送出到版本庫:git commit -m '備注資訊'
将暫存區送出到版本庫,跳過add操作(必須是已經送出過的檔案):git commit -a -m '備注資訊'
删除工作目錄中對應的檔案,再将修改添加到暫存區:git rm 檔案名
将工作目錄中的檔案進行重命名,再将修改添加到暫存區:git mv 原檔案名 新檔案名
分支:本質就是一個送出對象
head:是一個指針,它預設指向master分支,切換分支時其實就是讓head指向不同的分支
每次有新的送出時,head都會帶着目前指向的分支一起往前移動
顯示分支清單:git branch
建立分支:git branch 分支名
切換分支:git checkout 分支名
建立并切換到新分支:git checkout -b 分支名
删除空分支,删除已經合并的分支(必須切換到其他分支,再删除):git branch -d 分支名
強制删除分支:git branch -D 分支名
檢視每個分支的最後一次送出:git branch -v
檢視本地分支與遠端分支的映射關系:git branch -vv
檢視合并到目前分支的分支清單:git branch --merged
檢視沒有合并到目前分支的分支清單:git branch --no--merged
建立分支,并指向對應送出記錄:git branch 新分支名 id
本地分支與遠端分支建立連接配接:git branch --set-upstream-to=origin/master_taiyuan your_branch
(origin/master_taiyuan是你本地分支對應的遠端分支;your_branch是你目前的本地分支)
遠端倉庫已有新分支,需要本地同步更新:git fetch origin(并不會跟蹤,需要建立連接配接)
更新本地倉庫:git remote update origin
遠端倉庫已經删除,本地還能看到的清理指令:git remote prune origin
*坑:
在切換分支時,如果目前分支上有未暫存的修改(第一次)或者有未送出的暫存(第一次),
分支是可以切換成功,但是這種操作可能會污染其他分支
存儲:git stash
檢視存儲清單:git stash list
拿出存儲:git stash apply (不指定 就取最近存的)
拿出指定存儲:git stash apply stash@{2}
删掉存儲:git stash drop stash@{0}
拿到存儲并删掉存儲:git stash pop stash@{0}
後悔藥
工作區
如何撤回自己在工作目錄中的修改(已跟蹤的,本次沒有add的檔案,撤回)
git checkout -- 檔案名
暫存區
如何撤回自己的暫存(add後的檔案,現在不想送出了)
git reset HEAD 檔案名
版本庫
如何撤回自己的送出(已經commit的檔案撤回)
1、内容有錯,改了重新送出就好,
2、git commit -amend 修改備注資訊
3、git reset --hard 最後一次commit的id(退回到上一次commit狀态,删除add,删除工作空間改動代碼)
git reset --soft HEAD^(撤回commit操作,改動代碼仍然保留)
(HEAD^的意思是上一個版本,也可以寫成HEAD~1,如果你進行了2次commit,想都撤回,可以使用HEAD~2)
本地分支
正常的資料推送和拉取步驟:
1、確定本地分支已經跟蹤了遠端跟蹤分支
2、拉取資料:git pull ,上傳資料:git push
一個本地分支怎麼去跟蹤一個遠端分支:
1、當克隆的時候會自動生成一個master本地分支(已經跟蹤了對應的遠端分支)
2、在建立其他分支時,可以制定想要跟蹤的遠端分支
(a、git checkout -b 本地分支名 遠端分支名
b、git checkout --track 遠端分支名 本地會和遠端同名)
3、将一個已經存在的本地分支改成一個跟蹤分支
git branch -u 遠端分支名