由於linux的開發者不想花錢,給cvs、svn
等等相似的版本管理平臺本身搞了一個git
, 其實中間還有個小插曲,就是BitKeeper
曾免費受權給他們用,可是他們沒有遵照協議,而後才被收回無償使用權。php
畢竟咱都是寫代碼的人,我怕你? html
因此兩週後git出生了,並在2008github
上線linux
版本管理通常分分佈式和集中式
相對分佈式開發還有集中式開發,表明就是svn
git
一說到分佈式開發,不少人都想說,我git
不須要聯網就能開發,你svn
能夠嗎?! 就問你怕不怕 github
可是事實是嗎??thinkphp
誰說svn不能離線開?vim
我只要不提交,我都能刪庫跑路,別說開發。windows
還有誰說git不須要聯網?不須要聯網怎麼協同是否是難道用的是秋波?緩存
此秋波來自 192.110.110.110編輯器
既然git 和svn都能本地不聯網開發,也都是須要聯網才能協同工做,那麼他們具體的區別在哪裏呢?
git 能夠在本地隨意建立或者切換分支, commit代碼到本身的本地倉庫。 .... svn 能夠在本地編輯代碼(這麼對比是否是很尷尬)
因此說,svn想要想git那種操做,是須要聯網的,不論是局域網仍是非局域網 都是要網 ,要網,要網~!
linux 上安裝
安裝以前先輸入git
檢測是否已經安裝了
$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git
若是出現以上這句話,直接在命令行執行sudo apt-get install git
mac 上安裝
(1)、經過網址下載安裝 http://git-scm.com/download/mac。
(2)、經過homebrew的方式安裝(前提是先安裝好homebrew)
brew install git
注意:
linux和unix系統均可以經過 安裝oh-my-zsh
的插件 這個插件會自動安裝git
windows上安裝
經過下載安裝包吧 。https://git-for-windows.githu...
其餘方式沒弄過也不想弄。畢竟我是不喜歡windows的
接下來若是不特別指出是windows 那就是linux和unix系統*
經過命令行
git config --global user.name "spademan" //設置用戶名 git config --global user.email "646028751@qq.com" //設置郵箱
--global
加上參數會印象整個電腦的全部項目,因此慎用,假若有多個git帳號的話
若是須要設置某個特定項目的話 去掉--global
參數 而且須要進入某個項目裏面
經過修改文件
全局的gitconfig
存在"~/.gitconfig"(用戶目錄下的.gitconfig)
中
某個項目的gitconfig
存在.git/config
中
經過文本編輯器打開他們就能看到
[user] name = nickname email = nickname@gmail.com
相關信息,修改而且保存便可
設置別名
好比
git config --global alias.last 'cat-file commit HEAD'
以後能夠直接使用
git last
設置主題
全部的color.*
選項請參見git config
的文檔
$ git config color.branch auto $ git config color.diff auto $ git config color.interactive auto $ git config color.status auto
或者你能夠經過color.ui
選項把顏色所有打開:
$ git config color.ui true
配置提交模板
git config commit.template '/etc/git-commit-template'
模板內容舉例
// git-commit-template 時間: 新增: 修改: 刪除: 分支: 執行人: ....
弊端是不太好用,由於須要用到vim
其餘配置看詳情
git clone git://github.com/your/repositories.git '本地目錄' // 本地目錄是可選的,沒有本地目錄就是當前目錄
先在本地建立一個目錄好比 myproject
cd myproject git init
若是使用了depth以後 想要從新 pull之前的相關信息能夠執行 git pull --unshallow
工做區
:就是指咱們本地工做目錄,對咱們本地倉庫進行全部的增刪改爲操做只要尚未對該文件執行git add/stage
,那麼全部的改動都還算是在工做區
緩存區
:一箇中間層,存在於工做區和版本庫之間,工做區git add/stage
以後內容就更新到了緩存區
執行了git commit
以後,全部更新的內容都提交到了本地的版本庫中
版本庫
:包含全部分支、歷史版等等所有的信息
遠程倉庫
:本地倉庫執行push
以後能將本地倉庫的信息更新到遠程
信息更新流: 工做區->緩存區->版本庫->遠程版本庫 (能夠逆向更新)
`
小疑問
:存在跨去傳遞信息的嗎? 好比工做區的內容能直接更新到版本庫嗎?
git status
查看當前工做區的信息,
好比當前所在分支
, 當前工做區中有多少更改、刪除的文件
以及還沒有追蹤的文件
`和遠程分支相比落後多少個版本`等等之類的信息
git add
將增、刪、改
文件的相關信息添加到緩存區
默認狀況下以後添加非忽略
文件
若是須要添加忽略文件 須要設置--force
參數
能夠添加某單個文件也能夠執行git add .
添加所有文件
git pull
git pull
是git fetch
+git merge FETCH_HEAD
的縮寫。因此,默認狀況下,git pull就是先fetch,而後執行merge 操做,若是加–rebase 參數,就是使用git rebase 代替git merge。git commit
將暫存區
或者工做區
的信息更新到版本庫
不是說工做區
要先提交到暫存區
才能再從暫存區
更新到版本庫
的嗎?爲何這裏的描述能直接把工做區
的內容更新到版本庫
那是由於 commit 有語法糖的寫法 好比commit -a
表示執行了git add
以後再執行git commit
而且注意 git commit -a
只能將當前目錄下的跟蹤文件添加到緩存區,git add .
能將當前目錄下全部文件提交到緩存區。
經常使用參數
-a
表示將當前目錄下全部跟蹤文件
提交到暫存區--amend
表示修改最近一次提交的message
--date
設置提交時間git reset
撤銷操做
重置HEAD
到另一個commit
,但也到此爲止。工做區
和緩存區
都是保持原本的樣子
默認選項,將緩存區
的數據更新成指定的commit那樣,工做區
沒有影響
強制更新選項,緩存區
和工做區
都更新成指定的commit那樣
這是一個比較危險的動做,具備破壞性,數據所以可能會丟失!若是真是發生了數據丟失又但願找回來,那麼只有使用:git reflog命令了。makes everything match the commit you have reset to.你的全部本地修改將丟失。若是咱們但願完全丟掉本地修改可是又不但願更改branch所指向的commit,則執行git reset --hard = git reset --hard HEAD.
//示例代碼 git reset HEAD~2 // 配合參數使用 git reset --hard HEAD // 也能夠是commit id git reset --hard commitId
git checkout
這個命令其實是將HEAD
指向另一個分支,而且將工做區
更新到那個分支,若是工做區的更新可能會丟失,git會強制你將這些更新提交
或者是stash
(通常都是不一樣分支更改了相同的文件就會引發這個提示)
若是想強制切換使用--force
參數(是一個危險的操做)
若是該分支已經存在可使用-B
強制重置該分支爲最新分支
能夠將某個分支
或者某個指定的commit
的某個文件
checkout到本地來
在查看工程的某個舊版本的時候,這個命令是頗有用的。可是,沒有分支指向當前的HEAD,因此分支會處於detached狀態。此時加入新的commit會是很是危險的,由於若是切換到其餘的分支後,將沒有辦法回到此次的commit。出於這個緣由,在提交commit到detached HEAD以前,應該新建一個分支。
git
傳入git reset和git checkout的參數決定了它們的做用域。參數中不包含文件路徑的話,這兩個命令就做用於整個commit。咱們將會討論這樣的操做。注意git revert不支持文件級別的操做。
參考
https://www.liaoxuefeng.com/w...