1.Git基本概念——工作區域和狀態
1.1.工作區域
Git倉庫:用來保存項目的元數據和對象數據庫的地方,克隆倉庫指的就是克隆這里的數據。
工作目錄(工作區):是對項目的某個版本獨立提取出來的內容,可以在這基礎上進行文件的修改。
暫存區域(暫存區):一個保存了下次將提交的文件列表信息的文件。
1.2.狀態
已提交(committed):表示數據已經安全的 保存在本地倉庫中。
已修改(modified):表示修改了文件,但還沒保存到本地倉庫中。
已暫存(staged):表示對一個已修改文件的當前 版本做了標記,使之包含在下次提交的快照中。
2.Git工作流程
基本的 Git 工作流程如下:
- 在工作目錄中修改文件。
- 暫存文件,將文件的快照放入暫存區域。
- 提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
3.Git基礎命令
3.1 初始設置
git config --global user.name aaabbbccc # 配置用戶名
git config --global user.email aaabbbccc@qq.com # 配置郵箱
通過 git config 設置一個用戶名和郵箱,并且通過 ==git config --list== 查看相關初始配置信息, 這個信息主要用來告訴Git當前的操作者是誰。
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=D:/git/Git/mingw32/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
pack.packsizelimit=2g
credential.helper=manager
user.name=aaabbbccc
user.email=aaabbbccc@qq.com
設置成功后就能在配置中看到設置后的用戶名及郵箱。
3.2 初始化本地倉庫
git init
- 通過命令 git init將一個目錄變成git可以管理的倉庫,這時候你當前目錄下會多了一個.git的目錄。這個目錄是Git來跟蹤管理版本的,不要亂改這個目錄里面的文件,否則,會把git倉庫破壞。
3.3 查看git倉庫當前狀態
git status
- 通過該命令,可以查看當前目錄下,文件處于什么狀態。
- 處于工作區未被追蹤(untracked)
- 位于暫存區等待提交至倉庫(changes to be commited)
- 在工作區中修改了但沒有提交至暫存區(modified)
- 已經提交至本地倉庫中(commited)
3.4 將文件從工作區提交至暫存區
git add . # 將所有文件添加到暫存區
git add 具體文件名 # 添加具體文件到暫存區
git add命令是從工作區添加文件到暫存區中,等待上傳或保存。
3.5 將文件從暫存區提交至倉庫
git commit -m ''
- 通過commit命令將暫存區的文件提交保存至倉庫中。-m參數代表添加注釋,""引號內添加注釋內容
- 如果沒有設置git用戶名及郵箱,在commit時會提示(please tell me who you are),出現此提示代表還有沒有配置初始用戶名等設置。
3.6 查看git日志
git log
使用git log 命令查看所有提交至倉庫的操作。
日常操作步驟
日常操作步驟為:
- [ ] - git init 初始化倉庫
- [ ] - git add . 將文件添加至緩存區
- [ ] - git commit -m 將文件上傳至倉庫
4.撤銷操作
4.1 將工作區中文件的改動撤銷(適用于工作區修改,未提交至暫存區)
- 可以先通過git status命令查看工作區中有哪些文件進行了修改但還沒有提交至暫存區的(即狀態為modified)。
git checkout --具體文件名 # 還原某個修改過的具體文件
git checkout . # 還原所有修改過的文件
通過git checkout 命令將在工作區中修改但還沒有提交至暫存區的文件撤銷至未修改前的狀態。
4.2 將暫存區中文件的改動撤銷(適用于已提交至暫存區)
- 當文件改動已提交至暫存區后就不能再使用git checkout 命令來撤銷改動,此時要通過 git reset命令撤銷位于暫存區中的改動。
- 可以先通過git status命令查看處于暫存區中的文件(即狀態為changes to be commited)。
git reset . # 還原所有已提交至暫存區的文件至工作區
git reset HEAD 具體文件名 # 還原某個已提交至暫存區的具體文件至工作區
當文件從暫存區還原至工作區后,再使用 git checkout 命令將工作區中的改動撤銷。
4.3 撤銷上一次提交至倉庫中的操作,并將暫存區的文件重新提交至倉庫
git commit --amend
- 當希望對上一次提交至倉庫中的文件進行修改而不產生新的版本時,使用 git commit --amend命令。使用此命令時首先將希望修改的文件內容提交至暫存區中再使用此命令,即可覆蓋最新的版本而不產生新的版本。
5.刪除操作
5.1 手動刪除文件
- 當文件進行手動刪除后,使用命令 git status 可查詢到刪除的文件。在下面的例子中,我們首先在工作目錄下手動刪除了aaa.html文件。
上面代碼可以看出,文件的改動是未提交至暫存區及倉庫的,手動刪除文件后需要執行commit操作將改動提交至倉庫。
5.2 使用 rm 命令在git中刪除文件
git rm 文件名
- 直接使用 git rm 命令將指定文件刪除,會刪除暫存區中的該文件,同時工作目錄中的該文件也將被刪除
使用 git status 查看狀態,可以看到該刪除文件處于暫存區中,使用git commit將改動保存到本地倉庫中,也可以使用 git reset 命令將改動撤銷至工作區,再使用git checkout將改動撤回。
git rm --cached 文件名
- 在 rm 命令后加上 --cached 參數,只會將文件刪除提交至暫存區,并等待提交至本地倉庫。
當加上 --cached 參數后,會產生上圖所示的結果,git會認為是刪除了一個名為aaa.xlsl的文件,并提交至暫存區中,并且新創建了一個名為aaa.xlsx的文件處于未追蹤狀態。
6.git分支
6.1 查看當前所有分支
- 使用 git branch 命令查看當前所有分支
git branch
6.2 創建新分支
- 使用 git branch dev 命令創建一個名為dev的分支
git branch 分支名
6.3 切換分支名
- 使用 git checkout dev 命令切換至dev分支
git checkout 分支名
- [x] !注意checkout命令用于 ++切換分支++ 及 ++撤銷操作++ 的區別。
6.4 刪除分支
- 使用 git branch -d dev 命令刪除dev分支
git branch -d 分支名
- 如果當前處于 dev 分支,想要刪除dev分支就會失敗并報錯,必須切換到其他分支才能刪除dev分支。
7.代碼合并
7.1 存在沖突時的合并
- 在master分支上創建一個 git_test.html 文件, 并提交保存至倉庫中。
<!--git_test.html on master-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>這是master分支啊</p>
</body>
</html>
- 創建一個dev分支并切換到 dev 分支,在dev分支同樣創建一個 git_test.html,并提交保存至倉庫中。
<!--git_test.html on dev-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>這是dev分支啊</p>
</body>
</html>
3.切換回 master 分支,使用 git merge 命令將 dev 分支上的代碼合并至 master 分支。
提示兩個分支中有同名文件 git_test.html 存在沖突,自動合并失敗,需要手動合并沖突后再提交。
-
打開 git_test.html 文件后,文件變成下面的樣子:
image.png
合并的同名文件存在差異時,git會將文件分為三個部分:
1. 從 HEAD 到 ======
2. 從 ====== 到 >>>>>>>
3. 在 >>>>>>> merge code 后的部分
前兩部分為合并時同名文件的差異部分,在>>>>>>> merge code后的部分為兩個文件相同的部分。
只需要將代碼中不相同的那兩部分進行統一,合并成一個結果即可。
- 將差異處理并保存后,重新進行提交,完成合并。
7.2 不存在沖突時的合并(快進式合并)
- 在master分支上創建一個 git_test.html 文件, 并提交保存至倉庫中。
<!--git_test.html on master-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>這是master分支啊</p>
</body>
</html>
- 創建一個 fix 分支并切換到 fix 分支,在 fix 分支同樣創建一個 git_test.html,并提交保存至倉庫中。
<!--git_test.html on fix-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>這是dev分支啊</p>
<p>這是添加的內容</p>
</body>
</html>
- 切換回 master 分支,使用 git merge 命令將 fix 分支上的代碼合并至 master 分支。此時代碼沒有沖突,將直接合并成功,合并后代碼顯示為:
<!--git_test.html on master-->
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<p>這是dev分支啊</p>
<p>這是添加的內容</p>
</body>
</html>
8.差異比較
8.1 工作區與暫存區的差異比較
- 使用 git diff 命令比較工作區與暫存區之間的差異。
git diff
8.2 暫存區與版本庫的差異比較
- 使用 git diff --cached 命令比較暫存區與版本庫之間的差異。
git diff --cached
8.3 不同版本之間的比較
- 使用 git diff [版本1-id] [版本2-id] 比較兩個版本之間的差異。(通過git log --oneline查看相應的版本id)
# 比較版本622e836與895af11之間的差異
git diff 622e836 895af11
8.4 不同分支之間的比較
- 使用 git diff [分支名] 比較兩個分支間的差異。假如當前處于master分支下:
git diff dev
上述命令將比較master分支與dev分支之間的差異。
8.5 工作區與版本庫之間的比較
- 使用 git diff HEAD 比較工作區與版本庫之間的差異。
git diff HEAD
上述命令將比較master分支與dev分支之間的差異。
9.git help文檔
9.1 當對某個命令不熟悉時,可以使用 git help 命令后接不熟悉的命令名稱,查看該命令的使用方法。比如對 log 命令不熟:
git help log # 查看log命令的使用方法