git 徹底講解 無廢話,包含在myeclipse中使用,包括解決衝突

Git

1. Git簡介

1.1 git是什麼

1.1.1概念

Git:git是一款開源的分佈式的版本控制軟件html

Github:是一個基於git的面向開源及私有軟件項目的託管平臺java

因僅支持git 做爲惟一的版本庫格式進行託管 故名gihubmysql

1.1.2.Git的特色

①Git從服務器上克隆完整的項目到本機,至關於每個開發者都擁有一個項目的完整版本git

②開發者在本身的機器上建立分支,修改代碼.github

③將本身本地建立的分支提交到本地的版本庫sql

④在單機上合併分支數據庫

⑤新建一個分支,把服務器上的最新版的代碼fetch下來,而後跟本身的主分支合併vim

⑥Git最大的亮點在於分支的管理.緩存

 

 

 

 

 

 

 

 

 

 

 

 

1.2     什麼是版本控制

版本控制概念:

這種方法是工程圖(engineering drawings)維護(maintenance)的標準作法, 它伴隨着工程圖從圖的誕生一直到圖的定型。 一種簡單的版本控制形式,例如,賦給圖的第一版一個版本等級「A」。當作了第一次改變後,版本等級改成「B」,以此類推等等.bash

1.2.1未引入版本控制的問題:

 

現實開發中最麻煩的是多人開發中的版本控制,若是未引入版本控制的概念,咱們服務器上僅存在一個咱們從最初開始開發的項目,咱們每一次的增刪改也是在這個項目之上,因此若是某一個開發者提交了帶有bug的代碼,或者對這個已經存在的項目進行更新操做,若是更新失敗,則這個項目就廢棄了

一個項目若是有多我的開發,開發人員A,B,C,分別對項目中的同一代碼進行了修改,那後一次提交的人的代碼,就會覆蓋前一我的的代碼

 

 

 

 
 
 
 
 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.2.2傳統的集中式版本控制

集中式版本控制系統(Centralized Version Control Systems,簡稱 CVCS),版本庫是集中存放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此要先從中央服務器取得最新的版本,而後開始幹活,幹完活了,再把本身的活推送給中央服務器      

這麼作最顯而易見的缺點是中央服務器的單點故障。若是維修一小時,那麼在這一小時內,誰都沒法提交更新,也就沒法協同工做。若是中心數據庫所在的磁盤發生損壞,又沒有作恰當備份,毫無疑問你將丟失全部數據——包括項目的整個變動歷史.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.2.3使用分佈式版本控制系統

分佈式,當咱們鏈接共享版本庫時,能夠先將服務器上的項目,克隆到本地,至關於每一臺電腦上都有整個項目的文件備份,在沒有網時也能夠開發,完成開發後,能夠先提交到本地倉庫,當有網的時候,再提交到共享版本庫,這樣一來,若是咱們的服務器或者咱們本身的電腦出故障,咱們也沒有任何擔憂

 

 

 

 

 

 

 

 

1.3Git的安裝

①下載軟件https://git-scm.com/官網地址

②進行安裝

最重要的一步,其它能夠直接走默認

選擇這一步能夠直接將咱們的git命令,添加到系統變量中

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. git入門

 

工做區,暫存區,主分支的概念

 

 

獲取幫助

git help

若是向對某個具體的命令獲取幫助,可使用 git help <verb>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.1設置開發者的我的信息

多人開發的項目中,經過設置的用戶名來區分開發者,設置email來聯繫開發者

 

2.1.1配置當前項目中的用戶信息(局部)

先建立一個本地版本庫

在配置當前項目的用戶信息時,須要進入git管理的項目中來進行設置

1.配置用戶名:Git config user.name 「用戶名」 用來區分誰開發的代碼

2.配置郵箱信息:git config uer.eamil 「郵箱」 多是多個國家的開發者,便於聯繫開發者

 

 

配置之後會能夠在隱藏的.git文件夾的config文件中查看到,

也可使用git config –list進行查看

 

 

2.2.2配置全局用戶信息

1.配置用戶名:git - -global config user.name 「用戶名」 用來區分誰開發的代碼

2.配置郵箱信息:git - -global config uer.eamil 「郵箱」 多是多個國家的開發者,便於聯繫開發者

 

 

 

 

能夠在C:\Users\Administrator\.gitconfig中查看

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2建立倉庫

①建立文件夾E:\Mygit

②初始化倉庫:

進入咱們建立的文件夾 cd e:\Mygit ,使用命令 git init進行初始化倉庫

 

 

這時候會在當前文件夾下建立一個.git隱藏文件夾,.git文件夾是咱們的倉庫信息,必定不要修改

③對倉庫信息進行配置,主要是設置user.name和user.email,若是設置了全局的用戶信息,能夠忽略

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.3添加文件

在倉庫中添加一個hello.java的文件

①   查詢倉庫的狀態:git status

 

 

②   將文件加入到暫存區:git add 文件名

 

 

使用git status 再次查詢出文件的狀態

 

 

如今的文件並無真正的提交到主分支上(主分支就是咱們真正要運行的程序的全部代碼).

③ 提交到本地版本庫:git commit –m」註釋信息」

git commit -m"建立一個java文件"

此時文件就被提交到了主分支上

查詢指定文件的日誌記錄:git log 文件名 若是出現end 使用q退出

 

 

74d914fdda87ba20f52b907413fb7eb3a29973de是咱們的版本號

總結:

         每一次修改或者建立新文件時,都須要先使用    git add 文件名       的命令來將文件添加到緩存區,再使用git commit –m 「註釋信息」 來將咱們的文件添加到版本庫

         或者使用簡化命令 git commit –a –m」註釋信息」 來將咱們的文件添加到版本庫

2.4修改文件

Git 如何管理修改的文件

①   將咱們以前建立的Hello.java文件進行修改

        查詢當前倉庫狀態 git status

 

 

 

以上看到git的一個建議

(use "git add <file>..." to update what will be committed)

 (use "git checkout -- <file>..." to discard changes in working directory)

咱們能夠選擇git add進行添加到緩存,或者咱們可使用git checkout進行恢復

使用 git diff HEAD Hello.java能夠查看咱們對文件具體作了哪些修改

 

 

②   使用git add 文件名,將文件加入到緩存

③   使用git commit –m」註釋信息」 提交到本地版本庫

若是進行了vim編輯器,首先Esc退出輸入狀態,而後Shift+;,再輸入q!或wq!(不保存改動,wq!是保存文件的寫入修改)退出

 

 

 

2.5.Git工做區與緩存區

工做區:包含.git文件夾的文件夾(除了.git文件夾)

倉庫:也稱爲版本庫,這個不算工做區

暫存區:.git版本庫中有不少東西,包括重要要的稱爲stage 的暫存區,還有git爲用戶

自動建立的主程序分支master,以及指向master的HEAD指針,HEAD指針永遠指向咱們當前項目的最高版本

 
 
 
 
 
 
 
 
 
 
 
 
 

 


 

 

 

這個就像咱們以前學習的mysql數據庫中的事務同樣,使用insert 增長了,可是沒有使用commit是不會成功的

當使用commit後,會清空暫存區的內容

 

 

 

 

 

 

 

 

 

2.6 版本回退

咱們每次提交代碼後,都會生成一個40位的哈希值, 能夠成爲commit id

使用git log來查看咱們的提交記錄

可使用git show +版本號來查看修改 此版本號的修改內容

2.6.1恢復到上一版本

使用git reset - - hard HAED~1 或使用git reset - - hard HEAD^

2.6.2恢復到指定版本

①查詢當前的日誌信息 git reflog

Git log 和git reflog的區別:

git log只會查詢歷史有效版本的版本號

git reflog 會查詢歷史全部版本的版本號,包括已經廢棄的

②找到想要恢復的版本號 使用 git reset –hard 版本號,進行恢復到指定版本

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.7撤銷修改

2.7.1 未執行 git add 添加到緩存區時

可使用 gid checkout  - -  Hello.java 與本地倉庫中進行對比,同步

切記用於恢復文件時,文件名前面有--

2.7.2 已經執行git add 添加到了暫存區,可是沒有執行git commit

可使用 git reset HEAD Hello.java 將暫存區的內容恢復到了工做區

若是文件有錯誤,想恢復到上一次提交,還能夠直接使用gid checkout  - -  Hello.java進行恢復

2.8刪除文件

①.從磁盤上刪除文件

 

 

仍是可使用git恢復的命令進行恢復

若是使用

刪除文件,git rm <filename>

刪除文件夾,git rm –r <文件夾名>

同時時候git commit時本地倉庫中的文才會刪除

 

3 Git和github

3.1註冊帳號

3.2生成SSH Key

使用git bash生成

Ssh-keygen –t rsa –c 429189785@qq.com

會生成兩個文件

id_rsa –私鑰

id_rsa.pub ---公鑰

在github 的setting中選擇SSH Keys 進行添加

將公鑰的內容,粘貼進去

3.3添加遠程倉庫

①將本地已有倉庫與遠程倉庫相關聯

使用命令 git remote add origin https://github.com/zhaoqinrong/admin.git

Git remote add origin+遠程倉庫地址

 

 

 

可是目前爲止,遠程倉庫中沒有咱們本地倉庫的內容

 

②將本地全部內容,提交到遠程倉庫

使用命令git push –u origin master

會提示輸入github的用戶名和密碼

 

 

因爲是第一次推送,並且推送的爲master分支,就會使用」-u」的參數將遠程master與本地master進行關聯

④   修改本地文件後,提交到本地版本庫add 和commit命令

⑤   推送到遠程倉庫 git push

3.3 克隆倉庫

將遠程版本庫克隆到本地

①   ,在github上創建倉庫,並進行初始化

 

 

勾選Initialize this repository with a README初始化這個倉庫

②   克隆遠程倉庫

點擊Clone or download,將倉庫的地址複製下來

 

 

使用git clone +遠程倉庫地址,對遠程倉庫進行克隆

 

 

這樣就克隆下來了

 

 

 

 

③   在咱們克隆的倉庫中進行項目的開發,這裏咱們新建一個hello.java的文件 並使用add和commit命令進行本地版本庫的提交

④   使用git push –u origin master 進行推送 Master爲分支名

3.4克隆其餘開源項目

 

①   找到須要克隆的開源項目的地址,而後fork到本身的遠程倉庫

 

②   複製本身倉庫中這個項目的地址

 

 

 

③   使用 命令

Git clone +遠程倉庫地址 進行克隆

 

 

 

3.5如何從遠程倉庫中獲取更新

①遠程倉庫與本地倉庫進行關聯

要向從遠程倉庫中獲取更新,必須先將本地倉庫與遠程倉庫進行關聯,可使用

git remote add origin https://github.com/zhaoqinrong/Mygit

可使用命令git remote rm origin刪除關聯的遠程倉庫

使用git remote show origin來查看ms遠程倉庫的具體分支

使用git remote –v 來查看與當前本地倉庫相關聯的遠程倉庫

origin爲咱們爲遠程倉庫起的別名

③   使用git pull origin master進行獲取併合併到本地倉庫

 

 

若是直接使用git pull能夠會出錯,建議先git fetch到本地,而後使用git merge 合併

3.6 如何向遠程倉庫推送更新

咱們編寫項目後,須要將咱們的項目推送到遠程倉庫

可使用git push <url> <本地分支名>

①   遠程倉庫與本地倉庫進行關聯

②   推送更新

 

 

建議咱們推送更新前都先使用pull獲取遠程倉庫中的更新,而後在push推送

Ms 是咱們遠程倉庫的一個別名,咱們自定義

可使用git push ms master:mygit-1

將本地的master分支推送到ms遠程倉庫的mygit-1分支中

 

 

 

3.7刪除遠程倉庫中的文件

①先要將本地倉庫和遠程倉庫進行關聯

 

 

進入到咱們的git命令行頁面後,先將遠程代碼pull到本地,保持本地倉庫跟遠端倉庫同步。

 

 

④   使用git rm 文件名 刪除 文件

 

 

⑤   ,進行提交(和數據庫事務同樣,提交後纔會處理)

 

 

⑥   向遠程倉庫進行推送

 

 

 

 

 

4分支管理

Master 主分支,主要做爲程序的發佈

因此不能在master上進行開發,因此應該創建子分支進行開發

 

 

 

4.1 HEAD指針和Master指針

①在沒有分支的狀況下,Master指針永遠指向當前的最高版本

而head指針指向master

 

 

 

 

 

 

 

 

 

 

 

②   建立了新分支,HEAD指向了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

③   主分支和子分支進行合併

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.2分支建立

①建立分支:

使用命令 git branch + 分支名

使用git  branch 查看當前項目的分支

 

 

⑦    切換分支 使用命令 git checkout +分支名

 

 

⑧    使用命令git checkout +分支名 切換到主分支,而後刪除分支 使用命令 git branch –d +分支名

注意:要刪除分支,必需要先切換到主分支

 

可使用   git checkout –b +分支名    建立並切換分支

 

 

 

分支上的文件是相互獨立的,修改文件不會影響

 

 

模擬:創建兩個分支,並分別進行推送

先鏈接遠程倉庫 git remote set-url origin  https://github.com/zhaoqinrong/mygithub.git

而後分別推送分支 git push origin master    git push origin brh

推送成功後能夠在咱們github上進行查看

 

4.3合併分支

①切換回主分支git checkout master

②   合併分支git merge brh(子分支名)

 

 

③,刪除子分支  git branch -d brh

③   推送到遠程倉庫 git push origin master

 

 

 

如今在本地沒有brh的子分支,可是遠程倉庫中的子分支還在

④刪除遠程子分支git push origin –delete brh(子分支名稱)

 

 

 

4.4 刪除分支

刪除本地分支:git branch –d <branch-name>

刪除遠程分支: git push origin –delete <branchName>

 

4.4 解決代碼衝突

git fetch origin master

git merge origin/master

 

代碼衝突如何產生的:

當咱們在分支上進行開發的時候,不免遇到別的開發人員和咱們本身向倉庫中提交相同的代碼

好比咱們有一個商城的項目,開發人員A和開發人員B都對同一段代碼作了修改,當A進行提交後並push到遠程倉庫中master合併,B再進行提交併與遠程倉庫中的master進行合併

這時候就會出現代碼衝突

 

 

 

如今咱們來模擬一下代碼衝突,並試圖解決

①   在E盤新建文件夾 GitConflict,並初始化倉庫git init

 

 

②   在工做區建立名爲Conflict.txt的文件,並寫上hello git

 

 

③   把文件提交到本地倉庫

 

 

 

④   建立新分支,名爲Conflict並切換

 

 

⑤   在conflict分支下對Conflict.txt文件進行修改

 

 

⑥   而後在conflict分支下進行提交

 

 

⑦,切換到主分支

 

 

⑧   再次對文件進行修改

 

 

⑨    提交修改後的文件

 

 

⑩   和分支conflict進行合併

 

 

文件報錯,有衝突

而後咱們能夠打開倉庫中的Conflict.txt文件進行查看

 

 

中間內容表示有衝突的地方,咱們能夠選擇保留一條信息,進行合併,假如咱們保留一下數據

 

 

再次提交併合併

 

 

OK了

5.使用tag

 

發佈一個版本時,咱們一般先在版本庫中打一個標籤(tag),這樣,就惟一肯定了打標籤時刻的版本。未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,標籤也是版本庫的一個快照。

         打標籤命令:git tag <tagname>

在以往歷史中的提交id上打標籤

使用 :git tag <tagname> <commitid>

刪除標籤 git tag -d<tagname>

 5 eclipse中使用git

 

5.1用eclipse將項目保存到github中

1首先註冊github

2.使用eclipse生成一個SSHkey

 

 

3.在github上對進行添加

 

 

 

4.在github上建立一個新的倉庫,並對倉庫進行初始化

 

 

 

5.將咱們的項目發佈到剛剛建立的倉庫中

 

 

 

 

 

由於咱們這裏是新項目,因此選擇建立一個repository

 

 

 

表示咱們的項目尚未指針

 

 

將項目提交到本地倉庫

 

 

 

 

 

寫上註釋,選上全部文件進行commit and push

 

 

 

 

 

 

選擇master分支

 

 

 

正在推送

 

 

 

成功

 

這是咱們成功發佈的項目,提交給github託管,當咱們須要對項目進行修改的時候

5.2咱們能夠將項目從github上導入到本地

 

打開MyEclipseàfileàimport

 

 

 

 

 

 

 

 

 

 

 

 

 

正在導入

 

 

 

導入完成,而後咱們在這個項目上進行開發,不會影響到咱們倉庫中的項目的完整性

目前是master分支,咱們須要新建分支進行咱們的開發

 

 

 

 

 

 

 

 

新建分支後,自動切換分支

 

 

5.3在分支上進行開發,並git到github分支上

1.如今咱們已經切換到了上一節建立的分支上,如今咱們在咱們以前的項目上作一點修改

 

 

 

 

這是我在MyJindong分支上對項目進行的一個修改,新增了一個aaaaa.html的文件

2.先將咱們修改的項目git到本地的倉庫進行一次commit

 

 

 

 

2. 將更新推送到遠程倉庫,並自動建立分支

 

 

 

這是檢查本地和遠程倉庫的差別:

 

檢查出本地和遠程倉庫有差別,能夠進行,而後在倉庫中建立新分支,將咱們的修改後的項目git到遠程倉庫

 

 

 

 

 

3.這是咱們的新分支和master分支,這就成功的,將新分支git到了遠程倉庫

 

 

 

 

5.4將咱們分支開發的項目和master分支的進行合併

咱們初版的項目有bug,咱們在新分支上進行修改,將修改後的項目與咱們的以前的項目進行合併

  1. 首先咱們要肯定咱們要與哪一個分支合併,而後將咱們的項目切換到哪一個分支下,而後使用Merge進行合併

咱們這裏要與主分支合併,首先切換到主分支,看主分支是否有更新,而後咱們合併到本地項目

 

 

 

 

 

選擇咱們修改的項目進行本地合併

 

 

 

合併後的結果

  1. 而後選擇push to upstream進行檢查,是否有更新須要上傳到咱們的遠程服務器

 

 

 

 

 

 

 

 

 

這是合併到遠程倉庫的結果.成功

 

 

 

 

 

5.5刪除本地分支和遠程分支

 

 

 

 

選擇之後點擊OK便可

 

5.6版本回退

 

 

 

 

 

 

 

 

 

 

 

即可以進行版本的回退

 

 

5.7 使用eclipse解決代碼的衝突

模擬

①從遠程倉庫中導入一個項目到咱們的eclipe中

導入過程不過講解

 

 

這是咱們導入的項目,並進行本地版本庫的提交

②建立新分支

 

並對項目內容進行修改.而後提交到本地版本庫

 

 

 

 

④   切換到主分支master,對項目進行修改,並提交本地版本庫

 

 

 

⑤   ,與conflict分支進行合併

便出現了咱們期待的結果

 

 

⑥   查看衝突的代碼

 

 

 

 

標紅的文件表明有衝突

⑦   查看衝突的代碼

 

 

 

 

 

雙擊

 

 

 

紅色框起來的代碼就是有衝突的代碼,再手動進行修改

 

假設咱們如今修改左側的代碼爲

 

 

 

 

再次提交,而後合併查看效果

 

注意:若是git pull失敗,則須要添加參數

[remote "origin"]

         url = https://github.com/zhaoqinrong/test.git

         fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]

     remote = origin

     merge = refs/heads/master

 

相關文章
相關標籤/搜索