# 《Git 操作使用教程》
一、Git 簡介
????????Git 是一個分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。它讓開發者可以輕松地跟蹤代碼的更改、與團隊成員協作,并管理項目的不同版本。
二、安裝 Git
- 在 Windows 系統上,可以從 Git 官方網站下載安裝程序進行安裝。
- 在 Linux 系統上,可以使用包管理器(如 Ubuntu 上的 `apt-get` )來安裝 Git。
- 在 macOS 上,可以通過 Homebrew 或者從 Git 官方網站下載安裝。
????????下載地址:Git - Downloads (git-scm.com)
三、?Git 中一些常見的概念
- 1. 工作區(Working Directory)
????????這是您日常進行項目開發和編輯文件的地方,就是您電腦上能看到和操作的本地目錄。例如,您正在編寫的代碼文件所在的文件夾就是工作區。
- 2. 暫存區(Staging Area 或 Index)
????????當您對工作區中的文件進行修改后,可以將這些修改添加到暫存區。暫存區就像是一個臨時的緩沖區,您可以選擇將哪些修改納入下一次的提交。比如說,您修改了多個文件,但只想先提交其中一部分的修改,就可以把要提交的部分放入暫存區。
- 3. 本地倉庫(Local Repository)
????????這是在您本地計算機上存儲項目完整版本歷史的地方。每次提交都會在本地倉庫中創建一個新的版本。比如,您在項目開發過程中多次進行提交,這些提交的記錄都保存在本地倉庫中。
- 4. 分支(Branch)
????????分支允許您在項目的不同版本或功能開發線上獨立工作。常見的分支有主分支(通常是?master
?或?main
?)以及各種功能分支。例如,您可以創建一個名為?feature-x
?的分支來開發新的功能,而不影響主分支的穩定。
- 5. 提交(Commit)
????????提交是將您在工作區中的修改進行保存并記錄的操作。每次提交都包含了一個描述信息,說明這次修改的內容和目的。假設您完成了一個功能模塊的一部分開發,并對相關代碼進行了修改和測試,就可以將這些修改作為一次提交。
- 6. 遠程倉庫(Remote Repository)
????????通常位于代碼托管平臺(如 GitHub、GitLab 等)上,用于團隊成員之間共享代碼和協作。比如,團隊中的其他成員可以從遠程倉庫獲取您的提交和代碼更改。
- 7. 合并(Merge)
????????當不同分支上的開發工作完成后,可以將它們合并到一起。例如,將?feature-x
?分支上完成的功能合并到主分支。
- 8. 沖突(Conflict)
????????當在合并分支時,如果不同分支對同一文件的相同部分進行了不同的修改,就會產生沖突。這需要手動解決沖突,以確保合并的結果是正確的。比如,兩個分支都修改了同一個函數的實現,就可能出現沖突。
????????這些是 Git 中一些基礎且重要的概念,理解它們對于有效地使用 Git 進行版本控制和團隊協作至關重要。
四、Git工作流程圖
?????
五、Git 的基本操作流程
-
1、初始化本地倉庫
????????在您的項目目錄中(示例目錄:D:\dev\idea-workplace\test_git),鼠標右鍵--->open Git Bash here,打開Git命令行工具
????????使用?git init
?命令將其初始化為一個 Git 本地倉庫。
????????將會在當前目錄生成一個.git的隱藏文件夾,存放當前項目本地倉庫的配置信息,不要刪除或修改。執行命令(ll -a)查看當前目錄下的所有文件或文件夾(包括隱藏文件):
ll -a
????????進入.git文件夾查看
-
2、設置簽名?
? ? ? ? 本地倉庫創建后需要先設置簽名,主要作用是區分不同開發人員的身份。
????????在以上初始化本地倉庫的目錄“D:\dev\idea-workplace\test_git”下執行以下命令設置簽名:
# 通過參數區分簽名的生效范圍# 1、倉庫級別(或項目級別,不使用參數:--global):僅在當前本地庫范圍內有效git config user.name "Your Name"
git config user.email "your_email@example.com"# 2、系統用戶級別(使用參數:--global):登錄當前操作系統的用戶范圍均有效git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"級別優先級
1、就近原則:項目級別優先于系統用戶級別,二者都有時優先采用項目級別的簽名
2、如果只有系統用戶級別的簽名,就以系統用戶級別的簽名為準
3、二者都沒有不允許
將?Your Name
?替換為您的姓名,your_email@example.com
?替換為您的郵箱。
示例1:系統用戶級別簽名
示例2:倉庫(項目級別)簽名
????????當設置系統用戶級別簽名時,會在系統當前登陸用戶的home目錄下生成一個.gitconfig的隱藏文件記錄用戶名和email。
?????????cat命令查看信息
-
3、添加工作區文件到暫存區(git add)
????????使用?git add <文件名>
?逐個添加文件,或者使用?git add.
?添加當前目錄下的所有修改和新增的文件。
########################創建文件并添加至暫存區##################
#在項目目錄下新建Test.java文件
touch Test.java#方式1:將單個文件提交至Git暫存區
git add Test.java#方式2:將當前目錄下的所有文件提交至Git暫存區
git add .########################修改文件并添加至暫存區##################
# 修改Test.java文件內容
#方式1:將單個文件提交至Git暫存區
git add Test.java#方式2:將當前目錄下的所有文件提交至Git暫存區
git add .
示例
添加單個文件至Git暫存區?
?添加所有文件至Git暫存區
查看git狀態
-
4、提交暫存區更改至本地倉庫(git commit)
????????執行?git commit -m "提交描述信息"
?,將暫存區的內容提交到本地倉庫。描述信息應清晰地說明本次提交的更改內容。
????????例如:如果您新增了一個用戶登錄功能 ,可以寫 "新增用戶登錄功能代碼" 。
#提交暫存區至本地倉庫
git commit -m '添加用戶登錄功能代碼'#查看修改狀態
git status#查看提交日志
git log
-
5、分支操作
????????幾乎所有的版本控制系統都以某種形式支持分支。 使用分支意味著你可以把你的工作從開發主線上分離開來進行重大的Bug修改、開發新的功能,以免影響開發主線。 ???????
-
5.1、查看本地分支
#查看本地分支
git branch
?
-
5.2、創建本地分支
????????若要進行新功能開發或進行不同的工作,可以使用?git branch <分支名>
?創建分支,然后使用?git checkout <分支名>
?切換到該分支。
????????比如:創建一個名為?develop
?的分支來開發新的功能代碼。
? ? ? ? 提示:新創建的分支會同步當前分支的全部內容。
????????比如:從master創建一個develop分支,那么新創建的develop分支包含master分支的最新內容。同理,切換到develop分支后修改了部分內容并提交后,再從develop分支創建一個dev1的分支,那么dev1分支中包含develop分支的最新內容。
#創建本地分支:git branch <分支名>
#創建一個名稱為develop的分支
git branch develop
-
5.3. 在分支上工作
????????在分支上進行修改、添加或刪除文件等操作,并提交至本地倉庫。
-
5.4. 切換分支
????????使用?git checkout <分支名>
?切換到其他分支。
#*切換分支(checkout)
#命令:git checkout 分支名
#切換到develop分支(分支已存在)
git checkout develop
-
5.5. 合并分支(必要時需要解決沖突問題)
????????當一個分支上的工作完成后,先切換到目標分支(通常是主分支),然后使用?git merge <要合并的分支名>
?進行合并。
????????假設您在?develop
?分支上完成了開發,切換到主分支后將其合并。
#合并分支,如想把develop分支的代碼合并到master,則應先切換到master分支,再使用git merge develop命令進行合并#切換到master分支
git checkout master#合并develop分支到master分支
git merge develop
-
5.6、開發中分支使用原則與流程
-
master (生產) 分支
-
develop(開發)分支
-
feature/xxxx分支
-
hotfix/xxxx分支
-
5.7、分支操作練習
###########################創建并切換到deve01分支,在deve01分支提交文件
# [master]創建分支deve01
git branch deve01
# [master]切換到deve01
git checkout deve01
# [deve01]創建文件Test02.java
略
# [deve01]將修改加入暫存區并提交到倉庫,提交記錄內容為:add Test02 on dev
git add .
git commit -m 'add Test02 on dev'
# [deve01]以精簡的方式顯示提交記錄
git log###########################切換到master分支,將deve01合并到master分支
# [deve01]切換到master分支
git checkout master
# [master]合并deve01到master分支
git merge deve01
# [master]以精簡的方式顯示提交記錄
git log
# [master]查看文件變化(目錄下也出現了Test02.java)
略##########################刪除deve01分支
# [master]刪除deve01分支
git branch -d deve01
# [master]查看本地分支
git branch
-
六、Git遠程倉庫
-
?6.1、常用的托管服務[遠程倉庫]
- gitHub( 地址:https://github.com/ )是一個面向開源及私有軟件項目的托管平臺,因為只支持 Git 作為唯一的版本庫格式進行托管,故名gitHub
- 碼云(地址: https://gitee.com/ )是國內的一個代碼托管平臺,由于服務器在國內,所以相比于 GitHub,碼云速度會更快
- GitLab (地址: https://about.gitlab.com/ )是一個用于倉庫管理系統的開源項目,使用Git作 為代碼管理工具,并在此基礎上搭建起來的web服務,一般用于在企業、學校等內部網絡搭建git私服。
-
6.2、創建遠程倉庫
? ? ? ? 略
-
6.3、配置SSH公鑰
????????略
-
6.4、操作遠程倉庫
-
6.4.1、關聯遠程倉庫
- 首先,確保您已經在本地創建了一個 Git 倉庫。
- 使用以下命令來關聯遠程倉庫:
git remote add <遠程倉庫名稱> <遠程倉庫 URL>
例如,如果您要添加一個名為?origin
?的遠程倉庫,其 URL 為?https://github.com/username/repository.git
?,則命令為:git remote add origin https://github.com/username/repository.git
# 添加遠程倉庫命令:git remote add <倉庫名稱> <倉庫路徑>#SSH模式:郵箱:url
git remote add test xxxx@qq.com:https://gitee.com/xxx/test.git# Https模式
git remote add test https://gitee.com/xxx/test.git
????????在關聯遠程倉庫后,您就可以執行諸如推送(git push
)和拉取(git pull
)等操作,與遠程倉庫進行交互。?
-
6.4.2、查看遠程倉庫
????????看已配置的遠程倉庫名稱,使用?git remote
?命令。
#本地倉庫與遠程倉庫建立連接后,使用命令查看遠程倉庫:git remote
gite remote
-
6.4.3、推送到遠程倉庫
? ? ? ? 遠程倉庫通常位于代碼托管平臺(如 GitHub、GitLab、碼云 等)上,用于團隊成員之間共享代碼和協作。比如,團隊中的其他成員可以從遠程倉庫獲取您的提交和代碼更改。
????????將本地的更改推送到 Git 遠程倉庫,您可以使用以下命令:
git push <遠程倉庫名稱> <本地分支名稱>:<遠程分支名稱>
? ? ? ? 推送之前請確保已經關聯了遠程倉庫(參考6.4.1)
????????通常情況下,如果您沒有指定具體的分支,Git 會默認將當前所在的本地分支推送到與之關聯的遠程分支。例如,如果遠程倉庫名為 `origin` ,您當前在 `master` 分支,且希望推送到遠程的 `master` 分支,可以使用以下命令:?
git push origin master
????????如果您的本地分支和遠程分支名稱不同,比如本地分支是 `feature-branch` ,而要推送到遠程的 `development` 分支,那么命令如下:
git push origin feature-branch:development
????????另外,如果您是第一次推送某個分支到遠程倉庫,可能需要使用 `-u` 選項來建立本地分支和遠程分支的跟蹤關系,例如:
git push -u origin feature-branch
????????此后,再進行推送時,就可以直接使用 `git push` 而無需指定遠程倉庫和分支名稱了。 假設您正在一個名為 `bug-fix` 的本地分支上工作,并且要將其推送到遠程倉庫 `origin` 上名為 `bug-fix` 的遠程分支,命令就是:
git push origin bug-fix
????????在推送過程中,如果遠程分支存在保護策略或者有其他限制,可能會導致推送失敗。此時,您需要根據錯誤提示解決相應的問題后再進行推送。 ?
-
6.4.4、查看本地分支與遠程分支之間存在關聯關系
????????在 Git 中,本地分支與遠程分支之間存在關聯關系,用于方便地進行推送和拉取操作。
????????默認情況下,當您首次使用?git push
?推送一個本地分支時,如果沒有明確指定遠程分支,Git 會自動創建一個與本地分支同名的遠程分支,并建立關聯。例如,您首次推送本地的?master
?分支,Git 會在遠程創建一個名為?master
?的分支,并建立關聯。
可以使用?git branch -vv
?命令查看本地分支與遠程分支的關聯關系。在輸出中,會顯示每個本地分支所跟蹤的遠程分支。
也可以使用?git branch --set-upstream-to=<遠程倉庫名>/<遠程分支名> <本地分支名>
?命令來手動設置關聯關系。例如,如果要將本地的?feature
?分支關聯到遠程?origin
?倉庫的?feature
?分支,可以使用:
git branch --set-upstream-to=origin/feature feature
????????當建立了關聯關系后,執行諸如?git pull
?或?git push
?等操作時,Git 就知道應該與哪個遠程分支進行交互。假設您有一個本地分支?bugfix
?,它關聯到遠程?origin
?倉庫的?bugfix
?分支。當您在本地?bugfix
?分支進行了一些修改,然后執行?git pull
?時,Git 會從遠程的?bugfix
?分支拉取最新的更改并嘗試合并。
????????另外,如果您創建了一個新的本地分支,但是沒有建立與遠程分支的關聯,在執行?git push
?時,Git 會提示您沒有建立跟蹤關系,需要先設置。
-
?6.4.5、從遠程倉庫克隆
# git clone <遠程倉庫的 URL>
#示例:https://github.com/username/repository.git為倉庫地址URL
git clone https://github.com/username/repository.git
????????克隆操作完成后,您就可以在本地對代碼進行修改、提交等操作,并根據需要與遠程倉庫進行交互。?
-
6.4.6、從遠程倉庫獲取更新
-
1. git fetch
#- `git fetch` :獲取所有遠程倉庫的更新。
git fetch#- `git fetch <倉庫名稱>` :
# 僅從名為 `origin` 的遠程倉庫獲取更新。
git fetch origin#- `git fetch <倉庫名稱> <分支名稱>` :
#從 `origin` 遠程倉庫獲取 `master` 分支的更新。
git fetch origin master
-
2. git pull
# git pull :從默認的遠程倉庫(通常是 origin )獲取與當前分支對應的遠程分支的更新并合并。# git pull <倉庫名稱>
# 從 origin 遠程倉庫獲取更新并合并。
git pull origin # git pull <倉庫名稱> <分支名稱>
# 從 origin 遠程倉庫的 feature-branch 分支獲取更新并合并到當前分支。
git pull origin feature-branch
?
-
6.5、遠程倉庫操作練習
##########################1-將本地倉庫推送到遠程倉庫
# 完成4.1、4.2、4.3、4.4的操作
略
# [git_test01]添加遠程倉庫
git remote add origin git@gitee.com/**/**.git
# [git_test01]將master分支推送到遠程倉庫,并與遠程倉庫的master分支綁定關聯關系
git push --set-upstream origin master###########################2-將遠程倉庫克隆到本地
# 將遠程倉庫克隆到本地git_test02目錄下
git clone git@gitee.com/**/**.git git_test02
# [git_test02]以精簡的方式顯示提交記錄
git-log###########################3-將本地修改推送到遠程倉庫
# [git_test01]創建文件file03.txt
略
# [git_test01]將修改加入暫存區并提交到倉庫,提交記錄內容為:add file03
git add .
git commit -m 'add file03'
# [git_test01]將master分支的修改推送到遠程倉庫
git push origin master###########################4-將遠程倉庫的修改更新到本地
# [git_test02]將遠程倉庫修改再拉取到本地
git pull
# 以精簡的方式顯示提交記錄
git-log
# 查看文件變化(目錄下也出現了file03.txt)
八、其他操作
-
1、查看當前倉庫的狀態,包括已修改、已暫存和未跟蹤的文件
-
2、查看提交日志
-
3、版本回退
- 作用:版本切換
- 命令形式:git reset --hard commitID
- 如何查看已經刪除的記錄?
# 版本回退,commitID是版本提交時的ID,可通過git log 查看
git reset commitID --hard
-
4、添加文件至忽略列表
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
-
5、使用?
git ls-files
?命令,它將顯示當前分支跟蹤的所有文件的列表
? ? ? ? 通過切換到不同的分支,使用?git ls-files
?命令查看不同分支所跟蹤的列表
#使用 git ls-files 命令,它將顯示當前分支跟蹤的所有文件的列表
git ls-files
-
6、刪除分支
????????在 Git 中刪除分支可以使用以下命令:
-
**刪除本地分支**
????????使用 `git branch -d <分支名稱>` 命令來刪除已經合并到當前分支的分支。如果分支未被合并,使用 `-d` 選項可能會失敗,此時可以使用 `-D` 強制刪除,但要謹慎操作,因為未合并的分支中的更改可能會丟失。 例如:
#刪除分支時,需要做各種檢查,可能會刪除失敗
git branch -d feature-branch#刪除分支時,不做各種檢查,強制刪除
git branch -D feature-branch
-
**刪除遠程分支**
????????要刪除遠程分支,首先需要確保本地分支已經與遠程分支同步。然后使用 `git push <遠程名稱> --delete <分支名稱>` 命令。 例如,如果您的遠程名稱是 `origin` ,要刪除名為 `feature-branch` 的遠程分支,可以使用: ``` git push origin --delete feature-branch ```
git push origin --delete feature-branch
????????請注意,刪除分支是不可逆的操作,所以在刪除分支之前,請確保您不再需要該分支或者已經備份了其中的重要更改。
-
7、解決沖突?
????????當 Git 提示合并過程中存在沖突時,您會在相關的文件中看到特殊的標記。這些標記通常會指出沖突的位置。HEAD表示當前分支,====以下是其他分支.
<<<<<<< HEAD
這是當前分支(通常是您要合并到的分支,比如主分支)的內容
=======
這是要合并進來的分支的內容
>>>>>>> 分支名稱
?????????刪除不需要的代碼和沖突標記,只保留您最終決定要保留的內容,保存文件。
????????使用?git add <文件名>
?將解決沖突后的文件添加到暫存區,然后使用?git commit -m "解決了分支合并沖突"
?提交更改。
例如:
????????假設有一個文件?example.txt
?,在合并分支時出現沖突。沖突部分可能如下:
<<<<<<< HEAD
print("Hello from main branch")
=======
print("Hello from feature branch")
>>>>>>> feature-branch
????????如果您決定保留主分支的內容,就刪除?=======
?以下直到?>>>>>>> feature-branch
?的部分。如果您想整合,比如改為?print("Hello from both branches")
?,然后保存文件,進行添加和提交操作。解決沖突時要仔細檢查和測試,確保合并后的代碼能正常工作。?
-
8、當前分支同步另一個分支的最新內容
????????`git rebase <分支名>` 命令用于將當前分支的提交基于 `<分支名>` 分支的最新提交進行重新排列。 這意味著它會把當前分支的提交“搬”到 `<分支名>` 分支的頂端,并以線性的方式重新排列提交歷史。
優點包括:
1. 使提交歷史更加整潔和線性,便于查看和理解。
2. 減少不必要的合并提交,使分支結構更清晰。
但也有一些注意事項:
1. 由于改變了提交的順序和基礎,可能會給團隊協作帶來困擾,如果其他人已經基于原始的提交進行了工作,可能會導致問題。
2. 在執行 `git rebase` 過程中,如果出現沖突,需要手動解決沖突,并繼續執行 `git rebase --continue` 。
????????例如,假設您在 `feature` 分支上進行開發,并且 `master` 分支有了新的提交。執行 `git rebase master` 后,`feature` 分支上的提交會基于 `master` 分支的最新狀態重新排列。如果在這個過程中,對某個文件的修改在 `feature` 分支和 `master` 分支存在沖突,Git 會提示您,您需要手動打開沖突的文件進行修改,解決沖突后執行 `git add <沖突文件>` ,然后 `git rebase --continue` 。
-
9、Git 中撤銷?
git rebase
?操作
在 Git 中撤銷 `git rebase` 操作有多種方法,以下是兩種常用的方式:
**方法一:使用 `git reflog` 和 `git reset`**
1. 首先,使用 `git reflog` 命令查看 Git 的操作記錄,找到 `rebase` 前的提交哈希值。
2. 然后,使用 `git reset --hard <commit_hash>` 命令將分支重置到指定的提交。`<commit_hash>` 替換為通過 `git reflog` 找到的 `rebase` 前的提交哈希值。
**方法二:使用 `ORIG_HEAD`** `rebase` 操作會將起點保存到 `ORIG_HEAD` ,通常可以直接使用以下命令進行撤銷: `git reset --hard ORIG_HEAD` 但需注意,`reset`、`rebase` 和 `merge` 等操作都會將原始 `HEAD` 指針保存到 `ORIG_HEAD` 中,如果在嘗試撤銷 `rebase` 后執行了這些命令中的任何一個,那么可能就需要使用 `git reflog` 來找到正確的提交哈希值并進行重置。
另外,如果在撤銷 `rebase` 操作之前進行了其他重要的提交,可能會導致這些提交丟失。所以在執行撤銷操作之前,請確保了解其影響,并謹慎操作。同時,建議在進行任何可能有風險的操作之前,先對代碼進行備份或創建新的分支,以便在需要時可以恢復到之前的狀態。 例如,可以先創建一個備份分支: `git branch backup` 如果后續需要恢復到備份的狀態,可以使用: `git reset --hard backup`
-
10、刪除遠程倉庫引用(遠程倉庫本身不會被刪除)
? ? ? ? 當本地倉庫不需要與遠程倉庫進行交互時,可以通過命令刪除遠程倉庫引用,首先進入本地倉庫目錄下,使用命令刪除遠程倉庫引用:git remote remove <遠程倉庫名稱>。
# git remote remove <遠程倉庫名稱>
#命令示例,其中origin為遠程倉庫名稱
git remote remove origin
????????需要注意:此操作只是從本地的 Git 配置中刪除了對該遠程倉庫的引用,但遠程倉庫本身并不會被實際刪除。
-
11、IDEA集成GitBash作為Terminal
?
九、IntelliJ IDEA中使用Git
-
1、在IDEA中配置Git
-
?2、IDEA創建Git本地倉庫
- 方式一、新建項目時勾選Create Git repository
- ?方式二、本地項目已經創建,此時導入本地倉庫
?選中本地項目路徑
-
3、設置遠程倉庫
-
?4、提交到本地倉庫
?
-
?5、推送到遠程倉庫
-
6、從遠程倉庫克隆(clone)到本地
-
?7、解決沖突
? ? ? ? 在pull或merge時有可能發生沖突
-
?8、創建分支
?
-
?9、切換分支
?
十、常見問題解決
-
1、解決Git Bash的亂碼問題
打開git bash執行:git config --global core.quotepath false
通過vim編輯/etc/bash.bashrc 文件,在最后加入下面兩行 ?
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"