Git學習札記

首先理解幾個基本概念:

origin:默認遠程版本庫;

master:默認開發分支;


(1)git log

查看提交日誌。會顯示出你的每一次提交。如圖:



(2)git log --pretty=oneline

如果你覺得上面輸出內容太多太雜,可以使用這個命令。信息會在一行顯示。如圖:



(3)git branch

查看當前分支。如圖,我現在在master分支。



(4)git reflog

查看提交歷史,以便確定你要回滾到哪個版本。根據前面的hash值或者HEAD可以進行回滾。



(5)git diff 文件名

查看你某個文件的修改前後對比。紅色“-”爲刪除,綠色“+”爲插入。修改過程就是先刪除,後插入。


(6)git reset --hard 7位哈希值

回滾到某個版本。7位哈希值可以通過git reflog查到。如圖:




(7)cat 文件名

查看某個文件的內容。如圖:



(8)git checkout -- 文件名

把該文件在工作區的修改全部撤銷,這裏有兩種情況:

一種是文件修改後還沒有放到暫存區(也就是還沒有執行git add),現在撤銷修改就回到和版本庫一樣的狀態;

一種是文件修改後已經添加到暫存區(已經執行了git add),又做了修改,撤銷修改就回到了添加到暫存區後的狀態;

總之,就是讓這個文件回到最近執行git commit或git add時的狀態。

注意中間的"--"很重要,沒有“--”,就變成了“切換到另一個分支”的命令。



(9)git reset HEAD 文件名

把暫存區的修改撤銷掉(unstage),重新放回工作區。

git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區,當我們用HEAD時,表示最新的版本。




(10)git rm 文件名

在工作區中增加一個文件,並添加到本地分支中。但是如果你不需要這個文件了。你直接用"rm 文件名"刪除該文件。這個時候,Git知道你刪除了文件,因此,工作區和版本庫就不一樣了。git status可以查看當前的情況。

此時有兩個選擇:

1.確實要從版本庫中刪除該文件,就用命令"git rm 文件名"刪掉,並且git commit提交,此時該文件就真正從版本庫中刪除了。

2.另一種情況是刪錯了,因爲版本庫中還有該文件,所以可以把誤刪的文件恢復到最新版本,“git checkout -- 文件名”。“git checkout”就是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。




(11)git remote add origin ***github倉庫地址

關聯一個遠程倉庫。在第一次提交之前進行。


(12)git remote -v

查看遠程倉庫的地址。


(13)git remote rm origin 

刪除原來的遠程倉庫地址。


(14)git push -u origin master

第一次推送master分支的所有內容。


(15)git push origin master

以後每次的修改使用該命令。


(16)關於分支:

在版本回滾裏,每次提交,Git都把他們串成一條時間線,這條時間線就是一個分支。到目前爲止,只有一條時間線,在Git裏,這個分支叫主分支,即master分支。HEAD指針嚴格來說不是指向提交,而是指向master,master纔是指向提交的。所以,HEAD指向的就是當前分支。


git checkout -b dev

創建一個dev分支,然後切換到dev分支。


(17)上述命令相當於以下兩條命令:

git branch dev  :新建一個dev分支;

git checkout dev   :切換到dev分支;


(18)git branch

查看本地所有分支。前面帶星號*的表示當前所在的分支。



注意:

git branch -a:查看所有分支,包括本地分支和遠程分支。

本地分支用綠色和黑色顯示,綠色表示你現在所在分支,黑色是其他分支。遠程分支用紅色表示。


git branch -r  :查看遠程所有分支,都以紅色顯示。


git branch -d dev:刪除本地某一個分支,如dev分支。


(20)合併分支

1. git checkout -b dev :首先創建一個dev分支,並切換到dev分支;


2.進行修改文件,然後提交。



.


3.cat main.m

dev分支下

發現裏面我增加了“//dev分支”這幾個字;



4.git checkout master:現在dev分支的工作完成了,我們就可以切換到master分支。



5.cat main

master分支下。

發現裏面並沒有“//dev分支”,因爲那個提交是在dev分支上,而maser分支此刻的提交點並沒有變。


6. git merge dev

把dev分支的工作成果合併到master分支上。

git merge 命令用於合併指定分支到當前分支。合併後,在查看文件內容,就可以看到,和dev分支的最新提交是完全一樣的。


7.上面的"Fast-forward"信息,Git告訴我們,這次的合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。

8.git branch -d dev

合併完成後,就可以放心的刪除dev分支了。



9.分支小結:因爲創建、合併和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果使一樣的,但過程更安全。



(21)解決衝突

1.git checkout -b testConflict

git add .

git commit -m "testConflict提交,測試衝突"

新建一個testConflict分支,用來測試衝突。並修改其中的一行代碼;提交。



2. git checkout master

git add .

git commit -m "測試"

在master分支下,同樣修改同一行代碼,並進行提交;


3.git merge testConflict

此時兩個分支各自有了新的提交,此時,Git無法執行“快速合併”,只能視圖把各自的修改合併起來,但這種合併就會有衝突。此時合併的結果如下:


4.git 提示我們有衝突。可以通過"git status"命令來查看哪個文件有衝突。如圖:



5. 我們可以直接去衝突文件查看,可以看到如下代碼:



其中<<<<<,=====,>>>>>>,這種地方表示是有衝突的。可以手動進行修改,修改後代碼如下:



然後在master下進行提交即可。如圖:




6.git log --graph

可以看到分支的合併情況,如圖:


注意上面:"Merge: 5da331c 1225c73",  是把後面的分支合併到前面的分支。也就是把testConfict分支合併到master分支上。這個7位數是commit後面那串數字的前7位。

commit 後面那串數字是hash值,使用的是SHA-1哈希算法,40位的長度。是根據你的文件內容計算出的hash值。


7.git log --graph --pretty=oneline

可以讓輸出在一行顯示,如圖:



8. 最後把testConflict分支刪除即可。注意:當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。


(22)分支管理策略

1.通常合併分支時,如果可以,Git會使用Fast Forward快進模式,但這種模式下,刪除分支後,會丟掉分支信息。我們可以使用--no-ff方式的git merge.

2.git checkout -b dev

仍然創建並切換到dev分支。

3.git add .

git commit -m "merge --no-ff"

在dev分支下進行提交。

4.git checkout master

切換到master分支下。

5.git merge --no-ff -m "merge with no-ff" dev

合併使用--no-ff參數,表示禁用Fast Forward。因爲本次合併要創建一個新的commit,所以加上-m參數。

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

查看分支歷史。注意使用--abbrev-commit 參數可以把commit的40爲hash值縮短爲7位,方便查看。


7.分支策略:

首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活。幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合併到master上,在master上發佈1.0版本。每個人都有自己的分支,時不時往dev分支上合併就可以了。

合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出曾經做過合併。而fast forward合併就看不出曾經做過合併。默認是“fast forward”.





(23)Bug分支

每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。

1.git stash

把當前的工作現場儲藏起來,等以後回覆現場後繼續使用。

git stash list

查看當前分支中存儲的stash




2.git status

此時在dev分支中查看工作區,是乾淨的。因此可以放心的創建分支來修復bug。



3.git checkout master

git checkout -b issue-101

首先確定要在哪個分支上修復bug,假定要在master分支上修復,就從master創建臨時分支。



4.在issue-101上修復bug,提交。





5.git checkout master

git merge --no-ff -m "修復完成,合併issue-101分支" issue-101

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

合併bug分支。





6.git branch -d issue-101

刪除bug分支。



7.git checkout dev

git status

再次回到dev分支幹活,工作現場是完全乾淨的。



8.git stash list

查看當前的工作現場。Git把stash內容存儲在某個地方了。我們需要恢復現場。




9.git stash pop

git stash list

在恢復內容的同時把stash的內容也刪了。



10.git stash apply

git stash drop

這兩行命令相當於“git stash pop”. 用“git stash apply”恢復,但是恢復後,stash內容並不刪除,需要用“git stash drop”來刪除。


11.git add .

git commit -m "在dev分支提交"

把dev分支工作的內容提交。等下要合併到master分支。





12.git checkout master

git merge --no-ff -m "合併dev分支的工作內容" dev

如果有衝突,則手動修改。




13.git add .

git commit -m “合併了dev後的master提交”

git branch -d dev

手動解決衝突後,在master提交,然後刪除dev分支。




14.小結:修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除。

當手頭工作沒有完成時,先把工作現場git stash 一下,然後去修復bug,修復後,再git stash pop,回到工作現場。


(24)Feature分支

1.添加一個新功能,你肯定不希望因爲一些實驗性質的代碼,把主分支搞亂了。所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成後,合併,最後刪除feature分支。

當開發完成後,如果在還沒有合併之前,這個新功能不需要了。就需要刪除該分支。

git branch -d feature-net




.


2.git branch -D feature-net

注意:1中的刪除無法成功,因爲該分支還沒有被合併,如果刪除,將丟失修改。如果要進行強行刪除,要使用"git branch -D feature-net"命令。


3.小結:開發一個新的feature,最好新建一個分支。如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。


(25)git remote 

查看遠程庫的信息。

git remote -v

顯示詳細信息。顯示了可以抓取和推送的origin地址。如果沒有推送的權限,就看不到push的地址。



(26)多人協作

1.推送分支:就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上。

git push origin master

如果要推送到其他分支,比如dev,就改成:

git push origin dev

但是並不是一定要把本地分支往遠程推送,那麼,哪些分支需要推送,哪些分支不需要呢?

--master分支是主分支,因此要時刻與遠程同步;

--dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;

--bug分支只用於在本地修復bug,沒必要推送到遠程;

--feature分支可以看實際開發需要。


2.抓取分支

git checkout -b dev origin/dev 

創建遠程origin的dev分支到本地。


git branch --set-upstream dev origin/dev

設置本地dev與遠程origin/dev分支的鏈接。


3.多人協作的模式:

--首先,可以試圖用git push origin branch-name推送自己的修改;

--如果推送失敗,因爲遠程分支比你的本地分支版本新,需要先用git pull視圖合併;

--如果合併有衝突,則解決衝突,並在本地提交;

--沒有衝突或者解決衝突後,再用git push origin branch-name推送就能成功。

--如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令"git branch --set-upstream branch-name origin/branch-name".

4.小結

--查看遠程庫信息,使用“git remote -v”;

--本地新建的分支如果不推送到遠程,對其他人就是不可見的;

--從本地推送分支,使用“git push origin branch-name”,如果推送失敗,先用"git pull"抓取遠程的新提交;

--在本地庫創建和遠程分支對應的分支,使用“git checkout -b branch-name origin/branch-name”,本地和遠程分支的名稱最好一致;

--建立本地分支和遠程分支的關聯,“git branch --set-upstream branch-name origin/branch-name”;

--從遠程抓取分支,使用git pull.如果有衝突,要先處理衝突。



(27)標籤管理

發佈一個版本時,我們通常先在版本庫中打一個標籤,這樣,就唯一確定了打標籤時刻的版本。將來無論什麼時候,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。所以,標籤也是版本庫的一個快照。

Gitde 標籤雖然是版本庫的快照,但其實他就是指向某個commit的指針。所以,創建和刪除標籤都是瞬間完成的。



(28)創建標籤

git tag v1.0

切換到要打標籤的分支上,執行“git tag v1.0”,默認是打在最新提交的commit上。


git tag 

查看所有的標籤。




git tag v1.1 commit_id

標籤可以打在任意一個提交上。


git show v1.0

查看標籤信息。



(29)操作標籤

1.git tag -d v1.0

因爲創建的標籤都只存儲在本地,不會自動推送到遠程。所以,打錯的標籤可以在本地安全刪除。


2.git push origin v1.0

推送某個tag到遠程分支。



3.git push origin --tags

一次性推送全部尚未推送到遠程的本地標籤。



4.如果標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除

git tag -d v1.0

然後從遠程刪除。刪除命令也是push,但是格式如下:

git push origin :refs/tags/v1.0




5.小結:

--命令“git push origin <tagname>”:可以推送一個本地標籤;

--命令“git push origin --tags”:可以推送全部未推送的本地標籤;

--命令"git tag -d <tagname>":可以刪除一個本地標籤;

--命令“git push origin :refs/tags/<tagname>”:可以刪除一個遠程標籤。






2.git status

此時在dev分支中查看工作區,是乾淨的。因此可以放心的創建分支來修復bug。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章