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下的操作方法:
- 建立一個專門用來存放倉庫(檔案)的檔案夾;
- 在這個檔案夾内點右鍵,點選Gitbash;
- 在用戶端中輸入git init,會在這個檔案夾内自動生成一個.git的檔案;
- 我們将我們要上傳的檔案放在這個目錄下;
- 使用
或者git add .
,将需要上傳的檔案添加進git的本地倉庫中;git add 檔案名字.拓展名
- 使用
将git本地倉庫的檔案送出進版本倉庫中;git commit -m 送出描述
為什麼Git添加檔案需要
add
,
commit
一共兩步呢?因為
commit
可以一次送出很多檔案,是以你可以多次
add
不同的檔案,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
時光機穿梭
檢視、上傳修改的檔案
我們會經常修改庫中的檔案,如何向版本倉庫更新我們的檔案呢?
- 先修改檔案;
- 運作
檢視目前工作庫的狀态,并且會顯示哪些檔案被修改過了,一般這個時候會顯示Changes not staged for commit:xxx,是因為檔案沒有用git status
儲存進本地倉庫;git add
- 如果我們要檢視檔案的修改内容,可以使用
指令來檢視;git diff 檔案名.拓展名
- 我們确認了修改内容後,使用
将修改的檔案添加到本地倉庫中;git add
- 再執行
檢視一下目前本地倉庫的狀态,此時顯示Changes to be committed:xxx,這裡和步驟2不同的點在于步驟4已經使用了git status
;git add
- 使用
将本地倉庫的檔案送出到版本倉庫;git commit
- 再使用
檢視目前倉庫的狀态,如果顯示nothing to commit, working tree clean就說明現在已經沒有什麼需要送出了;git status
版本回退
當我們不斷的進行檔案的更新、上傳之後,git會自動儲存每一次更改的版本記錄,是以我們可能會用到以下指令:
-
來列印目前所有的版本資訊,包括版本号、作者、時間;git log
-
指令來回到上一個版本,HEAD後面每一個代表往前的一個版本如HEAD^代表回到往前的兩個版本;$ git reset --hard HEAD^
-
指令來回到對應的版本号,1094a是版本号$ git reset --hard 1094a
-
可以找到所有操作,操作裡面可以看到你曾經對哪些版本做過操作,就不怕從1版本回到2版本後,由于git reflog
列印不出1版本的版本号,而無法再回到1版本了;git log
工作區和緩存區
工作區:我們建立的檔案夾就是工作區
緩存區:緩存區是我們
git init
後**.git**檔案裡面的東西,用來存放變化
是以流程大概就是:
Created with Raphaël 2.2.0
開始
向工作區添加檔案或者修改檔案
用git add .将檔案添加到緩存區中
用git commit -m将緩存區的檔案上傳至版本庫中
End
管理修改
當我們修改檔案上傳時,會遇見這樣的情況,我們第一次修改了檔案,并且将它送出到緩存區,但是沒有commit,這個時候,我們對檔案做了第二次修改,第二次修改完之後,我們沒有進行add操作,而是直接commit,我們會發現commit上去的隻有第一次的修改,第二次是沒有被修改的,這是緩存機制導緻的,git管理的是修改,我們修改後一定要add進緩存區,再commit。
撤銷修改
- 場景1:當你改亂了工作區某個檔案的内容,想直接丢棄工作區的修改時,用指令
,這裡分兩種情況:git checkout -- file
- 一種是自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀态;
- 一種是已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀态。
- 場景2:當你不但改亂了工作區某個檔案的内容,還添加到了暫存區時,想丢棄修改,分兩步,第一步用指令
,就回到了場景1,第二步按場景1操作。git reset HEAD <file>
- 場景3:已經送出了不合适的修改到版本庫時,想要撤銷本次送出,參考版本回退一節,不過前提是沒有推送到遠端庫。
删除檔案
我們有時候會将工作區的檔案删除,删除後我們用
git status
指令去檢視,會提示删除了檔案,我們可能會有兩種操作:
- 将版本庫裡的檔案也一起删了,那就用指令
删掉,并且git rm
送出一下;git commit -m
- 我們是誤删,那麼我們要将版本庫裡的檔案恢複到工作區,我們用
指令就好了;git checkout
注意:從來沒有被添加到版本庫就被删除的檔案,是無法恢複的!
遠端倉庫
現在已經了解到,我是有自己的本地倉庫的,我猜測緩存區和本地倉庫都儲存在我的**.git**檔案中,那麼如何将本地倉庫和遠端倉庫連接配接起來呢?
本地倉庫和遠端倉庫進行鋪路:
- 我們先建立自己的github賬号,要記住注冊用的使用者名和郵箱;
- 在本地打開gitbash,輸入
,建立對應郵箱的ssh公鑰私鑰,它預設位置儲存在我的電腦->使用者->.ssh檔案中;$ ssh-keygen -t rsa -C "[email protected]"
- 我們将公鑰複制,粘貼到github個人設定裡的ssh屬性中,注意不能将私鑰填進去,私鑰隻能自己知道;
完成上面的操作,我們已經将本地倉庫和遠端倉庫鋪好路了!
将本地倉庫的檔案傳到遠端倉庫上去:
- 先在github上建立一個項目,會生成項目的ssh連結位址;
- 在我們本地倉庫運作gitbash;
- 輸入
,注意origin後面的連結位址是我們項目的,而origin是可以改的,隻是遠端倉庫的名字,這一步就是将我們的本地倉庫和遠端倉庫連接配接起來;$ git remote add origin [email protected]:michaelliao/learngit.git
- 使用
指令,把本地庫的内容推送到遠端,用$ git push -u origin master
指令,實際上是把目前分支git push
推送到遠端。master
由于這是我們第一次推送,遠端庫是空的,我們第一次推送
master
分支時,加上了
-u
參數,Git不但會把本地的
master
分支内容推送的遠端新的
master
分支,還會把本地的
master
分支和遠端的
master
分支關聯起來,在以後的推送或者拉取時就可以簡化指令。
以後我們要再做推送,就直接輸入
$ git push origin master
從遠端倉庫克隆檔案到本地倉庫
- 首先先在github上面建立一個有初始README檔案的項目;
- 在電腦中建立一個檔案夾用來做存儲;
- 在這個檔案夾内輸入指令
;$ git clone [email protected]:715220395/gitskill.git
注意:在github上我們建立一個沒有自帶README檔案的項目時,它的ssh連結會直接顯示在上面,當我們建立有初始檔案的項目或者去已經有檔案的項目clone時,需要點選一下Clone or download按鈕,Git支援多種協定,包括
https
,但通過
ssh
支援的原生
git
協定速度最快。
分支管理
啥是分支啊?我的了解,分支就是屬于我自己的一條路,我走我自己的路,我走完了我的路程,我就可以合并到主路上去。
建立與合并分支
注意:由于這裡分支非常重要,而廖老師的講解非常詳細,這裡就直接搬過來了,一定要全部了解!
一開始的時候,
master
分支是一條線,Git用
master
指向最新的送出,再用
HEAD
指向
master
,就能确定目前分支,以及目前分支的送出點:

每次送出,
master
分支都會向前移動一步,這樣,随着你不斷送出,
master
分支的線也越來越長。
當我們建立新的分支,例如
dev
時,Git建立了一個指針叫
dev
,指向
master
相同的送出,再把
HEAD
指向
dev
,就表示目前分支在
dev
上:
你看,Git建立一個分支很快,因為除了增加一個
dev
指針,改改
HEAD
的指向,工作區的檔案都沒有任何變化!
不過,從現在開始,對工作區的修改和送出就是針對
dev
分支了,比如新送出一次後,
dev
指針往前移動一步,而
master
指針不變:
假如我們在
dev
上的工作完成了,就可以把
dev
合并到
master
上。Git怎麼合并呢?最簡單的方法,就是直接把
master
指向
dev
的目前送出,就完成了合并:
是以Git合并分支也很快!就改改指針,工作區内容也不變!
合并完分支後,甚至可以删除
dev
分支。删除
dev
分支就是把
dev
指針給删掉,删掉後,我們就剩下了一條
master
分支:
步驟如下:
- 建立新分支dev
;$ git checkout -b dev
- 然後,用
指令檢視目前分支,git branch
指令會列出所有分支,目前分支前面會标一個git branch
号。;*
- 我們再dev分支上進行修改,add,commit操作;
- 切換回master分支,
;$ git checkout master
- 把dev分支的工作成果合并到master分支上,
;$ git merge dev
- 合并完成後,就可以放心地删除
分支了,dev
;$ git branch -d dev
- 再重新檢視一下分支,
;git branch
這裡建立、切換分支的時候可以使用:
建立分支:
$ git switch -c dev
切換分支:
$ git switch master
解決沖突
沖突是這麼發生的:
當我們建立新分支dev,在dev分支下對檔案進行更改、add、送出後,切換回master分支,這時我們不着急将master分支與dev分支合并,而是在master分支下也對檔案進行更改、add、送出,之後我們再将master分支與dev分支合并,會出現如圖這種情況:
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
指令檢視原來存儲的工作現場,恢複工作現場有兩個辦法:
- 用
恢複,但是恢複後,stash内容并不删除,你需要用git stash apply
來删除;git stash drop
- 用
,恢複的同時把stash内容也删了git stash pop
在master分支上修複了bug後,我們要想一想,dev分支是早期從master分支分出來的,是以,這個bug其實在目前dev分支上也存在。那怎麼在dev分支上修複同樣的bug?
在master分支上修複的bug,想要合并到目前dev分支,可以用
git cherry-pick <commit>
指令,把bug送出的修改“複制”到目前分支,避免重複勞動。
參考文檔
廖雪峰的Git教程