前言:
? ? ? ? 不知道大家有沒有使用git提交代碼或者拉取代碼的經歷,自從上一家公司實習結束以后,對git的使用歷歷在目,從一開始的add、commit到后來的pull都有著許多的疑惑。
? ? ? ? 自從有一次merge代碼以后,被師兄批了一頓以后(不小心把師兄寫的代碼給覆蓋了!!尷尬),我下定決心要搞明白git的基本原理以及使用方法!!!!!
git的安裝:
? ? ? ? git的安裝盡量到官網去安裝(畢竟是免費的),當然如果有網盤安裝地址也可。
? ? ? ? 官方安裝地址:https://git-scm.com/
?
根據電腦的系統選擇安裝的方式:
注:安裝路徑盡量是英文的安裝路徑。
安裝完成后,如果在桌面右鍵,菜單里面出現了如下選項:
證明安裝成功!!!
注冊身份:
? ? ? ? 由于git是用來適應多人協作工作時的需求,所以每個人提交代碼時需要有身份的說明,所以當安裝好git以后就需要注冊或者說設置使用者的身份,這里我使用
命令框進行身份的設置:
代碼如下:
git config --global user.name 你的用戶名
git config --global user.email 你的郵箱地址
?
kong'jian'shuo'm注意:后面你的用戶名和郵箱號必須要用 "?" 引起來(否則就會報bash: $'\302\226git': command not found錯誤)
空間說明:
? ? ? ? 在搞懂git所有使用命令之前首先要了解git的所有存儲空間,都有什么作用。
Workspace:工作區(數據存儲在緩存中)
Index / Stage:暫存區(數據存儲在內存中)
Repository:倉庫區(或本地倉庫)(數據存儲在硬盤中)
Remote:遠程倉庫(數據存儲在遠程倉庫中)
?上述的四個區域對所有命令指令的理解非常重要,需要理解+記憶。
git的使用步驟:
? ? ? ? 了解了區域以后就可以展開對git使用的理解了。我將從以下幾點對git的操作展開:
一:提交文件信息(本地——>遠程):
1.git init 初始化git(將指定的文件夾交給git進行管理)
2.git add 將文件添加進暫存區
3.git commit 將文件提交到本地倉庫
4.git push 將文件提交到遠程倉庫
二:拉取遠程倉庫中的文件信息(遠程——>本地):
1.git pull 拉取遠程代碼
git Init初始化git:
? ? ? ? 如果此時創建一個普通的文件夾:
里面假設有一個文本文件:
那么我想要把這個文件推送到我的gitee倉庫進行管理,我應該怎么做?
首先就是要將這個文件交給git進行管理,此時可以在這個文件中打開git控制臺:
之后如果想要將該文件夾創建為git的版本庫,也就是交給git進行管理的話,使用:
git init 命令
之后文件夾中會多出一個隱藏文件夾:
如果沒有找到的話需要從這里進行勾選"隱藏項目":
如果出現了那證明第一步就完成了,將該文件夾交給git管理成功。
本地——>遠程
git add:
? ? ? ? add指令是將文件信息放入暫存區,也就是暫存區(內存中),完整代碼如下:
git add [選項] [文件路徑]
-h ,?--help | 顯示幫助信息 |
-v ,?--verbose | 顯示詳細輸出,顯示每個文件的處理過程 |
-f ,?--force | 強制添加,即使文件被忽略也會添加 |
-u ,?--update | 僅添加已跟蹤文件的修改,不添加新文件 |
-A ,?--all | 添加所有文件(包括新文件、修改文件、刪除文件) |
--ignore-removal | 忽略刪除操作,只添加修改和新文件 |
--patch ,?-p | 交互式添加,逐塊選擇要添加的代碼變更 |
--intent-to-add | 標記文件為 “待添加”,不實際添加內容,用于后續提交 |
-i ,?--interactive | 交互式模式,分步選擇要添加的文件和變更 |
git add . # 添加當前目錄下的所有文件 git add * # 添加當前目錄下的所有文件(與 . 類似,但不包含隱藏文件) git add --all # 等價于 git add .,但更明確
一般用的最多的就是add .(適用于大多是程序員)?
git commit:
? ? ? ? 將需要上傳的文件信息放入緩存區以后,就需要將緩存區的文件進行整理放入本地倉庫中為接下來的往遠程倉庫提交做準備。
? ? ? ? 當然有人問了為什么要設計這樣一個過程,我直接add完之后,直接把文件信息提交到遠程倉庫不香嗎~
? ? ? ? 設計git的大佬這樣設計肯定有道理滴,如果此時一個文件同時被A,B,C三人改寫,B提交了,那么A和C提交的時候會不會就把B的給覆蓋了?
? ? ? ? 答案是肯定會的,那么為了防止出現上述的情況,此時就設計了一個解決沖突的過程,這個后面再說~ (后續在git pull操作會說)
完整代碼如下:
git commit [選項] [-m "提交信息"] [文件路徑]
選項 | 描述 |
---|---|
-m ,?--message "信息" | 直接指定提交信息 |
-a ,?--all | 提交所有已跟蹤文件的修改(等價于先?git add -u ?再提交) |
-s ,?--signoff | 在提交信息末尾添加?Signed-off-by ?簽名 |
-c ,?--amend | 修改最后一次提交(用于修正提交信息或添加遺漏的變更) |
-v ,?--verbose | 在提交信息中顯示文件差異 |
-F ,?--file <文件> | 從文件中讀取提交信息 |
--no-verify | 跳過提交驗證鉤子(如代碼規范檢查) |
--dry-run | 模擬提交,不實際執行 |
-i ,?--interactive | 交互式選擇要提交的代碼塊 |
-S ,?--gpg-sign | 使用 GPG 簽名提交(需配置 GPG 密鑰) |
?大多數程序員會用到的操作:
git commit -m "初始化項目結構" # 提交暫存區所有文件并添加信息
git commit src/index.js -m "修改首頁布局" # 僅提交指定文件
如果執行上述操作以后就相當于把文件信息放在.git文件中的版本庫中了(放在硬盤中)?,當然。git文件中的版本庫和普通文件夾是有區別的。
版本庫可以記錄每一次提交的版本,每次commit的數據內容會被永久的記錄在磁盤中方便后續查看歷史提交記錄。
git的好處是在每次提交時,會保存提交信息的快照內容(完整的副本信息)。每次commit時會通過哈希算法創建一個唯一id,之后將創建一棵git數,如下:
那么有一個問題,在多人合作時,如果上一個人已經push代碼,此時我commit時發生了沖突,git是如何發現我commit的內容與其他人的內容是沖突的?(留在后續解答)
git push:
? ? ? ? 如果完成了上述的操作之后,接下來就需要進行最后一步就可以將信息資源上傳到遠程倉庫了,需要git push操作。
? ? ? ? git push 會將上述commit的所有本地倉庫中未推送至遠程倉庫的信息全部推送上去。
? ? ? ? 具體語法如下:
git push [遠程倉庫名] [本地分支名]:[遠程分支名]
?遠程——>本地
上述的操作都是如何將信息一步步的推送至遠程倉庫中。接下來的操作是如何將遠程倉庫中的信息拉取到本地。
git clone:
? ? ? ? 如何我們在瀏覽git hub時,發現有博主研究出新的插件玩法,我們想要拉取博主的源碼研究研究,此時可以使用git clone命令拉取。(以網址的方式拉取)
????????
? ? ? ? 除了以網址的方式拉取以外,還可以以SSH密鑰的解密的方式拉取
? ??
? ? 當然想要將源碼獲取到的方式也有很多,git clone是方法之一。也可以直接將資源信息下載下來使用。
git pull:
? ? ? ? 如果之前就已經拉取過代碼,此時如果你以后拉過一次代碼后可以直接在idea中進行拉取倉庫最新代碼。
? ? ? ? 語法如下:
git pull [遠程倉庫名] [遠程分支名]:[本地分支名]
原理分解:
?????????git pull 命令實則是兩個命令的合體:
- git fetch:從遠程倉庫下載所有提交和文件更新。
- git merge:將下載的更新合并到當前本地分支。
????????所以在沒有進行commit,如果直接pull代碼的話會出現問題,就是會自動將遠程代碼與當前本地分支的代碼進行合并,有可能會直接覆蓋當前自己寫的代碼。
注意:
? ? ? ? 如果此時直接進行pull代碼,pull過來的代碼會直接與當前
? ? ? ? 如果此時將拉取的代碼已經修改過一部分以后,想要pull一下倉庫中的最新代碼,此時需要做的是先要將所寫的代碼commit到本地倉庫,之后進行pull。