文章目錄
- 前言
- 簡介
- git的工作流程
- git的安裝
- 配置git環境:git config --global
- git的基本使用
- 新建目錄
- 初始化倉庫(repository)
- 添加到暫存區
- 新增/修改/刪除 文件狀態會改變
- 提交到倉庫
- 查看提交(commit)的歷史記錄
- git其他命令
- 版本回滾
- 查看差異
- 版本庫中刪除文件
- .gitignore忽略文件
- 遠程倉庫的使用
- 注冊github賬號
- github上創建倉庫
- SSH配置克隆倉庫
- SSH配置
- 克隆倉庫
- 拉取與推送
- github將本地倉庫關聯到遠程倉庫:git remote add origin
- 分支
- 創建分支
- 查看分支
- 切換分支
- 刪除分支
- 合并分支
- 合并沖突
- merge和rebase的優缺點(重要)
- 提交合并
- GitHub工作流(多人協作,僅作參考)
- 在IDE中使用git (工作使用更多,圖像化界面更直觀,由于IDE眾多,不作演示)
- Git 命令大全
- 參考目錄
前言
閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論與私信,指出錯誤或是進行交流等。
簡介
Git 是一個分布式版本控制系統,用于管理和跟蹤代碼或文件的變更。它可以記錄文件的每一次修改,幫助開發者協作、管理代碼版本、追蹤項目歷史,并在需要時恢復到之前的版本。
Git 是免費、開源的,由林納斯·托瓦茲(Linus Torvalds)在 2005 年開發,最初用于 Linux 內核開發。如今,它廣泛應用于各種軟件開發項目中,尤其是在團隊協作開發中。
除了git還有svn、cvs這樣的版本控制系統,它們的區別在于一個是分布式一個是集中式
集中式的版本控制系統,有一個單一的服務器,保存所有文件的修訂版本。協同工作的人通過客戶端連接到這臺服務器,在每次寫代碼時都需要從服務器中拉取一份下來,從而取出最新的文件或者提交更新。你本機客戶端僅保存當前的版本信息,換句話說,集中式就是把代碼放在一個服務器上集中管理,你的所有回滾等操作都需要服務器的支持。(如下圖)
分布式的區別在于,每個人的電腦都是服務器,當你從主倉庫拉取一份代碼下來后,取的不是最新的文件快照,而是把代碼倉庫完整的鏡像下來到本地庫(克隆/備份),無需擔心主倉庫被刪或者找不到的情況,你可以自由在本地回滾,提交,當你想把自己的代碼提交到主倉庫時,只需要合并推送到主倉庫就可以了,同時你可以把自己的代碼新建一份倉庫分享給其它人。
git的工作流程
- 工作區是你當前正在進行開發和編輯文件的地方。它就是你的項目文件所在的目錄,包含你正在修改、編輯、編寫的所有文件。
- 暫存區是一個臨時的存儲區域,保存你想要提交的改動。它類似于“準備提交”的區域。你可以將修改部分地加入暫存區,只將當前開發的一部分內容提交,而不是整個工作區的內容。
- 本地倉庫是你計算機上的 Git 倉庫,保存項目的所有歷史提交記錄。當你對文件進行提交(git commit)時,文件會被從暫存區提交到本地倉庫,成為項目的永久記錄。
- 遠程倉庫是托管在服務器上的倉庫,如 GitHub、GitLab 或 Gitee。它與本地倉庫不同,通常用于團隊協作或代碼備份。你可以將本地的提交推送到遠程倉庫,其他開發者也可以從遠程倉庫拉取代碼。
git的安裝
官方網站:https://git-scm.com/
點擊下載:
找到對應電腦系統的網址:
配置選擇,基本上一直下一步即可:
配置git環境:git config --global
初次使用git需要設置你的用戶名以及郵箱,這將作為當前機器git的標識,如果你用它來下載遠程倉庫一些需要登錄權限的倉庫會要求登錄,git默認使用配置郵箱以及用戶名登入,但會要求你手動輸入密碼
git config --global user.name "你的用戶名"
git config --global user.email "你的郵箱"
git的基本使用
新建目錄
新建一個目錄,作為要管理的庫。該目錄下可以存放要管理的文檔、項目等。以下圖為例,在某目錄下創建了一個MyProject的文件夾,
雙擊進入該文件夾后,右鍵菜單選擇Git Bash Here。
輸入git stash查看狀態,顯示并沒有將該目錄初始成一個倉庫,所以git此時是對他是無法進行管理的。
初始化倉庫(repository)
git初始化倉庫命令
git init
初始化的結果如下:
從上圖的初始化可以看出:
- 已經被初始化成一個空的倉庫,也說明此時可以進行git版本控制管理
- (master) 就是我們當前初始化的倉庫是主分支,也是當前所處分支的狀態
初始化成功之后,在項目文件夾下會多了一個.git 文件夾,(如果沒有顯示,是因為該文件為隱藏文件)。
之后所有的版本都會放到.git文件夾中,第一次提交commit會將所有文件都放進來,之后每一次commit只把修改的內容保存進來。
添加到暫存區
現在E:\00\MyProject\ 目錄下創建一個git_test.py 文件
通過命令查看當前管理文件的狀態
git status
查看結果顯示如下圖:
從上面顯示的可以看出,此時主分支還沒有任何提交(commit),untracked file就是未被跟蹤 / 追蹤的文件,下面藍框中的git_test.py顯示為紅色 說明該文件還沒有被git管理起來,下面給的提示是可以用git add 進行追蹤管理。
git status有三種狀態:
紅色:修改、創建、刪除都是顯示紅色
綠色:git add 添加之后變成綠色
白色:git commit提交之后變成白色
添加要管理的文件,命令:
git add <file>
用命令git add將文件添加到暫存區:之后用git status查看狀態,此時git_test.py文件顯示為綠色。
新增/修改/刪除 文件狀態會改變
在git_test.py 文件中添加一行文字如下,然后再使用git status查看添加文字之后的狀態。
如果修改了之前已經添加或者提交的文件,它又會變成紅色,還需要使用git add 添加。
如果有多個文件都被修改了,可以有多種方法將這些文件進行添加。
git add file1 file2 ... git add .
# 這個點表示,把當前文件夾下所有的文件(會遞歸的把每一個子文件夾下的文件也同樣管理起來)都添加管理# 可以結合通配符使用
git add *.py
提交到倉庫
將暫存區所添加的改動 提交到倉庫
git commit -m "message"
-m后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。
執行命令:`git commit -m “第一次提交到倉庫” ,此時就已經把所有的文件都提交到了倉庫中,顯示信息如下:
- 在主分支上的第一次提交(帶有注釋信息)
- 有一個文件被修改(是一行內容插入),就是git_test.py文件
- commit提交之后信息中git_test.py文件變成白色 此時說明提交成功
查看提交(commit)的歷史記錄
git log# 查看歷史的所有提交記錄
git reflog
顯示每次提交的提交哈希值、提交信息和時間:
git其他命令
版本回滾
將提交到倉庫的代碼進行版本回滾,命令:
git reset 回退版本號
- soft:回退到某一版本,保留工作區和暫存區的所有修改內容。
- had:回退到某一版本,丟棄工作區和暫存區的所有修改內容。
- mixed:是git的默認參數,保留工作區的所有修改內容,丟棄暫存區的所有修改內容。
案例:使用默認參數 mixed
假設現在已經有了三次提交記錄,每次提交一個txt文件。
使用git rest HEAD^ 或者使用 git rest 5af90b8 進行版本回退,表示回退到上一個版本。
通過命令 git log查看記錄發現,已經回退到上一個版本了。
查看工作區 發現還存在著三個文件,利用git ls-files查看暫存區發現 暫存區中只有兩個文件,表示版本已經回退成功。
查看差異
git diff [參數1] [參數2]
可以查看 工作區、暫存區、倉庫之間的差異,也可以用來查看同一文件在不同版本之間的差異。平時開發時會使用一些圖形化的界面來查看差異。
不加任何參數的情況下,默認比較工作區與暫存區之間的區別
案例:
假設有一個文件file3.txt 原本里面的內容是 “333”,現在將內容修改為"一鍵三連了嗎?"
輸入git diff命令查看差異
第一行提示了,發生變更的文件。下方則是修改的內容,紅色表示刪除的內容、綠色是新增的內容。
版本庫中刪除文件
方式一:在工作區中刪除文件,隨后git add所刪除的文件,最后git commit提交。
方式二:使用命令
git rm 文件名
使用該命令后,工作區、暫存區的文件會被刪除,隨后我們需要進行一次提交(git commit),這樣倉庫中的文件也會刪除完畢。
.gitignore忽略文件
這個文件的作用是可以讓我們忽略掉一些不應該被加入到版本庫中的文件,這樣可以讓我們的倉庫體積更小,更加干凈。
在工作目錄下新建一個.gitignore文件,在里面寫入要忽略的文件(也可以配合通配符進行書寫),git就會忽略與其中內容匹配的文件,不對這些文件進行版本管理。
注:如果文件已經被git所管理了,再將該文件寫入到.gitignore中,git不會忽略該文件,仍然會對該文件進行管理。
遠程倉庫的使用
遠程倉庫常見的有github、gitee、gitlab,以github為例。
注冊github賬號
打開網站:https://github.com/
點擊右上角的 Sign up 按鈕
輸入郵箱、密碼、用戶名、是否接收推送,隨后做一個簡單的驗證,輸入郵箱所接收到的驗證碼,隨后選擇開發團隊等 即可完成注冊。
github上創建倉庫
readme文件是github上的md文件,用來顯示項目簡介的。
創建完成之后就是這個樣子的,什么也沒有,只有一個readme文件
SSH配置克隆倉庫
SSH配置
在用戶根目錄下,進到.ssh目錄,使用命令
ssh-keygen -t rsa -b 4096
# 輸入密鑰文件名,隨后按回車。
# 如果之前未配置過, 可不輸入密鑰文件名 直接回車,會自動生成id_rsa的密鑰文件
隨后輸入私鑰密碼(可選,增加安全性)
查看該目錄下的id_ras.pub,并將其中的內容復制。回到github頁面,點擊個人頭像,點擊settings。
選擇左側的SSH andGPG keys選項卡,點擊New SSH key
Title可以隨便輸入
克隆倉庫
在github上找到一個項目的SSH鏈接
在本地電腦 某一個目錄中使用 git clone命令,隨后該項目的文件就被克隆到本地倉庫了。
git clone 克隆地址
拉取與推送
假設所克隆的倉庫發生了更新,我們需要同步更新,則要拉取所更新的內容
git pull <remote> <branch>
如果本地對所克隆的項目進行了修改,想要上傳到遠程倉庫。
- 執行 git add 將工作區所修改的文件提交到暫存區
- git commit -m “message” 將暫存區添加到本地庫
- git push origin 推送到遠程倉庫
github將本地倉庫關聯到遠程倉庫:git remote add origin
假如,我們本地有一個倉庫,遠程倉庫中沒有內容,想把它推送到遠程上去。使用git remote add origin命令。
首先選找到github生成的遠程倉庫鏈接
然后關聯
git remote add origin git@github.com:beiszhihao/test.git
然后使用git push推送到遠程
git push -u origin master
push:將本地倉庫與遠程倉庫合并
-u:將本地倉庫分支與遠程倉庫分支一起合并,就是說將master的分支也提交上去,這樣你就可以在遠程倉庫上看到你在本地倉庫的master中創建了多少分支,不加這個參數只將當前的master與遠程的合并,沒有分支的歷史記錄,也不能切換分支
origin:遠程倉庫的意思,如果這個倉庫是遠程的那么必須使用這個選項
master:提交本地matser分支倉庫
分支
- 適合團隊協作和開發管理
- 同時并進行多個功能開發,提高了開發效率
- 各個分支再開發過程中,如果某個分支開發失敗,不會對其他分支有任何影響,失敗的分支刪除重新開始即可
(如下圖所示,項目中有一條主分支main,所有的文件都在該分支上。main分支一般為穩定的上線運行版。現在需要開發一個新功能Feature 1,那么開發人員就在main分支的基礎上創建一條分支Feature 1,與main分支中文件完全相同。在開發完畢后,在合并到main分支上。)
創建分支
要完成開發新功能,維修BUG等任務,不會直接在main分支上進行修改。會新建一個分支修改代碼
git branch 分支名
# 根據對當前選定分支創建分支
查看分支
查看所有的分支,一個項目初始化時會默認創建main(master)分支
git branch
切換分支
要在不同的分支之間完成不同的任務,或要進行合并等操作,需要切換到不同的分支進行工作。
git checkout 分支名git switch 分支名
刪除分支
一般在開發完畢、并已經合并推送后,會刪除已完成任務的分支。
git branch -D 分支名# 刪除遠程倉庫中的分支
git push origin --delete 遠程分支名
合并分支
在完成功能開發后,要將修改的內容合并到原來的基礎之上,一般是將feature分支 合并到 dev分支上。
# 把指定的分支合并到當前分支上
git merge 需要合并的分支名
如下圖,圖中的main和dev僅作參考。一般是在dev分支上,創建feature分支進行工作。在圖中main:3的基礎上創建分支,
隨后開發dev分支。開發完畢后,合并回main分支。
合并沖突
如果兩個分支修改了同一文件中的同一部分,Git就不知道要保留哪個分支中的內容,沖突也就發生了。
方式一:通過手動合并文件中的內容,相當于人為手動的決定了哪些內需要保留,沖突也就解決了。
方式二:利用rebase命令
# 格式
git rebase 分支名
已下圖為例,這是一開始的情況,dev分支是以main:3這個節點為基礎創建的分支。但之后,有人合并且提交了main:4、main:5。
而且這兩個改動還對相同文件中的相同部分進行了修改,所以和dev分支發生了沖突。那么
# 以main:3為基點開發
git pull origin main # 從遠程倉庫拉取最新main分支、拉取到了新改動main:4、main:5
# git merge main 發現發生了沖突
git switch dev # 切換到dev分支
git rebase main # 將dev變基為main
**變基之后:**如下圖所示,變基之后,相當于dev分支已main:5為基礎創造了一個分支。相當于改變了創建分支時的基點,在最新版本的main:5上進行修改內容,隨后進行內容合并,最后解決沖突。
merge和rebase的優缺點(重要)
讓我們舉一個例子,如果我們有一個項目在master分支上有3個commit作為commit1、2、3,而feature分支commit作為commit A
和B。如果我們執行git merge操作,則commit A和B將作為commit4合并到master分支中。其中分支上commit的日志是完整的。
優勢:
- 日志非常詳盡,可以幫助理解每次merge發生的方式和時間的完整歷史。
- 發現錯誤并解決它們很容易。
缺點 - 導致笨拙的日志/歷史記錄
- 不是很人性化
Git Rebase 這種技術中,日志在merge之后被修改。
讓我們舉一個例子,如果我們有一個項目在master分支上有3個commit作為commit1、2、3。而feature分支commit作為commitA和B。如果我們執行git rebase操作,則commit A和B將作為commit4和5重新基于master分支,并且將沒有feature分支的日志。
缺點:無法跟蹤在目標分支上合并commit的時間和方式
提交合并
在分支上開發時,可能在本分支中進行多次提交。與此同時,其他人也會在其他分支進行開發。
此時,如果合并代碼,不同分支不同的commit記錄會犬牙交錯在一起。
再或者由于某些原因,導致需要代碼回滾,由于commit記錄太復雜,無法準確回退到指定版本。
此時,如果能夠把我們在同一分支的commit合并為一個commit,然后merge到目標分支,事情將會變得簡單起來。
使用以下命令,可以將一個分支中的多次提交合并成一次提交,最終合并到目標分支上就只會呈現一次conmmit。
git merge --squash
GitHub工作流(多人協作,僅作參考)
- git clone 將項目克隆到本地倉庫(假設該項目中有main、dev分支,main是穩定上線版代碼,dev開發分支)
- git switch dev 然后根據 dev 分支新建 my_feature分支 用于開發
- 在my_feature上修改好代碼 添加到暫存區 并提交(可能會有多次提交)
- 將這個my_feature推送到遠程倉庫 git push origin my_feature
- 假設在開發期間 遠程倉庫中的dev分支發生了更新 我們切換到本地的dev分支 使用git pull origin dev拉取更新
- 為了同步dev上的更新,切換到my_feature分支 并 git rebase dev,切換基點。相當于my_feature的功能基于新的dev分支開發,如果發生沖突需手動解決。
- 隨后再將本地的my_feature推送到遠程倉庫上 git push -f origin my_feature
- 隨后就需要將遠程倉庫中的 my_feature合并到dev分支上 也就是要進行 pull request
dev分支、以及main 是屬于項目的,并不屬于個人。合并一般由項目負責人進行,如下圖 如何在github上創建pull request
回到github的項目主頁,可以看到剛才提交的記錄(圖中內容僅為演示,可以理解為 我們提交了my_feature分支到項目)。接下來,點擊箭頭所指的Pull Requests選項。
點擊箭頭所指的New pull request按鈕
接下來,點擊Creat pull request即可提交成功。(本地自己提交代碼所在的分支為my_feature,共享分支為dev分支)
- 代碼改動完畢,遠程倉庫上的my_feature分支。在合并完畢后需要刪除,可能由項目負責人進行。我們刪除本地的my_feature分支即可。
- 拉取最新的main、dev分支,準備進行下一次的開發。
在IDE中使用git (工作使用更多,圖像化界面更直觀,由于IDE眾多,不作演示)
可以通過一些IDE中使用git,并通過鼠標點擊等進行操作,而不是使用git bash命令行的方式。
Git 命令大全
https://blog.csdn.net/XH_jing/article/details/121900458
參考目錄
https://www.bilibili.com/video/BV1HM411377j
https://www.bilibili.com/video/BV19e4y1q7JJ
https://www.bilibili.com/video/BV1MU4y1Y7h5
https://www.bilibili.com/video/BV1FE411P7B3
https://www.bilibili.com/video/BV1ai4y1M7FN
https://www.bilibili.com/video/BV1oKXhY9E6z
https://blog.csdn.net/2401_88244350/article/details/143321853
https://blog.csdn.net/bjbz_cxy/article/details/116703787
https://blog.csdn.net/dont_curry/article/details/134832710
https://blog.csdn.net/feverfew1/article/details/135441302