天天看點

Git使用

一:安裝git

1.1.linux安裝

  1、安裝git依賴包

    yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

  2、删除已有的git

    yum remove git

  3、下載下傳git源碼

    切換到你的封包件存放目錄下

      cd /usr/src

    下載下傳git安裝包

      wget 

https://www.kernel.org/pub/software/scm/git/git-2.8.3.tar.gz

    解壓git安裝包

      tar -zxvf git-2.8.3.tar.gz

      cd git-2.8.3

    配置git安裝路徑

      ./configure prefix=/usr/local/git/

    編譯并且安裝

      make && make install

    檢視git版本号

    git --version

    git已經安裝完畢

  4、将git指令添加到bash中

    vi /etc/profile

    在最後一行加入

    export PATH=$PATH:/usr/local/git/bin

    讓該配置檔案立即生效

    source /etc/profile

1.2.windows安裝

       官網 

https://git-scm.com/downloads

下載下傳安裝即可。

二:建立版本庫

  1.建立目錄

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
      

  2.目錄變成Git可以管理的倉庫

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
      

  瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現目前目錄下多了一個

.git

的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的檔案,不然改亂了,就把Git倉庫給破壞了。

  3.建立檔案

#vi  ./learngit/readme.txt      

  3.添加檔案到版本庫

  第一步,用指令

git add

告訴Git,把檔案添加到倉庫,檔案readme.txt從工作區被送出到暫存區,但此時檔案并沒有真正進入到版本庫當中,檔案目前隻處于一個中間狀态。

git add readme.txt
      

  

         第二步,用指令

git commit

告訴Git,把檔案送出到倉庫

   git commit

指令,

-m

後面輸入的是本次送出的說明,可以輸入任意内容,當然最好是有意義的,這樣你就能從曆史記錄裡友善地找到改動記錄。

         這個指令将處于中間狀态的檔案(暫存區的檔案)送出到版本庫中,這時才算真正完成了一次送出過程。

#git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt
      
Git使用

 三:遠端倉庫

  在繼續閱讀後續内容前,請自行注冊GitHub賬号。由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,是以,需要一點設定:

3.1.ssh_key

  第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有

id_rsa

id_rsa.pub

這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"
      

    你需要把郵件位址換成你自己的郵件位址,然後一路回車,使用預設值即可,由于這個Key也不是用于軍事目的,是以也無需設定密碼。

    如果一切順利的話,可以在使用者主目錄裡找到

.ssh

目錄,裡面有

id_rsa

id_rsa.pub

兩個檔案,這兩個就是SSH Key的秘鑰對,

id_rsa

是私鑰,不能洩露出去,

id_rsa.pub

是公鑰,可以放心地告訴任何人。

  第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:

  然後,點“Add SSH Key”,填上任意Title,在Key文本框裡粘貼

id_rsa.pub

檔案的内容:

       

Git使用

       點“Add Key”,你就應該看到已經添加的Key:

        

Git使用

    為什麼GitHub需要SSH Key呢?因為GitHub需要識别出你推送的送出确實是你推送的,而不是别人冒充的,而Git支援SSH協定,是以,GitHub隻要知道了你的公鑰,就可以确認隻有你自己才能推送。

    當然,GitHub允許你添加多個Key。假定你有若幹電腦,你一會兒在公司送出,一會兒在家裡送出,隻要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。

    最後友情提示,在GitHub上免費托管的Git倉庫,任何人都可以看到喔(但隻有你自己才能改)。是以,不要把敏感資訊放進去。

    如果你不想讓别人看到Git庫,有兩個辦法,一個是交點保護費,讓GitHub把公開的倉庫變成私有的,這樣别人就看不見了(不可讀更不可寫)。另一個辦法是自己動手,搭一個Git伺服器,因為是你自己的Git伺服器,是以别人也是看不見的。這個方法我們後面會講到的,相當簡單,公司内部開發必備。

    確定你擁有一個GitHub賬号後,我們就即将開始遠端倉庫的學習。

    現在的情景是,你已經在本地建立了一個Git倉庫後,又想在GitHub建立一個Git倉庫,并且讓這兩個倉庫進行遠端同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作,真是一舉多得。

3.2從遠端庫克隆

    首先,登陸GitHub,建立一個新的倉庫,名字叫

gitskills

    

Git使用

    我們勾選

Initialize this repository with a README

,這樣GitHub會自動為我們建立一個

README.md

檔案。建立完畢後,可以看到

README.md

檔案:

Git使用

    現在,遠端庫已經準備好了,下一步是用指令

git clone

克隆一個本地庫:

$ git clone [email protected]:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
      

    注意把Git庫的位址換成你自己的,然後進入

gitskills

目錄看看,已經有

README.md

檔案了:

$ cd gitskills
$ ls
README.md
      

3.3.送出版本

    首先,登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,建立一個新的倉庫:

Git使用

    在Repository name填入

learngit

,其他保持預設設定,點選“Create repository”按鈕,就成功地建立了一個新的Git倉庫:

Git使用

    目前,在GitHub上的這個

learngit

倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的内容推送到GitHub倉庫。

    現在,我們根據GitHub的提示,在本地的

learngit

倉庫下運作指令:

$ git remote add origin [email protected]:michaelliao/learngit.git
      

  請千萬注意,把上面的

michaelliao

替換成你自己的GitHub賬戶名,否則,你在本地關聯的就是我的遠端庫,關聯沒有問題,但是你以後推送是推不上去的,因為你的SSH Key公鑰不在我的賬戶清單中。

  添加後,遠端庫的名字就是

origin

,這是Git預設的叫法,也可以改成别的,但是

origin

這個名字一看就知道是遠端庫。

  下一步,就可以把本地庫的所有内容推送到遠端庫上:

#git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'
      

  把本地庫的内容推送到遠端,用

git push

指令,實際上是把目前分支

master

推送到遠端。

  由于遠端庫是空的,我們第一次推送

master

分支時,加上了

-u

參數,Git不但會把本地的

master

分支内容推送的遠端新的

master

分支,還會把本地的

master

分支和遠端的

master

分支關聯起來,在以後的推送或者拉取時就可以簡化指令。

四:版本回退

  git log

指令顯示從最近到最遠的送出日志,我們可以看到3次送出,最近的一次是

append GPL

,上一次是

add distributed

,最早的一次是

wrote a readme file

# git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <[email protected]>
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <[email protected]>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <[email protected]>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file
      

  回退到上個版本

#git reset --hard HEAD^
      

  回退到曆史版本

#git reset --hard HEAD^
  跳到指定版本
 id号不用寫全,前幾位即可      
#git reset --hard 1094
      

五:狀态對比:

  1.狀态檢視

#git status

      
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")           

git status

指令可以讓我們時刻掌握倉庫目前的狀态,上面的指令輸出告訴我們,

readme.txt

被修改過了,但還沒有準備送出的修改。

    2.不同對比

       已經記不清上次怎麼修改的

readme.txt

,是以,需要用

git diff

這個指令看看

# git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.
      

六: 撤銷本機上修改

#git checkout -- readme.txt
      

  指令

git checkout -- readme.txt

意思就是,把

readme.txt

檔案在工作區的修改全部撤銷,這裡有兩種情況:

  一種是

readme.txt

自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀态;

readme.txt

已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀态。

 七:分支

 7.1.建立與合并分支

  檢視分支:

git branch

  建立分支:

git branch <name>

  切換分支:

git checkout <name>

  建立+切換分支:

git checkout -b <name>

  合并某分支到目前分支:

git merge <name>

  删除分支:

git branch -d <name>

八:标簽

  • 指令

    git tag <tagname>

    用于建立一個标簽,預設為

    HEAD

    ,也可以指定一個commit id;
  • git tag -a <tagname> -m "blablabla..."

    可以指定标簽資訊;
  • git tag

    可以檢視所有标簽。
  • git push origin <tagname>

    可以推送一個本地标簽;
  • git push origin --tags

    可以推送全部未推送過的本地标簽;
  • git tag -d <tagname>

    可以删除一個本地标簽;
  • git push origin :refs/tags/<tagname>

    可以删除一個遠端标簽。

繼續閱讀