Git學(xué)習(xí)

本文引用:Git學(xué)習(xí)

例子

例1:張三和李四需要對圖書館中同一本書,進行修改。

圖書館會將這本書最新修訂版本分發(fā)給張三和李四负蚊。

張三袍辞,李四修改完成后送給圖書館贸宏。

問題:倘若不存在圖書館,或圖書館無意間被毀了磕洪,怎么辦吭练?張三和李四無法得知互相修改內(nèi)容?

image

例2:一本正在編寫的書需要張三和李四編寫析显。

張三在自己的書上寫了最新內(nèi)容鲫咽,李四也在自己的書上寫了最新內(nèi)容。

兩個人只需把各自修改的地方告訴對方即可。之后兩個人手中的書都是最新內(nèi)容分尸。

減少了圖書館锦聊,也減少很多不確定因素。

image

背景

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ū)中未提交的改動。

使用

image
  • 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
  • 查看倉庫地址
    • 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文件
    • 將需要忽略的文件名稱填寫到該文件即可
  • 示例:
## 忽略項目跟目錄下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 - 分布式工作流程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灼伤,隨后出現(xiàn)的幾起案子触徐,更是在濱河造成了極大的恐慌,老刑警劉巖狐赡,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撞鹉,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機鸟雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門享郊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孝鹊,你說我怎么就攤上這事炊琉。” “怎么了又活?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵苔咪,是天一觀的道長。 經(jīng)常有香客問我皇钞,道長悼泌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任夹界,我火速辦了婚禮,結(jié)果婚禮上隘世,老公的妹妹穿的比我還像新娘可柿。我一直安慰自己忆畅,他們只是感情好馏予,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澄步,像睡著了一般械媒。 火紅的嫁衣襯著肌膚如雪目锭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天纷捞,我揣著相機與錄音痢虹,去河邊找鬼。 笑死主儡,一個胖子當(dāng)著我的面吹牛奖唯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糜值,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丰捷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寂汇?” 一聲冷哼從身側(cè)響起病往,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骄瓣,沒想到半個月后停巷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年叠穆,在試婚紗的時候發(fā)現(xiàn)自己被綠了少漆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡硼被,死狀恐怖示损,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚷硫,我是刑警寧澤检访,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站仔掸,受9級特大地震影響脆贵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜起暮,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一卖氨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧负懦,春花似錦筒捺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颗品,卻和暖如春肯尺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躯枢。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工则吟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闺金。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓逾滥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親败匹。 傳聞我的和親對象是個殘疾皇子寨昙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容