本文引用:Git學(xué)習(xí)
例子
例1:張三和李四需要對圖書館中同一本書,進行修改。
圖書館會將這本書最新修訂版本分發(fā)給張三和李四负蚊。
張三袍辞,李四修改完成后送給圖書館贸宏。
問題:倘若不存在圖書館,或圖書館無意間被毀了磕洪,怎么辦吭练?張三和李四無法得知互相修改內(nèi)容?
例2:一本正在編寫的書需要張三和李四編寫析显。
張三在自己的書上寫了最新內(nèi)容鲫咽,李四也在自己的書上寫了最新內(nèi)容。
兩個人只需把各自修改的地方告訴對方即可。之后兩個人手中的書都是最新內(nèi)容分尸。
減少了圖書館锦聊,也減少很多不確定因素。
背景
Linus在1991年創(chuàng)建了開源的Linux箩绍,從此孔庭,Linux系統(tǒng)不斷發(fā)展,已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了材蛛。
Linus雖然創(chuàng)建了Linux圆到,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為Linux編寫代碼卑吭,那Linux的代碼是如何管理的呢芽淡?
事實是,在2002年以前豆赏,世界各地的志愿者把源代碼文件通過diff的方式發(fā)給Linus挣菲,然后由Linus本人通過手工方式合并代碼!
你也許會想掷邦,為什么Linus不把Linux代碼放到版本控制系統(tǒng)里呢白胀?不是有CVS、SVN這些免費的版本控制系統(tǒng)嗎耙饰?因為Linus堅定地反對CVS和SVN纹笼,這些集中式的版本控制系統(tǒng)不但速度慢,而且必須聯(lián)網(wǎng)才能使用苟跪。有一些商用的版本控制系統(tǒng)廷痘,雖然比CVS、SVN好用件已,但那是付費的笋额,和Linux的開源精神不符。
不過篷扩,到了2002年兄猩,Linux系統(tǒng)已經(jīng)發(fā)展了十年了,代碼庫之大讓Linus很難繼續(xù)通過手工方式管理了鉴未,社區(qū)的弟兄們也對這種方式表達了強烈不滿枢冤,于是Linus選擇了一個商業(yè)的版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神铜秆,授權(quán)Linux社區(qū)免費使用這個版本控制系統(tǒng)淹真。
安定團結(jié)的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人聚集连茧,不免沾染了一些梁山好漢的江湖習(xí)氣核蘸。開發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其實也不只他一個)巍糯,被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不錯!)客扎,于是BitMover公司怒了祟峦,要收回Linux社區(qū)的免費使用權(quán)。
Linus可以向BitMover公司道個歉徙鱼,保證以后嚴(yán)格管教弟兄們宅楞,嗯,這是不可能的疆偿。實際情況是這樣的:
Linus花了兩周時間自己用C寫了一個分布式版本控制系統(tǒng)咱筛,這就是Git!一個月之內(nèi)杆故,Linux系統(tǒng)的源碼已經(jīng)由Git管理了迅箩。
基本概念
工作區(qū):就是電腦里能看到的目錄。
暫存區(qū):英文叫 stage 或 index处铛。一般存放在 .git 目錄下的 index 文件(.git/index)中饲趋,所以我們把暫存區(qū)有時也叫作索引(index)。
版本庫:工作區(qū)有一個隱藏目錄 .git撤蟆,這個不算工作區(qū)奕塑,而是 Git 的版本庫。
圖中左側(cè)為工作區(qū)家肯,右側(cè)為版本庫龄砰。在版本庫中標(biāo)記為 "index" 的區(qū)域是暫存區(qū)(stage/index),標(biāo)記為 "master" 的是 master 分支所代表的目錄樹讨衣。
圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標(biāo)"换棚。所以圖示的命令中出現(xiàn) HEAD 的地方可以用 master 來替換。
圖中的 objects 標(biāo)識的區(qū)域為 Git 的對象庫反镇,實際位于 ".git/objects" 目錄下固蚤,里面包含了創(chuàng)建的各種對象及內(nèi)容。
當(dāng)對工作區(qū)修改(或新增)的文件執(zhí)行 git add 命令時歹茶,暫存區(qū)的目錄樹被更新夕玩,同時工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區(qū)的文件索引中惊豺。
當(dāng)執(zhí)行提交操作(git commit)時燎孟,暫存區(qū)的目錄樹寫到版本庫(對象庫)中,master 分支會做相應(yīng)的更新尸昧。即 master 指向的目錄樹就是提交時暫存區(qū)的目錄樹缤弦。
當(dāng)執(zhí)行 git reset HEAD 命令時,暫存區(qū)的目錄樹會被重寫彻磁,被 master 分支指向的目錄樹所替換碍沐,但是工作區(qū)不受影響。
當(dāng)執(zhí)行 git rm --cached <file> 命令時衷蜓,會直接從暫存區(qū)刪除文件累提,工作區(qū)則不做出改變。
當(dāng)執(zhí)行 git checkout . 或者 git checkout -- <file> 命令時磁浇,會用暫存區(qū)全部或指定的文件替換工作區(qū)的文件斋陪。這個操作很危險,會清除工作區(qū)中未添加到暫存區(qū)中的改動置吓。
當(dāng)執(zhí)行 git checkout HEAD . 或者 git checkout HEAD <file> 命令時无虚,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個命令也是極具危險性的衍锚,因為不但會清除工作區(qū)中未提交的改動友题,也會清除暫存區(qū)中未提交的改動。
使用
workspace:工作區(qū)
staging area:暫存區(qū)/緩存區(qū)
local repository:版本庫或本地倉庫
remote repository:遠程倉庫
基本使用
命令 | 說明 |
---|---|
git init | 初始化倉庫 |
git clone | 拷貝一份遠程倉庫戴质,也就是下載一個項目度宦。。 |
git add | 添加文件到暫存區(qū) |
git status | 查看倉庫當(dāng)前的狀態(tài)告匠,顯示有變更的文件戈抄。 |
git diff | 比較文件的不同,即暫存區(qū)和工作區(qū)的差異后专。 |
git commit | 提交暫存區(qū)到本地倉庫划鸽。 |
git rebase | 可用于commit壓縮(合并多個commit為單個commit) |
git reset | 回退版本。 |
git rm | 刪除工作區(qū)文件戚哎。 |
git mv | 移動或重命名工作區(qū)文件裸诽。 |
git log | 查看歷史提交記錄 |
git blame <file> | 以列表形式查看指定文件的歷史修改記錄 |
git remote | 遠程倉庫操作 |
git fetch | 從遠程獲取代碼庫 |
git pull | 下載遠程代碼并合并 |
git push | 上傳遠程代碼并合并 |
git branch [new branch name] | 沒有參數(shù)時,git branch 會列出你在本地的分支建瘫。<br />指定 [new branch name]則會在本地創(chuàng)建新分支 |
git checkout [-b] (branch name) | 執(zhí)行:git checkout (branch name)時會切換到指定分支崭捍。<br />執(zhí)行:git checkout (new branch name)時會創(chuàng)建新分支并切換到該分支上。 |
git branch -d (branch name) | 刪除本地指定分支 |
git push origin --delete (remote branch name) | 刪除遠程分支啰脚,同時也會刪除本地分支 |
git merge (other branch name) | 合并分支:將其他分支內(nèi)容合并當(dāng)前分支中 |
使用
git --help
查看更多命令
- git初始化:
git init
# 在一個目錄執(zhí)行殷蛇,會生成.git目錄文件 - 克隆遠程倉庫代碼到本地:
-
git clone http://xxx
# 執(zhí)行完成后,會在所在目錄下生成一個名稱為項目名稱的目錄/文件夾
-
- 拉取遠程倉庫最新代碼:
-
git pull
# 此步驟更多的是在執(zhí)行git push
前執(zhí)行橄浓,否則可能會提示merge或push失敗粒梦。
-
- 提交文件到遠程倉庫:假定當(dāng)前所在分支:
main
- 將文件加到暫存區(qū):
git add test.txt
- 將文件提交到本地倉庫:
git commit -m "add test.txt file"
- 推送到遠程倉庫:
git push -u origin main
- 將文件加到暫存區(qū):
- 查看倉庫地址
git remote -v
- 查看分支
- 查看本地分支:
git branch
- 查看所有分支(包含遠程分支):
git branch -a
- 查看本地分支:
- 刪除分支
- 本地分支:
git branch -d (branch name)
- 遠程分支:
git push origin -d (branch name)
- 本地分支:
高級使用
分支合并
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test) ## 當(dāng)前分支:main分支
$ vi test.txt ## 編輯內(nèi)容
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ echo "test merge branch" >> merge.txt ## 新增一個merge.txt文件
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ ls
README.md merge.txt test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ git add . ## add所有修改到暫存區(qū)
warning: LF will be replaced by CRLF in merge.txt.
The file will have its original line endings in your working directory
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ git commit -m "test merge" ## 提交到本地倉庫
[test 2af25aa] test merge
2 files changed, 3 insertions(+)
create mode 100644 merge.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ git checkout main ## 切換到main分支
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main) ## 當(dāng)前分支:main分支
$ ls ## 此時main分支下只有2個文件
README.md test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ cat test.txt ## 查看test.txt也沒有新內(nèi)容
test in main branch
test cherry-pick
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git merge test ## 將test分支合并到當(dāng)前的main分支
CONFLICT (add/add): Merge conflict in test.txt
Auto-merging test.txt
Automatic merge failed; fix conflicts and then commit the result.
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ ls ## 再次查看,發(fā)現(xiàn)多了個文件
README.md merge.txt test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ cat test.txt ## 再次查看文件內(nèi)容荸实,發(fā)現(xiàn)新增了其他內(nèi)容匀们。并產(chǎn)生合并沖突
## 1. 之前執(zhí)行g(shù)it merge test時已經(jīng)提示有沖突,關(guān)鍵字:CONFLICT)准给。
## 2. 從當(dāng)前分支名稱(main|MERGING)也能區(qū)分產(chǎn)生沖突
test in main branch
test cherry-pick
<<<<<<< HEAD
=======
============
test branch merge
>>>>>>> test
合并出現(xiàn)分支沖突
合并過程中泄朴,出現(xiàn)文件內(nèi)容沖突問題重抖。
合并時出現(xiàn)CONFLICT
字樣。
- 執(zhí)行合并命令
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git merge test
CONFLICT (add/add): Merge conflict in test.txt
Auto-merging test.txt
Automatic merge failed; fix conflicts and then commit the result.
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ cat test.txt
test in main branch
test cherry-pick
<<<<<<< HEAD
=======
============
test branch merge
>>>>>>> test
- 手動修改沖突內(nèi)容
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ git diff ## 查看不同
diff --cc test.txt
index 2c9058d,ef3349c..0000000
--- a/test.txt
+++ b/test.txt
@@@ -1,3 -1,5 +1,8 @@@
test in main branch
test cherry-pick
++<<<<<<< HEAD
++=======
+ ============
+ test branch merge
++>>>>>>> test
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ vi test.txt ## 編輯沖突文件祖灰,解決沖突
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ git diff ## 查看不同
diff --cc test.txt
index 2c9058d,ef3349c..0000000
--- a/test.txt
+++ b/test.txt
@@@ -1,3 -1,5 +1,5 @@@
test in main branch
test cherry-pick
-============
++==================
+ test branch merge
## 以上內(nèi)容钟沛,可以看出刪除(“-”減號表示)和新增(“+”減號表示)
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ git status -s ## 檢查狀態(tài)
A merge.txt
AA test.txt
## 此時AA是紅色表示
- 標(biāo)記沖突已解決:用 git add 要告訴 Git 文件沖突已經(jīng)解決
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ git add test.txt ## add到暫存區(qū),此操作會告知git表示已經(jīng)解決沖突文件
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ git status -s ## 再次檢查狀態(tài)
A merge.txt
M test.txt
## 此時M是綠色表示
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main|MERGING)
$ git commit ## 執(zhí)行commit局扶,此時不需要加-m參數(shù)恨统。會自動進入另一個窗口。提示輸入commit信息
[main 6b431d6] Merge branch 'test' solve conflict
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git push -u origin main ## 推送到遠程倉庫
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 790 bytes | 263.00 KiB/s, done.
Total 8 (delta 2), reused 0 (delta 0), pack-reused 0
To http://gitlab.adorado.top/gaoqihua/test-parent.git
5f90207..6b431d6 main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
合并單個文件到指定分支
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main) ## 當(dāng)前分支:main分支
$ ls
README.md test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git checkout test
Switched to branch 'test'
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test) ## 當(dāng)前分支:test分支
$ ls ## 查看文件三妈,此時沒有test.txt文件
README.md
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ git checkout main test.txt ## 使用checkout命令畜埋,將main分支中根目錄下text.txt文件合并過來
Updated 1 path from fefc1a5
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ ls ## 再次查看文件,已經(jīng)存在了test.txt文件
README.md test.txt
合并commit
合并單個commit到其他分支
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test) ## 當(dāng)前分支:test分支
$ git log --oneline
bc82781 (HEAD -> test, origin/test) test cherry-pick ## 在test分支上新提交的內(nèi)容畴蒲。將此提交合并到main分支悠鞍。log id:bc82781
744cf22 merge test
8fc010f Initial commit
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (test)
$ git checkout main ## 切換到main分支
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main) ## 當(dāng)前分支:main分支
$ git cherry-pick bc82781 ## 執(zhí)行cherry-pick,指定log id饿凛。將指定commit合并到當(dāng)前分支
[main f4533ec] test cherry-pick
Date: Mon Feb 28 15:26:42 2022 +0800
1 file changed, 2 insertions(+)
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ cat test.txt
test in main branch
test cherry-pick
多個commit成一個commit
- 場景:有時合并分支時狞玛,由于分支commit太多,會造成合并后main分支log太多涧窒,需要合并分支前先合并commit
$ git log --oneline
4ee51d6 docs(user): update user/README.md
176ba5d docs(user): update user/README.md
5e829f8 docs(user): add README.md for user
f40929f feat(user): add delete user function
fc70a21 feat(user): add create user function
7157e9e docs(docs): append test line 'update3' to README.md
5a26aa2 docs(docs): append test line 'update2' to README.md
55892fa docs(docs): append test line 'update1' to README.md
89651d4 docs(doc): add README.md
可以看到我們提交了 5 個 commit心肪。接下來,我們需要將 feature/user分支的改動合并到 master 分支纠吴,但是 5 個 commit 太多了硬鞍,我們想將這些 commit 合并后再提交到 master 分支。
接著戴已,我們合并所有 commit固该。在上一步中,我們知道 fc70a21是 feature/user分支的第一個 commit ID糖儡,其父 commit ID 是 7157e9e伐坏,我們需要將7157e9e之前的所有分支 進行合并,這時我們可以執(zhí)行:
$ git rebase -i 7157e9e
執(zhí)行命令后握联,我們會進入到一個交互界面桦沉,在該界面中,我們可以將需要合并的 4 個 commit金闽,都執(zhí)行 squash 操作纯露,如下圖所示:
修改完成后執(zhí)行:wq 保存,會跳轉(zhuǎn)到一個新的交互頁面代芜,在該頁面埠褪,我們可以編輯 Commit Message,編輯后的內(nèi)容如下圖所示:
開頭的行是 git 的注釋,我們可以忽略掉钞速,在 rebase 后贷掖,這些行將會消失掉。修改完成后執(zhí)行:wq 保存玉工,就完成了合并提交操作羽资。
除此之外,這里有 2 個點需要我們注意:
- git rebase -i 這里的一定要是需要合并 commit 中最舊 commit 的父 commit ID遵班。
- 我們希望將 feature/user 分支的 5 個 commit 合并到一個 commit,在 git rebase 時潮改,需要保證其中最新的一個 commit 是 pick 狀態(tài)狭郑,這樣我們才可以將其他 4 個 commit 合并進去。
然后汇在,我們用如下命令來檢查 commits 是否成功合并翰萨。可以看到糕殉,我們成功將 5 個 commit 合并成為了一個 commit:d6b17e0
亩鬼。
$ git log --oneline
d6b17e0 feat(user): add user module with all function implements
7157e9e docs(docs): append test line 'update3' to README.md
5a26aa2 docs(docs): append test line 'update2' to README.md
55892fa docs(docs): append test line 'update1' to README.md
89651d4 docs(doc): add README.md
此時,就可以將d6b17e0
合并到其他分支即可阿蝶。
撤銷add
撤銷所有add
針對add時雳锋,不小心將很多文件都add了。需要撤銷這些add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ vi test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff ## 編輯完成后使用diff查看不同
diff --git a/test.txt b/test.txt
index 2c9058d..3a91585 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,5 @@
test in main branch
test cherry-pick
+===================================
+test: cancel add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git add test.txt ## 執(zhí)行add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff ## 執(zhí)行add后查看不同羡洁,顯示沒有任何不同玷过。說明沒有新的修改需要add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git reset head ## 撤銷,將整體修改撤銷add操作
Unstaged changes after reset:
M test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff ## 再次查看不同筑煮,發(fā)現(xiàn)已經(jīng)恢復(fù)到跟之前修改后執(zhí)行diff結(jié)果一樣
diff --git a/test.txt b/test.txt
index 2c9058d..3a91585 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,5 @@
test in main branch
test cherry-pick
+===================================
+test: cancel add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$
撤銷單個文件
針對add時辛蚊,不小心包含個別文件,只需要對個人文件撤銷add真仲。如果執(zhí)行git reset head
很不劃算袋马。
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ vi test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff ## 編輯完成后使用diff查看不同
diff --git a/test.txt b/test.txt
index 2c9058d..3a91585 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,5 @@
test in main branch
test cherry-pick
+===================================
+test: cancel add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git add test.txt ## 執(zhí)行add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff ## 執(zhí)行add后查看不同,顯示沒有任何不同秸应。說明沒有新的修改需要add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git reset head test.txt ## 只需要指定撤銷的文件即可虑凛。
Unstaged changes after reset:
M test.txt
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff
diff --git a/test.txt b/test.txt
index 2c9058d..3a91585 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,5 @@
test in main branch
test cherry-pick
+===================================
+test: cancel add
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$
- 如果此時發(fā)現(xiàn)該文件不應(yīng)該被修改,恢復(fù)修改前內(nèi)容灸眼∥蚤埽可以執(zhí)行以下內(nèi)容:
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git checkout -- test.txt ## 將文件回滾到上一次操作
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ git diff
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$ cat test.txt
test in main branch
test cherry-pick
Administrator@DESKTOP-G03KTBR MINGW64 /e/ideaWorkSpace/sky/test-parent (main)
$
撤銷commit
-
--mixed
撤銷到add之前的狀態(tài)
保留 本地倉庫、暫存區(qū)焰宣、以及工作區(qū)的代碼霉囚,即回到 git add . 操作之前
的狀態(tài)
-
--soft
撤銷到add之后,commit之前的狀態(tài)
保留 暫存區(qū)匕积、工作區(qū)的代碼盈罐,即回到git commit -m "提交信息" 操作之前榜跌、 git add . 操作之后
的狀態(tài)
-
--hard
撤銷到修改之前的代碼:add之前的修改都會丟失。
不會保留提交的代碼盅粪,即會造成commit的代碼以及工作區(qū)的代碼丟失钓葫,一朝回到解放前,慎用票顾!
- 假如你想丟棄你在本地的所有改動與提交础浮,可以到服務(wù)器上獲取最新的版本
git fetch origin
git reset --hard origin/main
忽略文件
推送時,防止臨時文件或IDE產(chǎn)生的文件被提交到git遠程倉庫
- 使用
.gitignore
文件- 在項目根目錄下創(chuàng)建
.gitignore
文件 - 將需要忽略的文件名稱填寫到該文件即可
- 在項目根目錄下創(chuàng)建
- 示例:
## 忽略項目跟目錄下target目錄
target/
## 忽略擴展名為log的文件
**.log
## 忽略文件名包含關(guān)鍵字的文件
*mvn*
## 指定忽略文件
### 忽略根目錄下files子目錄下aa目錄下的test.txt奠骄。此時如果aa目錄還有其他文件豆同,則會被提交到git遠程倉庫
files/aa/test.txt
標(biāo)簽
像其他版本控制系統(tǒng)(VCS)一樣,Git 可以給倉庫歷史中的某一個提交打上標(biāo)簽含鳞,以示重要影锈。 比較有代表性的是人們會使用這個功能來標(biāo)記發(fā)布結(jié)點( v1.0 、 v2.0 等等)
可以用此功能標(biāo)記項目版本問題蝉绷。
- 查看所有tag:
git tag
- 創(chuàng)建標(biāo)簽:
git tag -a [tag name] -m [tag message]
- 例如:
git tag -a v1.0 -m "my version 1.0"
- 例如:
- 查看標(biāo)簽信息:
git show v1.0
# 就會顯示標(biāo)簽信息鸭廷,創(chuàng)建時間等
特別時,新功能發(fā)布熔吗,多個bug修復(fù)時最好創(chuàng)建標(biāo)簽辆床。
分支管理
- main:主分支,在gitlab/github上創(chuàng)建新項目時自動生成分支
- dev:開發(fā)分支
- fat(Feature Acceptance Test Environment: 功能驗收測試環(huán)境):測試環(huán)境分支
- uat(User Acceptance Test Environment: 用戶驗收測試環(huán)境):用于生產(chǎn)環(huán)境下軟件測試使用(環(huán)境跟生產(chǎn)保持一致)
- hotfix: 緊急問題修復(fù)磁滚。
- 針對生產(chǎn)環(huán)境出現(xiàn)緊急問題進行修復(fù)佛吓。基于main分支拉取hotfix分支進行緊急問題修復(fù)垂攘;
- feature/devX: 新需求開發(fā)分支维雇。
- 當(dāng)有新需求時,基于dev分支創(chuàng)建feature/devX分支
- 該分支也有自己的日常新需求驗證環(huán)境晒他,新需求開發(fā)完成吱型,會將該分支代碼合并回主開發(fā)分支dev上,經(jīng)fat測試完成后實現(xiàn)交付陨仅。
參考:
Git的誕生
Git 工作區(qū)津滞、暫存區(qū)和版本庫 [菜鳥教程]
Git基本操作 [菜鳥教程]
git cherry-pick 教程 [阮一峰的網(wǎng)絡(luò)日志]
git 合并多個commit
Git撤銷已經(jīng)提交的 commit
Git工作流的分支管理的解決方案
Git 基礎(chǔ) - 打標(biāo)簽
Git 分支 - 分支管理
分布式 Git - 分布式工作流程