git 及其基本操做

git與github

  1. 首先gitgithub不是同一個東西。Git是一款免費、開源的分佈式版本控制系統,而github是基於git代碼託管平臺且同時也具備版本記憶功能。
  2. git是分佈式版本管理系統。
  3. git是由linux的創造者linus開發的。
  4. 不一樣於CVSSVN的集中式版本控制方式,git使用分佈式進行版本控制。將較而言,git分佈式版本控制能夠實現本地化的版本庫,工做時沒必要聯網;git具備強大的分支管理能力,穩定性更高。(便捷)

git首次安裝後的設置

首先打開hash.exe輸入用戶名和郵箱html

//配置全局用戶信息
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
//修改當前用戶信息
$ git config user.name 你的目標用戶名;
$ git config user.email 你的目標郵箱名;

利用git本地倉庫進行版本控制能夠簡單的理解爲:a 持有實際文件的物理工做目錄,b 暫存區,c 本地倉庫(git在本地默認創建的一個master分支)linux

其中a-->b是由add實現,而b-->c是由commit實現。git

利用git在本地進行版本庫存儲

  1. git在本地指定地點創建倉庫(或者是指向克隆下來的倉庫):github

    cd e:/github_projects/tisikcci.github.io
  2. 初始化一個git倉庫:web

    init

    初始化以後,會在tisikcci.github.io文件夾下生成一個默認隱藏的.git文件夾vim

    添加遠程庫:在本地的learngit倉庫下運行命令:$ git remote add origin 倉庫地址安全

  3. 向這個隱藏的文件夾中添加文件:README.md(能夠是別的文件,要將這個文件放在.git同級文件夾下):bash

    git add README.md

    也能夠一次添加多個文件,相似於:服務器

    git add README1.md README2.md README3.md
  4. 將文件存入本地倉庫(當前分支),同時添加改動或者說是更新說明:(-m後這裏的‘first commit’應該是與本次提交或者更新有關係有實際意義的說明,方便之後溯源)app

    git commit -m'first commit'
  5. 在上面的3,4步驟過程後可使用如下命令看到內容的變更

    git status

    第一次提交時:git push -u origin master

  6. 可使用如下代碼查看git版本庫的修改或者說是更新次數(使用q能夠退出這個命令)

    git log

    若是以爲這樣獲得的信息太多,可使用下面的命令,使得每次修改信息漂亮的顯示在同一行

    git log --pretty=oneline

    也能夠選定查看最近2次的版本更新信息:

    git log -n 2
  7. 能夠利用reset實現版本回退:

    git reset --hard head^

    注意:HEAD表示當前版本(就是一個指針),在後面加一個^,表示(指向)上一個版本,前第N個版本是HEAD~N,回退之後想恢復以前最新的版本或者是某次特定的版本,能夠利用以下代碼查找操做代碼庫的關鍵步驟 歷史記錄的ID實現:

    git reflog

    根據ID,好比是441736f,前進到回退前的某個版本

    git reset --hard 441736f
  8. commit以後又對項目中的某個文件內容進行了更新,能夠利用如下命令回到離commit最近的狀態(就是丟棄掉沒有進行add操做的更改內容,回到上次commit操做時的狀態

    git checkout -- 文件名 

    這裏本質是利用本地版本庫中的相同文件替換了本地文件夾中的文件,因此看起來是回到以前commit操做時的狀態了(可是若是更改已經add了,除非放棄add操做內容,不然下次commit又會更新本地倉庫)。更進一步,撤銷已經add到暫存區但沒有commit到本地分支的文件

    git reset head 文件名

    以上過程當中可使用如下命令查看具體文件的內容

    cat 文件名
  9. 刪除本地版本庫中的文件
    首先說一下一種特殊狀況:本地的文件夾中的項目相關文件被刪除了,但沒有更新本地的版本庫,若是這時想恢復被刪除的項目相關文件,能夠利用如下命令:

    git checkout -- 文件名

    第二種狀況是真的想刪除本地倉庫中的相關文件,利用如下代碼刪除本地文件夾中的文件(也能夠手動刪除)

    rm 文件名

    而後利用如下代碼刪除本地倉庫中的文件

    git  rm 文件名

    而且利用git commit進行保存

    git commit -m"remove 文件名"
  10. 新建一個分支,能夠利用

    git branch 分支名
           git checkout 分支名

    上面的代碼分別表示新建一個分支,並將head(指針)指向新建的指針,也可使用下面的方式直接
    實現新建一個分支並使head指向它

    git checkout -b 分支名

    能夠利用下面的命令分別查看本地分支,遠程分支和全部分支,當前指向分支前會加*號

    git branch<br>git branch -r<br>git branch -a

    刪除已經存在的指定本地分支,遠程分支(注意要先將指針指向其餘分支才能刪除此分支)

    git branch -d 分支名
           git push origin :分支名

    重命名分支

    git branch -m 原分支名 新分支名
  11. 在新分支上提交內容,對以前的主分支master並不會有影響,能夠利用以下方式再切換回主分支

    git checkout master

    此時head會從新指向master,將master替換爲別的分支,能夠實現切換到任意指定分支

  12. 將新創建的分支合併到主分支(首先要切換回主分支)

    git merge 新分支

    合併後,就能夠利用上面給出的方法刪除新分支

  13. 若是想保留新建的分支,並推送到遠程倉庫,能夠利用

    git push origin 新建的分支
  14. 能夠給項目進度添加版本號,經過添加標籤的方式實現

    git tag 版本號

    經過省略版本號能夠直接查看已經添加的版本號

    git tag

    能夠給之前的某次提交補加版本號,只要查找到以前commit操做對應的ID,好比:441736f

    git tag 版本號 441736f

    能夠利用以下的方式實如今添加標籤時添加說明

    git tag -a 版本號 -m "版本說明"

    能夠經過如下命令查看指定版本內容

    git show 版本號

    刪除不想要的標籤

    git tag -d 已經存在的標籤(版本號)

    能夠將本地標籤推送到遠程倉庫

    git push 遠程主機名(好比origin) 版本號

    好比:

    git push origin v1.0

    將本地全部的版本號都推送到遠程倉庫

    git push origin --tags

    若是想刪除遠程倉庫的版本號,須要進行兩步
    a. 首先要刪除本地版本號(標籤)
    b. 再刪除遠程版本號

    git push origin :refs/tags/版本號

利用以上步驟,基本能夠實現利用git本地進行操做,如下要實現將本地git倉庫同步到遠程倉庫(例如github,固然也能夠本身在一臺PC上搭建一個服務器,做爲遠程倉庫)

利用github充當遠程倉庫是一種很不錯的方式,git本地倉庫和github能夠經過SSH加密,利用多種方式進行數據傳輸:HTTP(s)、SSH、Git、本地協議等,前兩種比較經常使用。


本地git倉庫同步到遠程倉庫

  1. 要想將本地倉庫同步到Github上,首先須要創建本地和Github上使用的SSH私鑰和公鑰,在git的bash.exe中輸入
    ssh-keygen -t rsa -C 「tisikcci@foxmail.com
    這樣在用戶下的.ssh目錄裏就能夠建立id_rsaid_rsa.pub這兩個文件,一路回車20170414170253668
  2. 在電腦上生成公鑰和私鑰,將公鑰上傳到github
    登陸Github,找到右上角的圖標,打開點進裏面的Settings,再選中裏面的SSH and GPG KEYS,點擊右上角的New SSH key,而後Title裏面隨便填,再把剛纔id_rsa.pub裏面的內容複製到Title下面的Key內容框裏面,最後點擊Add SSH key,這樣就完成了SSH Key的加密
  3. 測試是否鏈接成功

    ssh -T git@github.com
  4. Github上創建一個你想和本地倉庫進行同名的倉庫(名字相同)
  5. 利用上面的cd...指向本地倉庫的位置,而後關聯到Github的遠程倉庫:

    git remote add origin git@github.com:tisikcci/tisikcci.github.com.git
  6. 關聯好以後,能夠把本地倉庫中的內容推送到Github上的遠程倉庫了
    在首次進行推送的時候,須要:

    git pull --rebase origin master(若是初始化的倉庫有文件好比README要先和本地合併)
             git push -u origin master

    此處加 -u 是用來將本地master和遠程master進行關聯的,之後再次推送就不須要再加了,origin是遠程主機的名字,能夠經過如下代碼來查看

    git remote

    或者是

    git remote -v

    這個主機名字是能夠人爲指定的。首次推送以後,下次再向遠程倉庫master分支推送項目時,只須要

    git push origin master
  7. 上面提到能夠人爲指定遠程主機的名字,在將遠程倉庫克隆到本地的時候,能夠實現

    git clone -o 新主機名 https://github.com/tisikcci/first-static-web-page.git/

    若是使用默認的主機名而且克隆到本地指定的位置,能夠利用

    git clone https://github.com/tisikcci/first-static-web-page.git/

    本地地址
    最好是直接利用SSH協議進行clone,以下

    git clone 倉庫的SSH地址  本地創建的空文件夾地址
           git clone git@github.com:tisikcci/test.git e:/github_projects/zz

    就將遠程倉庫的test克隆到了本地的zz文件夾中。

遠程倉庫同步本地git倉庫

git pull命令

git pull命令用於從另外一個存儲庫或本地分支獲取並集成(整合)。git pull命令的做用是:取回遠程主機某個分支的更新,再與本地的指定分支合併,它的完整格式稍稍有點複雜

使用語法

git pull [options] [<repository> [<refspec>…]]

描述

將遠程存儲庫中的更改合併到當前分支中。在默認模式下,git pullgit fetch後跟git merge FETCH_HEAD的縮寫。

更準確地說,git pull使用給定的參數運行git fetch,並調用git merge將檢索到的分支頭合併到當前分支中。 使用--rebase,它運行git rebase而不是git merge。

示例

$ git pull <遠程主機名> <遠程分支名>:<本地分支名>

好比,要取回origin主機的next分支,與本地的master分支合併,須要寫成下面這樣 -

$ git pull origin next:master

若是遠程分支(next)要與當前分支合併,則冒號後面的部分能夠省略。上面命令能夠簡寫爲:

$ git pull origin next

上面命令表示,取回origin/next分支,再與當前分支合併。實質上,這等同於先作git fetch,再執行git merge

$ git fetch origin
$ git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,創建一種 追蹤關係(tracking)。好比,在 git clone的時候,全部本地分支默認與遠程主機的同名分支,創建追蹤關係,也就是說,本地的master分支自動」追蹤」 origin/master分支。

Git也容許手動創建追蹤關係。

$ git branch --set-upstream master origin/next

上面命令指定master分支追蹤origin/next分支。

若是當前分支與遠程分支存在追蹤關係,git pull就能夠省略遠程分支名。

$ git pull origin

上面命令表示,本地的當前分支自動與對應的origin主機」追蹤分支」(remote-tracking branch)進行合併。

若是當前分支只有一個追蹤分支,連遠程主機名均可以省略。

$ git pull

上面命令表示,當前分支自動與惟一一個追蹤分支進行合併。

若是合併須要採用rebase模式,可使用–rebase選項(rebase可查看下文)。

$ git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>

git fetchgit pull的區別

  1. git fetch:至關因而從遠程獲取最新版本到本地,不會自動合併。

    $ git fetch origin master
           $ git log -p master..origin/master
           $ git merge origin/master

以上命令的含義:

- 首先從遠程的`origin`的`master`主分支下載最新的版本到`origin/master`分支上
 - 而後比較本地的`master`分支和`origin/master`分支的差異
 - 最後進行合併

上述過程其實能夠用如下更清晰的方式來進行:

$ git fetch origin master:tmp
        $ git diff tmp 
        $ git merge tmp
  1. git pull:至關因而從遠程獲取最新版本並merge到本地

    git pull origin master

上述命令其實至關於git fetchgit merge
在實際使用中,git fetch更安全一些,由於在merge前,咱們能夠查看更新狀況,而後再決定是否合併。

rebase模式

假設你如今基於遠程分支"origin",建立一個叫"mywork"的分支。

$ git checkout -b mywork origin

圖片描述

如今咱們在這個分支作一些修改,而後生成兩個提交(commit).

$ vi file.txt  
$ git commit
$ vi otherfile.txt
$ git commit
//vi命令是UNIX操做系統和類UNIX操做系統中最通用的全屏幕純文本編輯器。Linux中的vi編輯器叫vim,它是vi的加強版(vi Improved),與vi編輯器徹底兼容,並且實現了不少加強功能

可是與此同時,有些人也在"origin"分支上作了一些修改而且作了提交了. 這就意味着"origin""mywork"這兩個分支各自"前進"了,它們之間"分叉"了。

圖片描述

在這裏,你能夠用"pull"命令把"origin"分支上的修改拉下來而且和你的修改合併; 結果看起來就像一個新的"合併的提交"(merge commit):

圖片描述

可是,若是你想讓"mywork"分支歷史看起來像沒有通過任何合併同樣,你也許能夠用 git rebase:

$ git checkout mywork
$ git rebase origin

這些命令會把你的"mywork"分支裏的每一個提交(commit)取消掉,而且把它們臨時保存爲補丁(patch)(這些補丁放到".git/rebase"目錄中),而後把"mywork"分支更新到最新的"origin"分支,最後把保存的這些補丁應用到"mywork"分支上。

圖片描述

'mywork'分支更新以後,它會指向這些新建立的提交(commit),而那些老的提交會被丟棄。 若是運行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除. (請查看 git gc)

如今咱們能夠看一下用合併(merge)rebase所產生的歷史的區別

圖片描述

rebase的過程當中,也許會出現衝突(conflict). 在這種狀況,Git會中止rebase並會讓你去解決 衝突;在解決完衝突後,用"git-add"命令去更新這些內容的索引(index), 而後,你無需執行 git-commit,只要執行:

$ git rebase --continue

這樣git會繼續應用(apply)餘下的補丁。
在任什麼時候候,你能夠用--abort參數來終止rebase的行動,而且"mywork" 分支會回到rebase開始前的狀態。

$ git rebase --abort

如何多人協做開發

多人協做開發,就不能使用master分支了,而是要每一個開發者單獨拉一個分支,使用git checkout -b <branchname>,運行git branch能夠看到本地全部的分支名稱。

本身的分支,若是想同步master分支的內容,可運行git merge master。切換分支可以使用git checkout <branchname>

在本身的分支上修改了內容,能夠將本身的分支提交到遠程服務器

git checkout -b <branchname> //建立並切換分支
git add .
git commit -m "xxx"
git push origin <branchname>

最後,待代碼測試沒問題,再將本身分支的內容合併到master分支,而後提交到遠程服務器。

git checkout master  //切換分支
git merge <branchname>  //合併分支
git push origin master...

詳細版
首先,咱們建立dev分支,而後切換到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b參數表示建立並切換,至關於如下兩條命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

而後,用git branch命令查看當前分支:

$ git branch
* dev
  master

git branch命令會列出全部分支,當前分支前面會標一個*號。

而後,咱們就能夠在dev分支上正常提交,好比對readme.txt作個修改,加上一行:

Creating a new branch is quick.

而後提交:

$ git add readme.txt 
$ git commit -m "branch test"
[dev b17d20e] branch test
 1 file changed, 1 insertion(+)

如今,dev分支的工做完成,咱們就能夠切換回master分支:

$ git checkout master
Switched to branch 'master'

切換回master分支後,再查看一個readme.txt文件,剛纔添加的內容不見了!由於那個提交是在dev分支上,而master分支此刻的提交點並無變.
如今,咱們把dev分支的工做成果合併到master分支上:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用於合併指定分支到當前分支。合併後,再查看readme.txt的內容,就能夠看到,和dev分支的最新提交是徹底同樣的。

注意到上面的 Fast-forward信息, Git告訴咱們,此次合併是「 快進模式」,也就是直接把 master指向 dev的當前提交,因此合併速度很是快。

固然,也不是每次合併都能Fast-forward,咱們後面會講其餘方式的合併。

合併完成後,就能夠放心地刪除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).

刪除後,查看branch,就只剩下master分支了:

$ git branch
* master

由於建立、合併和刪除分支很是快,因此Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工做效果是同樣的,但過程更安全。

小結

Git鼓勵大量使用分支:

查看分支:git branch

建立分支:git branch <name>

切換分支:git checkout <name>

建立+切換分支:git checkout -b <name>

合併某分支到當前分支:git merge <name>

刪除分支:git branch -d <name>

綁定本地分支到遠程服務器分支: git branch --set-upstream-to origin/[遠程分支名] [本地分支名]

推送本地更新到遠程分支: git push <遠程庫名>(origin) [本地分支名]:[遠程分支名]

克隆遠程分支:git clone -b [遠程分支名] [遠程倉庫地址]

獲取遠程服務器的指定分支: git pull <遠程庫名>(origin) <遠程分支名>:<本地分支名>


參考連接:

相關文章
相關標籤/搜索