從新學習git

1、git的起源

由於linux的開發者不想花錢,給cvs、svn等等相似的版本管理平臺本身搞了一個git, 其實中間還有個小插曲,就是BitKeeper曾免費受權給他們用,可是他們沒有遵照協議,而後才被收回無償使用權。php

畢竟咱都是寫代碼的人,我怕你? clipboard.pnghtml

因此兩週後git出生了,並在2008github上線linux

2、git優點

版本管理通常分分佈式和集中式

相對分佈式開發還有集中式開發,表明就是svngit

一說到分佈式開發,不少人都想說,我git不須要聯網就能開發,你svn能夠嗎?!clipboard.png 就問你怕不怕 github

可是事實是嗎??thinkphp

誰說svn不能離線開?vim

我只要不提交,我都能刪庫跑路,別說開發。windows

還有誰說git不須要聯網?不須要聯網怎麼協同是否是難道用的是秋波?緩存

clipboard.png 此秋波來自 192.110.110.110編輯器

既然git 和svn都能本地不聯網開發,也都是須要聯網才能協同工做,那麼他們具體的區別在哪裏呢?

git 能夠在本地隨意建立或者切換分支,
    commit代碼到本身的本地倉庫。
    ....

svn 能夠在本地編輯代碼(這麼對比是否是很尷尬)

因此說,svn想要想git那種操做,是須要聯網的,不論是局域網仍是非局域網 都是要網 ,要網,要網~!

3、git使用

一、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的

clipboard.png接下來若是不特別指出是windows 那就是linux和unix系統*

二、配置

(1)、設置用戶名稱和郵箱 舉個?
經過命令行
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

相關信息,修改而且保存便可

(2)其餘配置
設置別名
好比
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

其餘配置看詳情

三、建立本地倉庫

(1)、clone遠程
git clone git://github.com/your/repositories.git '本地目錄'
// 本地目錄是可選的,沒有本地目錄就是當前目錄
(2)、本地建立

先在本地建立一個目錄好比 myproject

cd myproject
git init
(3)、其餘參數
  • --local 表示clone的是本地的倉庫
  • --shared 創建一個軟鏈
  • --bare 複製一個裸版本(也就是沒有包含工做區的內容)
  • --depth 複製到最後的第幾個版本,若是項目過大能夠設置這個避免複製時間過長

若是使用了depth以後 想要從新 pull之前的相關信息能夠執行 git pull --unshallow

四、版本管理

(1)工做區、暫(緩)存區、版本庫、遠程的概念

工做區:就是指咱們本地工做目錄,對咱們本地倉庫進行全部的增刪改爲操做只要尚未對該文件執行git add/stage,那麼全部的改動都還算是在工做區

緩存區:一箇中間層,存在於工做區和版本庫之間,工做區git add/stage以後內容就更新到了緩存區
執行了git commit以後,全部更新的內容都提交到了本地的版本庫中

版本庫:包含全部分支、歷史版等等所有的信息

遠程倉庫:本地倉庫執行push以後能將本地倉庫的信息更新到遠程

信息更新流: 工做區->緩存區->版本庫->遠程版本庫 (能夠逆向更新)

`

clipboard.png

小疑問存在跨去傳遞信息的嗎? 好比工做區的內容能直接更新到版本庫嗎?

(2)、基本操做命令
git status

查看當前工做區的信息,
好比當前所在分支, 當前工做區中有多少更改、刪除的文件 以及還沒有追蹤的文件`和遠程分支相比落後多少個版本`等等之類的信息

clipboard.png

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 設置提交時間
(3)、撤銷操做
git reset
撤銷操做

clipboard.png

clipboard.png

  • --soft,暫存區和工做區不會被更新

重置HEAD到另一個commit,但也到此爲止。工做區緩存區都是保持原本的樣子

  • --mixed,暫存區會更新至指定的commit,工做區不會收到影響,這是默認的選項

默認選項,將緩存區的數據更新成指定的commit那樣,工做區沒有影響

  • --hard,暫存區和工做區同時更新到指定的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
  • git checkout head^ 切換分支

這個命令其實是將HEAD指向另一個分支,而且將工做區更新到那個分支,若是工做區的更新可能會丟失,git會強制你將這些更新提交或者是stash(通常都是不一樣分支更改了相同的文件就會引發這個提示)
若是想強制切換使用--force 參數(是一個危險的操做)

  • 切換並新建分支 git checkout -b

若是該分支已經存在可使用-B強制重置該分支爲最新分支

  • git checkout xxx 切換某個文件

能夠將某個分支或者某個指定的commit某個文件checkout到本地來

  • 切換到某個commit

在查看工程的某個舊版本的時候,這個命令是頗有用的。可是,沒有分支指向當前的HEAD,因此分支會處於detached狀態。此時加入新的commit會是很是危險的,由於若是切換到其餘的分支後,將沒有辦法回到此次的commit。出於這個緣由,在提交commit到detached HEAD以前,應該新建一個分支。

git
傳入git reset和git checkout的參數決定了它們的做用域。參數中不包含文件路徑的話,這兩個命令就做用於整個commit。咱們將會討論這樣的操做。注意git revert不支持文件級別的操做。

參考
https://www.liaoxuefeng.com/w...

https://www.kancloud.cn/think...

https://git-scm.com/docs/git-...e";}

相關文章
相關標籤/搜索