天天看點

Git學習筆記Git學習筆記

Git學習筆記

文章目錄

  • Git學習筆記
    • 前言
    • Git簡介
    • Git安裝
    • 建立版本庫
    • 時光機穿梭
      • 檢視、上傳修改的檔案
      • 版本回退
      • 工作區和緩存區
      • 管理修改
      • 撤銷修改
      • 删除檔案
    • 遠端倉庫
    • 分支管理
      • 建立與合并分支
      • 解決沖突
      • 分支管理政策
      • BUG分支
    • 參考文檔

前言

Git的強大早就有所耳聞,現在很多企業公司都用到了git做版本的控制,目前在雲歌實習,雲歌送出項目的方式是用git指令向coding送出自己負責的部分,目前已經送出過兩個實習教育訓練實操:資料的加密解密、模拟微信搶紅包,由于之前沒有用過git,都是錦榮幫我操作的,現在我需要開始學習git的基本指令,了解企業中是如何開發的,這次的筆記也是第一次使用typora工具記錄markdown格式的筆記,以前都是用word去寫筆記的,現在就踏出面向工作面向好的學習狀态的第一步。這次看的教程是黃胤推給我的廖雪峰老師的教程。

Git簡介

Git是目前世界上最先進的分布式版本控制系統,Git可以記錄每次版本的改動,出現問題可以退回到原來的版本。

Git安裝

這次是在windows下安裝Git,之前在學習mmall的時候有在自己的電腦上安裝過,安裝還挺簡單的,就是下載下傳安裝程式,然後安裝一下,在自己電腦上右鍵弄出gitbash,在彈窗裡面設定一些參數,比如你的git賬戶的名字呀、git使用的郵箱啊之類的。

其中有用到指令:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
           

注意使用了 –global 之後,電腦上所有的Git倉庫都會會使用這個配置,當然也可以對某個倉庫指定不同的使用者名和Email位址,不加global就可以。

建立版本庫

什麼是版本庫呢?版本庫又名倉庫,英文名repository,可以簡單了解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、删除,Git都能跟蹤,以便任何時刻都可以追蹤曆史,或者在将來某個時刻可以“還原”。

windows下的操作方法:

  1. 建立一個專門用來存放倉庫(檔案)的檔案夾;
  2. 在這個檔案夾内點右鍵,點選Gitbash;
  3. 在用戶端中輸入git init,會在這個檔案夾内自動生成一個.git的檔案;
  4. 我們将我們要上傳的檔案放在這個目錄下;
  5. 使用

    git add .

    或者

    git add 檔案名字.拓展名

    ,将需要上傳的檔案添加進git的本地倉庫中;
  6. 使用

    git commit -m 送出描述

    将git本地倉庫的檔案送出進版本倉庫中;

為什麼Git添加檔案需要

add

commit

一共兩步呢?因為

commit

可以一次送出很多檔案,是以你可以多次

add

不同的檔案,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
           

時光機穿梭

檢視、上傳修改的檔案

我們會經常修改庫中的檔案,如何向版本倉庫更新我們的檔案呢?

  1. 先修改檔案;
  2. 運作

    git status

    檢視目前工作庫的狀态,并且會顯示哪些檔案被修改過了,一般這個時候會顯示Changes not staged for commit:xxx,是因為檔案沒有用

    git add

    儲存進本地倉庫;
  3. 如果我們要檢視檔案的修改内容,可以使用

    git diff 檔案名.拓展名

    指令來檢視;
  4. 我們确認了修改内容後,使用

    git add

    将修改的檔案添加到本地倉庫中;
  5. 再執行

    git status

    檢視一下目前本地倉庫的狀态,此時顯示Changes to be committed:xxx,這裡和步驟2不同的點在于步驟4已經使用了

    git add

    ;
  6. 使用

    git commit

    将本地倉庫的檔案送出到版本倉庫;
  7. 再使用

    git status

    檢視目前倉庫的狀态,如果顯示nothing to commit, working tree clean就說明現在已經沒有什麼需要送出了;

版本回退

當我們不斷的進行檔案的更新、上傳之後,git會自動儲存每一次更改的版本記錄,是以我們可能會用到以下指令:

  • git log

    來列印目前所有的版本資訊,包括版本号、作者、時間;
  • $ git reset --hard HEAD^

    指令來回到上一個版本,HEAD後面每一個代表往前的一個版本如HEAD^代表回到往前的兩個版本;
  • $ git reset --hard 1094a

    指令來回到對應的版本号,1094a是版本号
  • git reflog

    可以找到所有操作,操作裡面可以看到你曾經對哪些版本做過操作,就不怕從1版本回到2版本後,由于

    git log

    列印不出1版本的版本号,而無法再回到1版本了;

工作區和緩存區

工作區:我們建立的檔案夾就是工作區

緩存區:緩存區是我們

git init

後**.git**檔案裡面的東西,用來存放變化

是以流程大概就是:

Created with Raphaël 2.2.0

開始

向工作區添加檔案或者修改檔案

用git add .将檔案添加到緩存區中

用git commit -m将緩存區的檔案上傳至版本庫中

End

管理修改

當我們修改檔案上傳時,會遇見這樣的情況,我們第一次修改了檔案,并且将它送出到緩存區,但是沒有commit,這個時候,我們對檔案做了第二次修改,第二次修改完之後,我們沒有進行add操作,而是直接commit,我們會發現commit上去的隻有第一次的修改,第二次是沒有被修改的,這是緩存機制導緻的,git管理的是修改,我們修改後一定要add進緩存區,再commit。

撤銷修改

  1. 場景1:當你改亂了工作區某個檔案的内容,想直接丢棄工作區的修改時,用指令

    git checkout -- file

    ,這裡分兩種情況:
    1. 一種是自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀态;
    2. 一種是已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀态。
  2. 場景2:當你不但改亂了工作區某個檔案的内容,還添加到了暫存區時,想丢棄修改,分兩步,第一步用指令

    git reset HEAD <file>

    ,就回到了場景1,第二步按場景1操作。
  3. 場景3:已經送出了不合适的修改到版本庫時,想要撤銷本次送出,參考版本回退一節,不過前提是沒有推送到遠端庫。

删除檔案

我們有時候會将工作區的檔案删除,删除後我們用

git status

指令去檢視,會提示删除了檔案,我們可能會有兩種操作:

  1. 将版本庫裡的檔案也一起删了,那就用指令

    git rm

    删掉,并且

    git commit -m

    送出一下;
  2. 我們是誤删,那麼我們要将版本庫裡的檔案恢複到工作區,我們用

    git checkout

    指令就好了;

注意:從來沒有被添加到版本庫就被删除的檔案,是無法恢複的!

遠端倉庫

現在已經了解到,我是有自己的本地倉庫的,我猜測緩存區和本地倉庫都儲存在我的**.git**檔案中,那麼如何将本地倉庫和遠端倉庫連接配接起來呢?

本地倉庫和遠端倉庫進行鋪路:

  1. 我們先建立自己的github賬号,要記住注冊用的使用者名和郵箱;
  2. 在本地打開gitbash,輸入

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

    ,建立對應郵箱的ssh公鑰私鑰,它預設位置儲存在我的電腦->使用者->.ssh檔案中;
  3. 我們将公鑰複制,粘貼到github個人設定裡的ssh屬性中,注意不能将私鑰填進去,私鑰隻能自己知道;

完成上面的操作,我們已經将本地倉庫和遠端倉庫鋪好路了!

将本地倉庫的檔案傳到遠端倉庫上去:

  1. 先在github上建立一個項目,會生成項目的ssh連結位址;
  2. 在我們本地倉庫運作gitbash;
  3. 輸入

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

    ,注意origin後面的連結位址是我們項目的,而origin是可以改的,隻是遠端倉庫的名字,這一步就是将我們的本地倉庫和遠端倉庫連接配接起來;
  4. 使用

    $ git push -u origin master

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

    git push

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

    master

    推送到遠端。

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

master

分支時,加上了

-u

參數,Git不但會把本地的

master

分支内容推送的遠端新的

master

分支,還會把本地的

master

分支和遠端的

master

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

以後我們要再做推送,就直接輸入

$ git push origin master

從遠端倉庫克隆檔案到本地倉庫

  1. 首先先在github上面建立一個有初始README檔案的項目;
  2. 在電腦中建立一個檔案夾用來做存儲;
  3. 在這個檔案夾内輸入指令

    $ git clone [email protected]:715220395/gitskill.git

注意:在github上我們建立一個沒有自帶README檔案的項目時,它的ssh連結會直接顯示在上面,當我們建立有初始檔案的項目或者去已經有檔案的項目clone時,需要點選一下Clone or download按鈕,Git支援多種協定,包括

https

,但通過

ssh

支援的原生

git

協定速度最快。

分支管理

啥是分支啊?我的了解,分支就是屬于我自己的一條路,我走我自己的路,我走完了我的路程,我就可以合并到主路上去。

建立與合并分支

注意:由于這裡分支非常重要,而廖老師的講解非常詳細,這裡就直接搬過來了,一定要全部了解!

一開始的時候,

master

分支是一條線,Git用

master

指向最新的送出,再用

HEAD

指向

master

,就能确定目前分支,以及目前分支的送出點:

Git學習筆記Git學習筆記

每次送出,

master

分支都會向前移動一步,這樣,随着你不斷送出,

master

分支的線也越來越長。

當我們建立新的分支,例如

dev

時,Git建立了一個指針叫

dev

,指向

master

相同的送出,再把

HEAD

指向

dev

,就表示目前分支在

dev

上:

Git學習筆記Git學習筆記

你看,Git建立一個分支很快,因為除了增加一個

dev

指針,改改

HEAD

的指向,工作區的檔案都沒有任何變化!

不過,從現在開始,對工作區的修改和送出就是針對

dev

分支了,比如新送出一次後,

dev

指針往前移動一步,而

master

指針不變:

Git學習筆記Git學習筆記

假如我們在

dev

上的工作完成了,就可以把

dev

合并到

master

上。Git怎麼合并呢?最簡單的方法,就是直接把

master

指向

dev

的目前送出,就完成了合并:

Git學習筆記Git學習筆記

是以Git合并分支也很快!就改改指針,工作區内容也不變!

合并完分支後,甚至可以删除

dev

分支。删除

dev

分支就是把

dev

指針給删掉,删掉後,我們就剩下了一條

master

分支:

Git學習筆記Git學習筆記

步驟如下:

  1. 建立新分支dev

    $ git checkout -b dev

  2. 然後,用

    git branch

    指令檢視目前分支,

    git branch

    指令會列出所有分支,目前分支前面會标一個

    *

    号。;
  3. 我們再dev分支上進行修改,add,commit操作;
  4. 切換回master分支,

    $ git checkout master

  5. 把dev分支的工作成果合并到master分支上,

    $ git merge dev

  6. 合并完成後,就可以放心地删除

    dev

    分支了,

    $ git branch -d dev

  7. 再重新檢視一下分支,

    git branch

這裡建立、切換分支的時候可以使用:

建立分支:

$ git switch -c dev    
           

切換分支:

$ git switch master
           

解決沖突

沖突是這麼發生的:

當我們建立新分支dev,在dev分支下對檔案進行更改、add、送出後,切換回master分支,這時我們不着急将master分支與dev分支合并,而是在master分支下也對檔案進行更改、add、送出,之後我們再将master分支與dev分支合并,會出現如圖這種情況:

Git學習筆記Git學習筆記

master分支和dev分支都有送出,并不是master分支落後于dev分支,這時就出現沖突了,因為兩個分支都有改變,那麼到底要用誰的呢?是以這時我們需要手動處理沖突,就是打開被修改的檔案,根據git的提示去删除一些東西,保留我們需要的東西,這個時候再将檔案add、commit;

分支管理政策

當我們合并分支時,一般預設是用Fast forward模式,這種模式很快,但是如果我們删除了分支,那麼會丢失分支資訊,是以我們要換一種模式進行合并——

--no-ff

,我們使用這種模式,Git會在merge的時候生成一個新的commit,這種模式的指令是:

$ git merge --no-ff -m "merge with no-ff" dev

,dev是分支名字,我們将master分支與dev分支合并,由于這種模式生成了一個新的commit,是以我們使用了-m “送出資訊”,接下來我們可以使用指令

git log --graph --pretty=oneline --abbrev-commit

來檢視分支曆史。

BUG分支

軟體開發中,bug就像家常便飯一樣。有了bug就需要修複,在Git中,由于分支是如此的強大,是以,每個bug都可以通過一個新的臨時分支來修複,修複後,合并分支,然後将臨時分支删除。

當我在分支上工作,忽然接到一個修複bug的請求,那麼我要放下手中的工作,去建立分支并且修複bug,使用

git stash

可以把目前工作現場“儲藏”起來,等以後恢複現場後繼續工作。

bug修複完成後,使用

git stash list

指令檢視原來存儲的工作現場,恢複工作現場有兩個辦法:

  1. git stash apply

    恢複,但是恢複後,stash内容并不删除,你需要用

    git stash drop

    來删除;
  2. git stash pop

    ,恢複的同時把stash内容也删了

在master分支上修複了bug後,我們要想一想,dev分支是早期從master分支分出來的,是以,這個bug其實在目前dev分支上也存在。那怎麼在dev分支上修複同樣的bug?

在master分支上修複的bug,想要合并到目前dev分支,可以用

git cherry-pick <commit>

指令,把bug送出的修改“複制”到目前分支,避免重複勞動。

參考文檔

廖雪峰的Git教程