Git
一、Git概述
(一)什么是Git?
Git是一個開源的分布式版本控制系統(Distributed Version Control System,簡稱DVCS)。可以有效、高速地處理從很小到非常大的項目版本管理。
(二)什么是版本控制系統?
版本控制系統能追蹤項目,從開始到結束的整個過程。對編程人員而言,版本控制技術是團隊協作開發的橋梁,助力於多人協作同步進行大型項目開發。軟件版本控制系統的核心任務:查閱項目歷史操作記錄、實現協同開發。
(三)常見的版本控制系統
① 集中式版本控制工具
集中式版本控制工具,版本倉庫是集中存放在中央服務器的,team里每個人工作時,從中央 服務器下載代碼。每個人個人修改后,提交到中央版本倉庫。提交(commit)代碼需要聯網。如:svn
這會造成一個明顯的問題:單點故障
② 分布式版本控制工具
分布式版本控制系統可以沒有 “中央服務器”,每個人的電腦上都是一個完整的版本倉庫,這樣工作的時候,不需要聯網。因為版本倉庫就在你自己的電腦上。多人協作只需要各自修改,開發完成即可,推送給對方【聯網】,推送的時候是將整個版本倉庫推過去。如:Git這個共享版本庫一般指的是代碼托管平台,比較有名就是github,gitee
(四)Git的特點
① 速度、簡單的設計
② 對非線性開發模式的強力支持(允許成千上萬個並行開發的分支)
③ 完全分布式
④ 有能力高效管理類似 Linux 內核一樣的超大規模項目(速度和數據量)
⑤ 協同開發
Clone:克隆,從遠程倉庫中克隆代碼到本地倉庫,第一次操作
Push:推送,代碼完成后,需要和團隊成員共享代碼時,將代碼推送到遠程倉庫。
Pull:拉取,從遠程庫拉代碼到本地庫,自動進行合並(merge),最后放到工作區。
checkout:將本地倉庫的內容檢出到工作區
add:在提交前先將代碼提交到暫存區
commit:提交到本地倉庫
(五)基本概念
本地倉庫: 在本地主機上的一個代碼庫,可以獨立存在,也可以與遠程倉庫進行關聯
工作區:對任何文件的修訂(增刪改),都先放在工作區,工作區不與任何倉庫分支進行關聯 暫存區:把修訂的文件,從工作區經過add(添加)后與某一個倉庫分支進行關聯,只要進 入緩存區的文件才能commit(提交)到本地倉庫。
遠程倉庫 : 在局域網或互聯網上的一個主機,存放代碼庫的主機或平台,比如GitHub、 Gitee.com(碼雲)
分支:代碼存放在倉庫,默認是主分支(master),可以在主分支基礎上創建很多子分支,比如 develop(開發)、bugfix(bug修復)等。
二、Git的下載和安裝
(一)下載
下載地址:https://git-scm.com/download
(二)安裝
傻瓜式安裝:一路下一步。安裝完成后在電腦桌面右擊顯示 注: Git GUI Here:Git提供的圖形界面工具 Git Bash Here:Git提供的命令行工具
三、Git的基本配置
1.安裝完成 Git 后,正式使用git前,是需要進行一些全局設置的,如用戶名、郵箱。
設置全局用戶名
git config --global user.name "your name"
設置郵箱
git config --global user.email "your email"
以上配置信息默認存儲在用戶目錄下,如果設置錯誤,可以刪除以下如圖文件,重新操作以上命令即
可。
- 查看配置信息:git config --list
- 構建本地倉庫:要使用Git對我們的代碼進行版本控制,首先需要構建本地倉庫
① 在本地初始化一個Git倉庫
② 從遠程倉庫克隆一個倉庫
本地倉庫的相關操作
- 在本地初始化一個Git倉庫:
- 在電腦的任意位置創建一個空目錄作為我們的本地Git倉庫
- 進入這個目錄中,點擊右鍵打開Git bash窗口
- 執行命令Git init
如果在當前目錄中看到.git文件夾(此文件夾為隱藏文件夾)則說明Git倉庫創建成功
- 查看文件狀態:
git status [-s]
- 將文件添加(修改)到版本庫
要將一個文件納入到版本庫管理,首先要將其添加到暫存區,然后才能提交到倉庫中。
添加單個文件到暫存區
git add Readme.txt
將當前目錄下所有修改添加到暫存區,除按照規則忽略的之外
git add .
- 將暫存區中的文件,提交到倉庫中
如果暫存區有文件,則將其中的文件提交到倉庫
git commit
帶評論提交,用於說明提交內容、變更、作用等
git commit -m 'your comments'
- 查看提交歷史記錄
有的時候,是會需要查看自己做過哪些提交,來回顧自己完成的部分。或者需要尋找某個具體的提交來
查看當時的代碼。
git log # 顯示所有提交的歷史記錄
git log --pretty=oneline # 單行顯示提交歷史記錄的內容
- 版本回退
有了 git log 來查看提交的歷史記錄,我們就可以通過 git reset --hard 來回退到我們需要的特定版本,然后使用當時的代碼進行各種操作。
回退到 commit_id 指定的提交版本
git reset --hard 'commit_id'
- 回到未來的某個提交
當退回到某個提交的版本以后,再通過 git log 是無法顯示在這之后的提交信息的。但是,通過 git reflog 可以獲取到操作命令的歷史。因此,想要回到未來的某個提交,先通過 git reflog 從歷史命令中找到想要回到的提交版本的 ID, 然后通過 git reset --hard 來切換。
git reflog
git reset --hard 'commit_id'
- 刪除文件
在文件未添加到暫存區之前,對想刪除文件可以直接物理刪除。如果文件已經被提交,則需要 git rm
來刪除
git rm Readme.txt // 刪除已經被提交過的 Readme.txt
注意: git rm 只能刪除已經提交到版本庫中的文件。其他狀態的文件直接用這個命令操作是出錯的。
四、分支管理
(一)查看分支
# 查看本地分支信息 git branch # 查看相對詳細的本地分支信息 git branch -v # 查看包括遠程倉庫在內的分支信息 git branch -av 注意:前面帶有*號,這標識我們當前所在的分支
(二)創建分支
# 新建一個名稱為 dev 的分支 git branch dev
(三)切換分支
# 新建完 dev 分支以后,通過該命令切換到 dev 分支 git checkout dev 注意:當我們創建完分支以后,我們需要切換到新建的分支,否則,所有的修改,還是在原來的分支上。事實上,所有的改動,只能影響到當前所在的分支。
(四)創建並切換分支
# 新建 dev 分支,並切換到該分支上 git checkout -b dev
(五)合並分支
# 切換回 master 分支 git checkout master # 將 dev 分支中的修改合並回 master 分支 git merge dev 注意:分支修改文件中如果有換行的話會報錯
解決:Git默認配置替換回車換行成統一的CRLF,我們只需要修改配置禁用該功能即可。 git config --global core.autocrlf false
(六)刪除分支
當之前創建的分支,完成了它的使命,如 Bug 修復完,分支合並以后,這個分支就不在需要了,就可 以刪除它。 # 刪除dev分支 git branch -d dev
五、遠程倉庫
現在我們已經在本地創建了一個Git倉庫,又想讓其他人來協作開發,此時就可以把本地倉庫同步到遠 程倉庫,同時還增加了本地倉庫的一個備份。那么我們如何搭建Git遠程倉庫呢?我們可以借助互聯網上提供的一些代碼托管服務平台來實現,其中 比較常用的有GitHub、碼雲等。
-- GitHub( 地址:https://github.com/ )是一個面向開源及私有軟件項目的托管平台,因為只支持 Git 作為唯一的版本倉庫格式進行托管,故名GitHub。
-- 碼雲(地址: https://gitee.com/ )是國內的一個代碼托管平台,由於服務器在國內,所以相比於 GitHub,碼雲速度會更快。
接下來我們演示如何將本地倉庫中的代碼同步到github。和碼雲的操作一模一樣
(一)注冊賬號
① 第一步,點擊注冊按鈕
② 填寫真實信息
③ 郵箱驗證
(二)登錄使用
創建倉庫
填寫倉庫詳情
六、同步遠程倉庫
(一)ssh配置
SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的數據進行加密,這樣"中間 人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處 就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。
注:使用SSH同步方式需要先生成密鑰並在Gitee配置公鑰
執行命令,生成公鑰和私鑰: ssh-keygen -t rsa 執行命令完成后,在window本地用戶.ssh目錄C:\Users\用戶名.ssh下面生成如下名稱的公鑰和私鑰
密鑰生成后需要在gitee上配置密鑰,本地才可以順利訪問。
在git工具上輸入指令 ssh-keygen -t rsa 執行后,會在C:\Users\用戶名 下 一個名為.ssh的文件夾中找到公鑰
使用記事本的方式打開id_rsa.pub 把里面的公鑰內容復制到網頁公鑰文件域中。
(二)添加遠程倉庫地址
git remote add origin 遠程倉庫地址
七、遠程倉庫的操作
(一)推送本地內容到遠程倉庫
# 在本地倉庫更新內容 添加暫存區 git add . # 提交內容 git commit -m '信息' # 當本地倉庫中,代碼完成提交,就需要將代碼等推送到遠程倉庫,這樣其他協作人員可以從遠程倉庫同步內容。 # 第一次推送時使用,可以簡化后面的推送或者拉取命令使用 git push -u origin master # 將本地 master 分支推送到 origin 遠程分支 git push origin master 注意: ① git push -u origin master ,第一次使用時,帶上 -u 參數,在將本地的 master 分支推送 到遠程新的 master 分支的同時,還會把本地的 master 分支和遠程的 master 分支關聯起來。 ② 推送之前,需要先pull遠端倉庫,如果發現提交版本不一致,出現錯誤
(二)拉取
在多人協作過程中,當自己完成了本地倉庫中的提交,想要向遠程倉庫推送前,需要先獲取到遠程倉庫的最新內容。使用如下命令
git fetch origin master
git pull origin master
git fetch 和 git pull 之間的區別:
git fetch 是僅僅獲取遠程倉庫的更新內容,並不會自動做合並。
git pull 在獲取遠程倉庫的內容后,會自動做合並,可以看成 git fetch 之后 git merge 。從遠程倉庫拉取文件注意事項:
如果本地倉庫是手動創建,並不是從遠程倉庫克隆的,那么分支的關聯包括遠程倉庫的歷史記錄都不會生成。需要手動配置。1- 建立和遠程分支的關聯(非必要)
git branch --set-upstream-to=origin/master master
2- 允許在歷史記錄不關聯的情況下拉取文件
git pull origin master --allow-unrelated-histories
(三)解決合並沖突
在一段時間,A、B用戶修改了同一個文件,且修改了同一行位置的代碼,此時會發生合並沖突。
例如:
A用戶在本地修改代碼后優先推送到遠程倉庫,此時B用戶在本地修訂代碼,提交到本地倉庫后,也需 要推送到遠程倉庫,此時B用戶晚於A用戶推送,故需要先拉取遠程倉庫代碼,經過合並后才能推送代 碼。在B用戶拉取代碼時,因為A、B用戶同一段時間修改了同一個文件的相同位置代碼,故會發生合並 沖突。
解決: ① 先拉取代碼 ② 打開代碼解決沖突 ③ 再提交 工作技巧: 推送要早,bug要少
(四)從遠程倉庫克隆
Git 克隆的是該 Git 倉 庫服務器上的幾乎所有數據(包括日志信息、歷史記錄等),而不僅僅是復制工作所需要的文件。 當你 執行 git clone 命令的時候,默認配置下遠程 Git 倉庫中的每一個文件的每一個版本都將被拉取下來。 如果你本地沒有倉庫,希望從已有的遠程倉庫上復制一份代碼,那么你需要 git clone 。 # 通過 https 協議,克隆 Github 上 git 倉庫的源碼 git clone https://github.com/lagou-zimu/repo1.git # 通過 ssh 協議,克隆 Github 上 git 倉庫的源碼 git clone git@github.com:lagou-zimu/repo1.git
八、Idea中集成Git
(一)在idea中配置Git
(二)Idea的Git操作
1. 初始化並提交項目到遠程倉庫
① 初始化並提交項目到遠程倉庫 【項目leader操作】 執行步驟: 1. 在GitHub/碼雲中創建遠程倉庫 2. 將工程交給Git管理 3. 提交到本地倉庫 4. 推送到遠程倉庫
② 在gitee上創建倉庫
③ 將工程交給Git管理
④ 配置忽略文件
⑤ 提交到本地倉庫
⑥ 推送到遠程倉庫
2. 克隆遠程倉庫到本地【開發人員】
① 從遠程倉庫克隆
(三)Idea中Git的常見操作【開發人員重點】
① 新增文件:新文件狀態紅色,未進入暫存區
加入git之后,紅色變綠色,已經進入暫存區
② 編輯文件:修改文件 變成藍色 正常編輯的文件默認放在暫存區,不需要再添加到暫存區
③ 重置文件到修改前 比如修訂了某一文件,需要重置到修改文件之前的狀態,選擇文件,右鍵菜單:選擇Git--->Revert 重置后,文件顏色自動消失,說明已重置到修改之前的狀態。
④ 提交當前文件
⑤ 本地倉庫推送到遠程倉庫 操作步驟: 1. 推送前一定要先拉取遠程倉庫對應分支 2. 如果有沖突,先解決沖突,並提交到本地倉庫 3. 推送當前分支到遠程倉庫
沖突:如果A、B兩個分支都在操作同一文件。當A分支提交遠程倉庫之后,B分支再提交的話會產生沖突 解決:先拉取,解決完沖突,再push
再推送到遠程倉庫
(四)分支操作
操作步驟: 1. 創建分支 2. 切換分支執行操作 3. 執行合並操作,master合並dev 4. 同步遠程倉庫
① 創建分支
② 切換分支執行操作
③ 執行合並操作(將dev分支合並到master分支)
④ 同步遠程倉庫
注意
總結一下:本地倉庫有文件,遠程倉庫也有文件,正確姿勢:
1,git remote add origin 遠程倉庫地址
2,git pull origin master --allow-unrelated-histories
3,git branch --set-upstream-to=origin/master master
4,git push