Git的基本操作
文章目錄
1.git的工作流程

其中github和gitee是基于互聯網的,而gitlab是基于局域網的。公司一般使用的是gitlab。
2.git的工作環境
下載安裝好git之后,選擇一個工作目錄,并在該目錄右鍵鼠標,點擊git bash here,當然也可以git gui here它是一個圖形界面但是由于太丑了,所以一般使用git bash。

git bash的命令和linux是一致的,雖然這里是windows系統。甚至vim也是可以使用的
3.git的基本操作
(1)git init
該操作用于初始化本地庫,在終端輸入git init后可以在當前目錄看到一個.git的文件夾(需要查看隱藏文件)。

注意該文件夾中的內容是不可以修改的創建成功的話就可以進行基本的git操作了。
(2)git status
用于查看當前庫的狀態:

可以發現出現了三行內容,其中第一行表示的意思是處于master分支中,第二行表示的是還沒有提交任何東西,第三行表示的是沒有什么需要提交。
這個命令我們在之后的git學習中會頻繁的使用到。
(3)git add
使用vim來創建一個test.txt文件,來模擬一下提交過程:

以上是隨便寫的文件的內容,創建文件之后再使用git status操作:

可以看到test.txt是紅色的,表示沒有放入暫存區(當前該文件只在工作區存在),并且終端給了提示,使用git add操作將其放入暫存區。
當進行git add操作之后:

此時可以看到test.txt變成了綠色,表示已經將它放入了暫存區,并且給了如下提示:
git rm --cached test.txt
該條指令的作用就是從暫存區刪除test.txt,如果刪除test.txt會再度變為紅色。
(4)git commit
該條指令用于從暫存區提交到本地庫,通常伴隨使用-m選項來寫日志

其中提交之后會打印一段話,表示提交成功了,并出現了一個數字b26d1b8,它是版本號的一部分,通常代表版本號。
此時再使用git status可以看到:

第一行表示的是在主分支中,第二條表示的是沒有什么可以提交了,并且樹時干凈的,即沒有做任何版本修改。
4.版本控制
(1)git reflog與git log
git reflog輸出日志信息,git log也輸出日志信息不過更加詳細

其中head是一個指針,它指向的是主分支b26d1b8表示的是版本號,master分支指向該版本號。
(2)再增加兩個版本
使用git add和git commit再使用以上方法增加兩個版本,這里有一個細節,在修改test.txt并進行commit之后會看到

其中我修改了一行內容,可以發現實際操作是刪除了一行并加入了一行,也就是說git是按行對文件操作的,而不能在行內追加。
此時再輸出日志信息可以看到:

此時head指針指向的是master分支,master分支指向的是版本3
(3)git reset --hard 版本號
當處于第三個版本的時候,可以看到test.txt的內容是

如果我們想回退到版本2或者版本1呢?使用以下指令可以回退
git reset --hard 版本號

此時就回退到了版本2,再查看test.txt的內容,發現就是版本2的內容了

那么如果我們此時修改版本2呢?修改后提交的還是版本2嗎?顯然不是,修改版本2再提交就是第4個版本了:

(4)兩個指針
通過以上的描述我們發現其實是有兩個指針的,其中Head指針指向的是分支號,master指針指向的是版本號:

我們還可以在.git/refs/heads/master中看到當前分支以及版本號信息。
4.分支管理
(1)對分支的理解
要完成一個項目需要做不同的功能,可以將每個功能作為一個分支最終合并分支形成一個完整的項目:

比如在這里,首先將master分支拷貝兩個分支branch1和branch2來完成不同的任務,其中branch1完成任務后提交,如果提交后發生了錯誤,就建立一個新的分支hot-fix來進行緊急修復,修復后再與branch2完成的任務進行合并。
分支的作用有兩個:解耦(安全)和并行開發(提高效率)。
(2)git branch和git branch -v
使用git branch可以創建分支,使用git branch -v可以查看分支:

*所在的位置就是當前所在的分支。
(3)git checkout 分支名
切換分支

(4)git merge
git merge分為兩種情況,一種情況發生沖突,一種情況沒有發生沖突,一種是發生了沖突。
發生沖突的意思是兩者都對代碼的同一個位置進行了修改。
首先來看沒有發生沖突的情況:

我們對hot-fix的版本做如上修改。并進行提交到本地庫的操作。
然后我們切換到master分支并進行法分支合并,此時可以先查看一下master分支中的內容:

注意,由于master分支是沒有做任何修改的,因此合并是不沖突的。沖突的意思是兩者都發生了修改:
此時執行git merge指令,注意,當前我們是處于master分支的,是hot-fix分支來找我們進行合并:

合并之后我們發現內容變成了這個樣子。
下面來看有沖突合并的例子,即當分支做了修改之后,master的分支代碼也進行了修改。
此時還可以分為兩種情況,第一種情況是,master和hot-fix沒有修改代碼的同一個位置,第二種情況是master和hot-fix修改了代碼的同一個位置。
注意,修改之后需要進行提交,否則會影響其他分支。
當沒有修改代碼同一個位置的時候,與沒有發生沖突的結果是一樣的,這里不作演示了,當修改的是代碼的同一個位置的時候:
首先我們將hot-fix分支進行修改。(注意需要提交)

此時我們再切換回主分支,對主分支的倒數第二行增加內容(沖突),再添加一些其他內容,并提交

此時再進行分支合并,可以看到文件的結果變為:

變成了使用<<<<和===以及>>>>來分割的內容,其中既包含主分支的內容,也包含hot-fix分支的內容。
需要程序員手動對代碼進行修改之后再進行提交。因為git無法幫助我們自動選擇了。
此時我們打開vim將代碼修改如下:
然后再進行提交,注意這里還有一個問題,此時如果commit加上文件名就會發生報錯:

在commit的時候不能加入文件名就可以提交成功了。
值得注意的是由于是在master進行分支合并,因此是將hot-fix的內容合并到master中,而hot-fix的內容沒有發生改變。
5.遠程庫操作
(1)基本操作
遠程庫操作比較簡單,只需要記住三個指令即可:
git clone
git push
git pull
git clone的作用是將別人已經寫好并提交的庫克隆下來,自己更新迭代之后使用git push提交上去,想得到別人更新迭代的內容只需要git pull即可,這里用一張圖來表示執行的順序:

其中pull作用是拉取修改之后的內容。
(2)幾個區別
git clone與git pull區別
git clone和git pull的區別在于“git clone”是在本地沒有版本庫時,將遠程庫整個下載到本地;而“git pull”是在本地有版本庫時,從遠程庫中獲取最新commit數據,并合并到本地。
同時在開發時要盡量保證push的內容沒有版本沖突。如果不想與本地分支合并,可以使用git fetch操作。git pull=git fetch+git merge
git clone與git fetch區別
而git clone和git fetch的區別在于git clone克隆的是整個遠程庫。git fetch克隆的是遠程庫的一個分支。
(3)使用格式
$ git clone <版本庫的url>
$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
#方法一
$ git fetch origin master #從遠程的origin倉庫的master分支下載代碼到本地的origin maste
$ git log -p master.. origin/master #比較本地的倉庫和遠程參考的區別
$ git merge origin/master #把遠程下載下來的代碼合并到本地倉庫,遠程的和本地的合并
# 方法二
$ git fetch origin master:temp #從遠程的origin倉庫的master分支下載到本地并新建一個分支temp
$ git diff temp #比較master分支和temp分支的不同
$ git merge temp #合并temp分支到master分支
$ git branch -d temp #刪除temp

浙公網安備 33010602011771號