1、選擇小烏龜作為git客戶端
最近使用idea來操作git的時候頻頻出現問題,要么是提交代碼的時候少了某些文件,導致克隆下來無法運行,要么是提交速度太慢。
反正是在idea中操作git體驗非常不好,所以決定來換一種方式來操作git。從網上搜索一番之后,決定使用小烏龜來進行操作。
2、軟件
下面是全面使用流程,從git安裝、小烏龜安裝軟件到語言安裝包,這里做一個詳細的配置截圖。
2.1、軟件安裝
這里的軟件安裝包對應的百度網盤鏈接:
鏈接:百度網盤 請輸入提取碼 提取碼:16l0
git安裝:
除了修改一下對應的安裝路徑之外,全程不用做任何操作。永遠下一步,安裝完畢即可。
安裝完畢之后,輸入命令檢查一下是否安裝成功。
git --version
同時在空白區域右擊鼠標,可以看到git gui和git bash等命令。
在git bash窗口中操作等同于操作于Linux。
TortoiseGit安裝:
除了修改一下對應的安裝路徑、配置git的賬號和密碼之外,全程下一步;
在TortoiseGit安裝過程中有一步需要配置一下git的賬號和郵箱,隨便在一個位置打開Git bash ,輸入以下命令:
git config ?user.name
git config user.email ? ?
即可看到對應的賬號和郵箱,配置上即可。
在空白區域右擊,可以看到幾個TortoiseGit標志選項。
漢化包安裝
全程下一步即可。語言包安裝完畢后可以在TortoiseGit的”設置”中調整語言,設置language為中文簡體。
3、Git
Git是分布式版本控制系統,那么它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了文件A,可以將文件A提交到本地版本庫;其他人也在電腦上改了文件A,也可以將文件A提交到自己的本地版本庫,這時,你們倆之間只需把本地版本庫的內容各自的修改推送給對方(使用共享版本庫,例如github、碼云...),就可以互相看到對方的修改了。
3.1、概念
3.2.1、版本庫和工作目錄
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的新增、修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。由于git是分布式版本管理工具,所以git在不需要聯網的情況下也具有完整的版本管理能力。
創建一個版本庫非常簡單,可以使用git bash也可以使用TortoiseGit。首先,選擇一個合適的地方,創建一個空目錄(F:\repository)。
這時候直接使用TortoiseGit來創建
?版本庫創建成功,會在此目錄下創建一個.git的隱藏目錄(叫做版本庫),如下所示:
?
版本庫:這個.git就是版本庫,將來文件都需要保存到版本庫中。
工作目錄(工作區):包含“.git”目錄的目錄,也就是.git目錄的上一級目錄就是工作目錄。只有工作目錄中的文件或者是文件夾才能保存到版本庫中。
3.2、Git的使用步驟
1:創建版本庫
2:添加文件
3:修改文件
4:刪除文件
5:刪除文件并保留副本
6:將java工程提交到版本庫
7:忽略文件(提交版本庫時,可忽略某些文件)
1、創建版本庫
參考著上面的創建過程。
2、添加文件
在F:\repository目錄下創建一個mytest.txt文件
?
?
文本文件變為帶“+”號的圖標,表示該文件被放置到暫存區中:?
3.工作區和暫存區
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
什么是工作區(Working Directory)?
? 工作區就是你在電腦里能看到的目錄,比如我的reporstory/repo1文件夾就是一個工作區。
什么是版本庫?
? 在這個工作區目錄中的“.git”隱藏文件夾是版本庫。
? Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
這里的stage就是暫存區,master代表是主分支。
我們把文件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支(默認是master)。【后期講解提交到分支上】
默認分支master
因為我們創建Git版本庫時,Git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
把暫存區的所有內容提交到當前分支可以簡單理解為,需要提交的文件修改通通放到暫存區,然后,一次性提交暫存區的所有修改
查看版本庫,可點擊“版本庫瀏覽器”
mytest.txt就是在當前版本庫中提交到本地倉庫中的文件。
如果只是添加到了暫存區,那么版本庫瀏覽器是看不到提交了的文件的。
為什么需要暫存區
我們這樣子來進行思考,要開發一個功能需要一周時間,所以每天都需要來做點事情,但是不可能說每天開發完成之后都要將代碼提交到遠程倉庫。如果別人拉取了最新代碼,而且進行了上線,那么將會來造成錯誤。【其實這里來使用分支介紹比較好】
所以需要一個臨時區域存儲的地方來存儲修改的代碼,然后在將代碼修改完成之后,提交到分支上去。這樣的一個流程來說是比較合適的。
4、修改文件
被版本庫管理的文件不可避免的要發生修改,此時只需要直接對文件修改即可。修改完畢后需要將文件的修改提交到版本庫。
對文件進行修改之后,沒有添加文件時候的添加到暫存區,而且會有紅色的感嘆號標識已經修改。
在mytest.txt文件上點擊右鍵,然后選擇“提交”:
查看修改歷史
在開發過程中可能會經常查看代碼的修改歷史,或者叫做修改日志。來查看某個版本是誰修改的,什么時間修改的,修改了哪些內容。
甚至如果修改有誤,用于恢復到歷史版本。
可以在修改的文件上點擊右鍵選擇“顯示日志”來查看文件的修改歷史
比較版本差異
還可以看到兩次信息提交的版本差異,選中兩個文件,右擊:比較版本差異
導出指定版本
可以【導出】指定版本,如果編寫錯誤,用于還原到歷史版本。
導出指定版本之后,是一個文件,也就是對應著指定版本的文件。
還原修改[風險版本和安全版本]
這里分為兩種情況:
①沒有提交到本地倉庫就想還原;【無法還原已經修改的內容,沒有日志顯示】
②提交到本地倉庫之后還原;【安全,日志歷史中有顯示】
當文件修改后不想把修改的內容提交,還想還原到未修改之前的狀態。此時可以使用“還原”功能
注意:此操作會撤銷所有未提交的修改,所以當使用還原操作是需要慎重慎重!!!
但是我想針對的僅僅只是當前的這個文件的提交,不想波及到其他文件。那么還有很好的方式。
利用導出指定版本獲取得到指定版本的文件,進行覆蓋,就可以獲取得到指定版本的信息文件。
這樣子操作還沒有風險!非常方便使用。
通過日志歷史可以查看到對應的變化信息。
5、刪除文件
刪除文件第一種方式
需要刪除無用的文件時可以使用git提供的刪除功能直接將文件從版本庫中刪除。
如果真的想刪除文件,可以選擇【提交】
如果文件版本庫也被刪除,此時本地文件徹底丟失了。
刪除文件第二種方式
刪除文件并保留副本
此時文件刪除,但是本地參考仍然存在,執行【提交】可以刪除版本庫的文件,但是mytest3.txt在本地會保留。
【提交】后,查看倉庫,可以查看本地是存在副本文件。
但是本地還是有這個文件的。
4、將java工程提交到版本庫
這里是為了做一個測試,隨便將一個HelloWorld的項目放到一個目錄下
1、創建版本庫
利用小烏龜右鍵創建版本庫
2、將文件添加到版本庫
點擊【確定】完成暫存區添加。
忽略文件
在此工程中,并不是所有文件都需要保存到版本庫中的例如“out”目錄及目錄下的文件就可以忽略。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下創建一個特殊的.gitignore文件,然后把要忽略的文件名填進去,Git就會自動忽略這些文件。
如果使用TortoiseGit的話可以使用菜單項直接進行忽略。
選擇保留本地文件。完成后在此文件夾內會多出一個.gitignore文件,這個文件就是文件忽略文件,當然也可以手工編輯。其中的內容就是把.idea和out目錄忽略掉。
打開.gitinore文件
3、提交代碼到本地倉庫
將代碼添加到master分支上,其中.gitignore文件也需要添加到暫存區,然后提交到版本庫。
然后通過版本庫瀏覽器來進行觀察,可以看到對應的java工程下的文件夾。
5、以上步驟總結
這里只是大致羅列了上面的信息。具體的可以參考上面的過程。
6、遠程倉庫
遠程倉庫可以是Github,可以是Gitee,也可以是自己公司自己搭建的。
那么必須要來介紹一下現在的遠程倉庫都支持的協議。HTTPS和SSH方式
6.1、HTTP協議
HTTP操作的時候每次提交的時候都需要傳輸賬號密碼校驗。這種比較簡單,就不來進行過多說明。
基于賬號+密碼
6.1.1、使用tortoiseGit同步代碼到遠程倉庫
在遠程倉庫中新建一個倉庫,然后使用https方式同步到遠程倉庫。
因為這里使用的是賬號密碼,所以這里不需要來進行配置。
這時候推送需要輸入“用戶名”和“密碼”,對應注冊遠程倉庫的賬號和密碼。但是一般來說,在控制面板中會來記錄一下對應的賬號密碼:
然后查看對應的倉庫中,是否有對應的代碼操作。
6.2、SSH協議
SSH 為 Secure Shell(安全外殼協議)的縮寫,由 IETF 的網絡小組(Network Working Group)所制定。SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。
使用ssh協議通信時,推薦使用基于密鑰的驗證方式。你必須為自己創建一對密匙(第1步),并把公用密匙放在需要訪問的服務器上(第2步)。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之后,先在該服務器上你的主目錄下尋找你的公用密匙,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)并把它發送給客戶端軟件。客戶端軟件收到“質詢”之后就可以用你的私人密匙解密再把它發送給服務器。
來畫個圖具體說明一下這里的流程:
從上面可以看到,是基于公鑰私鑰的,而沒有基于賬號密碼。
6.2.1、SSH秘鑰生成
在windows下我們可以使用 Git Bash.exe來生成密鑰,可以通過開始菜單或者右鍵菜單打開Git Bash
?
git bash 執行命令,生命公鑰和私鑰
命令: ssh-keygen -t rsa -C ‘郵箱’
其中’郵箱’為注冊github的登錄賬號的郵箱(也可使用github注冊的賬號)
當你創建ssh的時候:-t 表示密鑰的類型 ,-b表示密鑰的長度,-C 用于識別這個密鑰的注釋 ,這個注釋你可以輸入任何內容,很多網站和軟件用這個注釋作為密鑰的名字
一路回車
執行命令完成后,在window本地用戶.ssh目錄C:\Users\用戶名.ssh下面生成如下名稱的公鑰和私鑰:
?
6.2.2、秘鑰設置
密鑰生成后需要在遠程倉庫上配置公鑰才可以順利訪問。公鑰也就是id_rsa.pub文件中的內容設置進去。
6.2.3、使用ssh協議同步到遠程倉庫
同步到遠程倉庫可以使用git bash也可以使用tortoiseGit
6.2.3.1、使用tortoiseGit同步本地代碼到遠程倉庫
由于TortoiseGit使用的ssh工具是“PuTTY”,git Bash使用的ssh工具是“openSSH”,如果想讓TortoiseGit也使用剛才生成的密鑰可以做如下配置:
右鍵,選擇“git 同步”
點擊管理:
注意】:首先保證:ssh客戶端需配置成git使用的客戶端
也就是git的安裝目錄中的usr/bin下面的ssh.exe文件配置。
這里只是配置了工具連接遠程倉庫的方式,而并沒有指定遠程倉庫的地址。所以還需要來進行修改。
說明:
origin:可以隨便寫的
Url:遠程倉庫的地址
推送URL:也是相同的(可以不填寫)
Putty密鑰:選擇剛才生成的密鑰中的私鑰
私鑰可以直接選擇對應的文件進來即可。
推送】:即push指令
查看遠程倉庫,即可看到最新的代碼。
7、從遠程倉庫獲取克隆代碼
克隆遠程倉庫也就是從遠程把倉庫復制一份到本地,克隆后會創建一個新的本地倉庫。選擇一個任意部署倉庫的目錄,然后克隆遠程倉庫。使用遠程倉庫的mytest3為例,使用https協議克隆。
在任意目錄點擊右鍵:
查看:F/repository/clone_repo目錄
?
8、從遠程倉庫獲取拉取代碼
Git中從遠程的分支獲取最新的版本到本地有這樣2個命令:
1. git fetch:相當于是從遠程獲取最新版本到本地,不會自動merge(合并代碼)
?
2. git pull:相當于是從遠程獲取最新版本并merge到本地,上述命令其實相當于git fetch 和 git merge
在實際使用中,git fetch更安全一些,但是不常用!因為在merge前,我們可以查看更新情況,然后再決定是否合并。
git pull更常用,因為即得代碼又可以自動合并
如果使用TortoiseGit的話可以從右鍵菜單中點擊“拉取”(pull)或者“獲取”(fetch)
8.1、版本沖突
這個是在提交代碼中經常遇到的事情。因為不同的開發人員再對同一個文件來進行操作之后,最終git也無法判斷到底使用哪個開發者提交的代碼來解決問題。所以交給開發者們自己來進行決定選擇哪個作為最終版本。
版本沖突是怎么產生的?分析一波:
開發者A需要在F文件做一些修改,開發者B也需要在F文件中做一些修改。
開發者A先提交,那么沒有任何問題;開發者B后提交,那么就有了問題。因為上一個版本中,開發者A\B的代碼是一樣的,但是對于開發者A來說,他只不過是在上一個版本中做了一個修改成為了一個新版本;而對于開發者B來說,也成了一個新版本,而不是在開發者A的基礎之上衍生的新版本。所以導致了沖突。
沖突也很好解決,到底是采用你的?采用我的?還是二者都采用?取決于開發者。
演示一下具體的案例:
這個時候,出現版本沖突,先拉取(pull)遠程倉庫的代碼到本地。
編輯沖突:
合并成一個新的文件。如上所示,將會合并成一個新文件。
這里的新文件,我們可以自行來進行修改即可!!!!
修改完成然后提交本地倉庫,再次提交到遠程倉庫中去。
9、分支介紹
在我們每次的提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD指針嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。
如圖:只要有本地倉庫就有master分支:
一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
那么也就是說,只要來操作分支,就可以知道當前分支的提交點在哪里。
切換分支,實際上就是切換HEAD的指向,指向當前分支最新的提交。
每次提交,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分支
9.1、使用TortoiseGit實現分支管理
使用TortoiseGit管理分支就很簡單。
1、創建分支
在本地倉庫文件夾中點擊右鍵,然后從菜單中選擇“創建分支”:
?
如果想創建完畢后直接切換到新分支可以勾選“切換到新分支”選項或者從菜單中選擇“切換/檢出”來切換分支:
右鍵查看,再提交,指向新的分支。?
?
2、合并分支
分支切換到dev后就可以對工作區的文件進行修改,然后提交到dev分支,原來的master分支不受影響。例如我們修改mytest.txt中的內容,然后提交到dev分支。
注意:兩個分支在進行生成之后就是彼此獨立的。
切換到dev分支上,修改文件,同時提交到dev的分支上
?
切換到master分支,我們在修改mytest.txt,同時新建master.txt文件,并同時提交,發現沒有報錯信息。
不難發現,我們切換到master分支/dev分支后還是原來的內容:2個分支的開發互不影響,相互獨立的。
最后,我們將dev分支的內容合并到master分支,當前分支為master。從右鍵菜單中選擇“合并”:
再查看mytest.txt、dev.txt、master.txt的內容就已經更新了:?
總結?