微信搜索"藝術行者",關注並回復關鍵詞"git"獲取Github安裝包
上傳的在線學習視頻(黑馬和傳智雙元,感謝)
微信搜索"藝術行者",關注並回復關鍵詞"gitstudy"獲取課程資料
Git介紹
GIt是分布式版本控制系統,它是沒有中央服務器的,每個人的電腦就是一個完整的版本庫,因此工作時不需要聯網。既然每個人的電腦都有一個完整的版本庫,那么多個人如何協作?比如說自己在電腦上修改了A文件,另一個人也修改了A文件,這個時候,只需要把各自的修改推送給對方,就可以互相看到對方的修改了。
下圖就是分布式版本控制工具管理方式:
Git工作流程
一般工作流程:
1.從遠程倉庫中克隆Git 資源作為本地倉庫。
2.從本地倉庫中checkout代碼然后進行代碼修改
3.在提交前先將代碼提交到暫存區。
4.提交修改。提交到本地倉庫。本地倉庫中保存修改的各個歷史版本。
5.在修改完成后,需要和團隊成員共享代碼時,可以將代碼push到遠程倉庫。
Git安裝
安裝Git for MacOS
可以到下載地址下載
也可以直接在命令行輸入“brew install git”即可下載
安裝GitHub Desktop
下載安裝包安裝即可
使用git管理文件版本
創建版本庫
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。由於git是分布式版本管理工具,所以git在不需要聯網的情況下也具有完整的版本管理能力。
MacOS查看隱藏文件快捷鍵commend+shift+.
1. 使用命令行
進入創建好的目錄 /Git/repositories/rep1/
打開終端,輸入 "git init"
版本庫創建成功,會在此目錄下創建一個.git的隱藏目錄,如下所示:
2. 使用圖形化界面
版本庫創建成功,會在此目錄下創建一個.git的隱藏目錄,如下所示:
版本庫:“.git”目錄就是版本庫,將來文件都需要保存到版本庫中。
工作目錄:包含“.git”目錄的目錄,也就是.git目錄的上一級目錄就是工作目錄。只有工作目錄中的文件才能保存到版本庫中。
添加文件
添加文件過程
在/Git/repositories/repo1/目錄下創建一個mytest.txt文件
打開Github Desktop可以查看修改了什么,之后填寫日志更新信息,選擇是否提交
Git有暫存區的概念。什么是工作區(Working Directory)?工作區就是你在電腦里能看到的目錄,比如我的reporstory文件夾就是一個工作區,在這個目錄中的“.git”隱藏文件夾是版本庫。Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。如下圖所示:
(注:這里使用的是windows的小烏龜,在這里提及只是豐富一下Git的知識)前面講了我們把文件往Git版本庫里添加的時候,是分兩步執行的:第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。因為我們創建Git版本庫時,Git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。你可以簡單理解為,需要提交的文件修改通通放到暫存區,然后,一次性提交暫存區的所有修改。
修改文件
提交修改
被版本庫管理的文件不可避免的要發生修改,此時只需要直接對文件修改即可。修改完畢后需要將文件的修改提交到版本庫。
打開Github Desktop可以查看修改了什么,之后填寫日志更新信息,選擇是否提交。
查看修改歷史和差異比較
在開發過程中可能會經常查看代碼的修改歷史,或者叫做修改日志。來查看某個版本是誰修改的,什么時間修改的,修改了哪些內容。
還原修改
當文件修改后不想把修改的內容提交,還想還原到未修改之前的狀態。此時可以使用“還原”功能
刪除文件
直接進入目錄將文件刪除,之后commit
案例:將java工程提交到版本庫
第一步:將Java工程復制到工作目錄中
第二步:忽略文件或文件夾
在此工程中,並不是所有文件都需要保存到版本庫中的例如“bin”目錄及目錄下的文件就可以忽略。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下創建一個特殊的.gitignore文件,然后把要忽略的文件名填進去,Git就會自動忽略這些文件。
(本應該是15個文件,忽略之后便為5個)
第三步:將Java工程commit
忽略文件語法規范
可以在后面添加正斜杠/ 來忽略文件夾,例如build/ 即忽略build文件夾。
可以使用! 來否定忽略,即比如在前面用了.apk ,然后使用!a.apk ,則這個a.apk不會被忽略。
用來匹配零個或多個字符,如*.[oa] 忽略所有以".o"或".a"結尾。
*~ 忽略所有以~ 結尾的文件(這種文件通常被許多編輯器標記為臨時文件)。
[] 用來匹配括號內的任一字符,如[abc] ,也可以在括號內加連接符,如[0-9] 匹配0至9的數。
遠程倉庫
添加遠程倉庫
我們在本地已經創建了一個Git倉庫,又想讓其他人來協作開發,此時就可以把本地倉庫同步到遠程倉庫,同時還增加了本地倉庫的一個備份。常用的遠程倉庫就是github:https://github.com/,接下來我們演示如何將本地代碼同步到github。
在github上創建倉庫
首先你得在github上創建一個賬號,這個就不演示了。然后在github上創建一個倉庫:
點擊“create repository”按鈕倉庫就創建成功了。Github支持兩種同步方式“https”和“ssh”。如果使用https很簡單基本不需要配置就可以使用,但是每次提交代碼和下載代碼時都需要輸入用戶名和密碼。如果使用ssh方式就需要客戶端先生成一個密鑰對,即一個公鑰一個私鑰。然后還需要把公鑰放到githib的服務器上。這兩種方式在實際開發中都用應用,所以我們都需要掌握。接下來我們先看ssh方式。
ssh協議
SSH 為Secure Shell(安全外殼協議)的縮寫,由IETF 的網絡小組(Network Working Group)所制定。SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用SSH 協議可以有效防止遠程管理過程中的信息泄露問題。
使用ssh協議通信時,推薦使用基於密鑰的驗證方式。你必須為自己創建一對密匙,並把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之后,先在該服務器上你的主目錄下尋找你的公用密匙,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)並把它發送給客戶端軟件。客戶端軟件收到“質詢”之后就可以用你的私人密匙解密再把它發送給服務器。
ssh密鑰生成
打開終端,輸入命令“ssh-keygen -t rsa”,之后指定保存位置
在GitHub網頁打開設置
在key部分將id_rsa.pub文件內容添加進去,然后點擊“Add SSH key”按鈕完成配置。
然后打開終端輸入"ssh-add 你存放鑰匙的目錄/.ssh/id_rsa"
然后再輸入命令進行驗證"ssh -T git@github.com"
同步到遠程倉庫
同步到遠程倉庫可以使用命令行或圖形化界面
使用命令行(這里使用SSH協議進行演示)
最開始可能遇到這個情況
解決方法:
- 輸入命令“ssh -v git@github.com”:測試ssh連接是否成功
- ssh-agent -s
- ssh-add ~/.ssh/id_rsa (注:此處就是你存放私鑰的地方)
- ssh -T git@github.com :測試是否成功
所以建議先把私鑰添加進去
添加私鑰
- 輸入命令“ssh -v git@github.com”:測試ssh連接是否成功
- ssh-agent -s
- ssh-add ~/.ssh/id_rsa (注:此處就是你存放私鑰的地方)
- ssh -T git@github.com :測試是否成功
在倉庫所在的目錄打開終端,首先確保你的本地倉庫已經初始化了,輸入命令"git init"
將你的工程添加的暫存區,使用命令"git add HelloProjet README.md"
使用命令“git commit -m "第幾次提交"”書寫提交日志
輸入"git remote add origin git@github.com:你的用戶名/mytest.git
如果romote origin已經存在,使用命令"git remote rm origin"移除
git push -u origin master"
使用GitHub Desktop同步
選擇倉庫,選擇分支,同步到Github
從遠程倉庫克隆
克隆遠程倉庫也就是從遠程把倉庫復制一份到本地,克隆后會創建一個新的本地倉庫。選擇一個任意部署倉庫的目錄,然后克隆遠程倉庫。
命令行
$ git clone git@github.com:userName/repositoryName.git
圖形化界面
選擇倉庫
選擇add->clone repository
這時因為登陸了賬號,既可以直接選擇你的倉庫克隆下來,也可以通過URL克隆自己的倉庫或其他人的倉庫
通過URL克隆倉庫,需要知道要克隆的倉庫的URL,之后填入到輸入框即可,點擊clone
從遠程倉庫取代碼
命令行
Git中從遠程的分支獲取最新的版本到本地有這樣2個命令:
- git fetch:相當於是從遠程獲取最新版本到本地,不會自動merge(合並代碼)
- git pull:相當於是從遠程獲取最新版本並merge到本地上述命令其實相當於git fetch 和git merge
- 在實際使用中,git fetch更安全一些因為在merge前,我們可以查看更新情況,然后再決定是否合並
圖形化界面
push:推送到Github
pull:下拉Github代碼到本地倉庫
注意推送下拉欄,更新了代碼,點擊推送下拉,即可下來新的代碼,推送本地更新的代碼也可以
搭建私有Git服務器
服務器搭建
遠程倉庫實際上和本地倉庫沒啥不同,純粹為了7x24小時開機並交換大家的修改。GitHub就是一個免費托管開源代碼的遠程倉庫。但是對於某些視源代碼如生命的商業公司來說,既不想公開源代碼,又舍不得給GitHub交保護費,那就只能自己搭建一台Git服務器作為私有倉庫使用。
搭建Git服務器需要准備一台運行Linux的機器,在此我們使用CentOS。以下為安裝步驟:
1、安裝git服務環境准備yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc
yum -y install autoconf
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
2、下載git-2.5.0.tar.gz
1)解壓縮 tar -zxvf git-2.5.0.tar.gz
2)cd git-2.5.0
3)autoconf
4)./configure
5)make
6)make install
3、添加用戶adduser -r -c 'git version control' -d /home/git -m git此命令執行后會創建/home/git目錄作為git用戶的主目錄。
4、設置密碼passwd git
輸入兩次密碼
5、切換到git用戶su git
6、創建git倉庫git --bare init /home/git/first
注意:如果不使用“--bare”參數,初始化倉庫后,提交master分支時報錯。這是由於git默認拒絕了push操作,需要.git/config添加如下代碼:
[receive]
denyCurrentBranch = ignore
推薦使用:git --bare init初始化倉庫。
連接服務器
私有git服務器搭建完成后就可以向連接github一樣連接使用了,但是我們的git服務器並沒有配置密鑰登錄,所以每次連接時需要輸入密碼。先到本地倉庫,之后使用命令連接:
$ git remote add origin ssh://git@xxx.xxx.xxx.xxx/home/git/first
xxx.xxx.xxx.xxx:是Git服務器的IP地址
上傳文件到服務器
命令行
$ git add 你的工程
$ git commit -m "日志信息"
$ git push -u origin master
克隆代碼到本地倉庫
命令行
創建一個文件夾:mkdir 名字
進入創建好的目錄:cd 名字
$ git init
$ git remote add origin ssh://git@xxx.xxx.xxx.xxx/home/git/first
$ git clone ssh://git@xxx.xxx.xxx.xxx/home/git/first
分支管理
創建合並分支
在我們每次的提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD指針嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。一開始的時候,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分支:
使用Github Desktop實現分支管理
創建分支
之后
之后
之后
之后
合並分支
分支切換到dev后就可以對工作區的文件進行修改,然后提交到dev分支,原來的master分支不受影響。例如我們修改工程中的內容,然后提交到dev分支。
網頁
客戶端
此處存在起始和目的地,確定要合並到哪個分支
解決沖突
兩個分支中編輯的內容都是相互獨立互不干擾的,那么如果在兩個分支中都對同一個文件進行編輯,然后再合並,就有可能會出現沖突。
同步到Github
同步到Github,之后合並
此時報錯,出現版本沖突,下圖是修改內容的對比
手動處理后
之后push到Github,內容已經合並
在IntelliJ IDEA中使用git
在Idea中配置git
安裝好IntelliJ IDEA后,如果Git安裝在默認路徑下,那么idea會自動找到git的位置,如果更改了Git的安裝位置則需要手動配置下Git的路徑。
選擇File→Settings打開設置窗口,找到Version Control下的git選項:
選擇git的安裝目錄后可以點擊“Test”按鈕測試是否正確配置。
將工程添加至Git
在idea中創建一個工程,例如創建一個java工程,名稱為idea-git-test,如下圖所示:
創建本地倉庫,在菜單中選擇“vcs”→Import into Version Control→Create Git Repository.
選擇工程所在的上級目錄。本例中應該選擇idea-projects目錄,然后點擊“OK”按鈕,在工程的上級目錄創建本地倉庫,那么idea-projects目錄就是本地倉庫的工作目錄,此目錄中的工程就可以添加到本地倉庫中。也就是可以把idea-git-test工程添加到本地倉庫中。選擇之后在工具欄上就多出了git相關工具按鈕:
將工程添加至本地倉庫
之后commit
填寫日志信息,然后點擊“commit”按鈕,將工程添加至本地倉庫。
之后成功commit
推送到遠程,首先在github上創建一個倉庫然后將本地倉庫推送到遠程。之后定義遠程連接
之后填寫倉庫的URL
之后在工程上點擊右鍵,選擇git→Repository→push,或者在菜單中選擇vcs→git→push
之后填寫用戶名和密碼(如果是第一次配置推送需要輸入github的用戶名和密碼。)
推送成功
從遠程倉庫克隆
關閉工程后,在idea的歡迎頁上有“Get from Version Control”按鈕,點擊
之后填寫倉庫地址,和克隆下來存放的目錄
此處仍然推薦使用https形式的url。點擊Clone按鈕后將遠程倉庫克隆下來,之后導入到idea中。
之后,yes,重新打開工程
從服務端拉取代碼
如果需要從服務端同步代碼可以使用工具條中的“Update Project”按鈕