在小葉哥github庫里,已詳細對每個git操作做出分析(還包含了很多原理級別的)碎绎。而我自己當初,在要接觸git時抗果,也是徘徊在門外兜兜轉轉筋帖,最后因為工作需要,天天摸索冤馏,才總算入了門幕随。
所以,“熟能生巧”真的一點沒錯宿接。
之前把一些常用的操作記錄在紙質筆記本上,平時偶爾忘記指令可以回翻≡迹現(xiàn)在我把這些操作總結出來睦霎,希望對大家有所幫助。主要還是給自己做個電子檔備份走诞。O(∩_∩)O哈哈~
概述
Git的整個操作要素副女,可以用下圖的流程概括:
幾個主要的結構體有:
- Workspace 工作區(qū):
git init
后,當前文件夾(自己電腦上蚣旱,眼睛看得見的那個和平常文件夾一毛一樣的文件存儲區(qū)域)就是工作區(qū)碑幅。 - Index 暫存區(qū):一個臨時放置工作區(qū)編輯后文件的區(qū)域。
git add
后塞绿,有變動的文件會跑到這里來沟涨。 - Repository 本地倉庫:相當于是在自己電腦上的一個倉庫。
git init
后异吻,你會發(fā)現(xiàn)當前文件夾多了一個.git
的隱形文件夾裹赴,這里就存放著本地倉庫的版本相關內容。 - Remote 遠程倉庫:這個是一個聯(lián)網的在某個服務器上的庫诀浪,我們一般使用github或者gitlab等棋返。若希望別人能遠程下載
clone
你的文件,就必須放到遠程倉庫雷猪。
接下來睛竣,我們簡單捋一捋這個過程:
下行路程:作為小前端的我在本地電腦(工作區(qū))上的一個文件夾下進行初始化git init
,緊接著馬不停蹄的擼了一把代碼求摇,保存為file.html ------------> 通過 add
射沟,把file.html放到了暫存區(qū) ------------> 然后又通過 commit
殊者,把file.html送到了本地倉庫 ------------> 最后通過 push
,把file.html推送到了遠程倉庫躏惋。
上行路程:這個月拿到激勵金的我買了臺筆記本幽污,想把之前擼過的file.html工程下載到這臺電腦上。先獲得遠程庫里對應工程的地址(一個xxx.git的下載地址)------------> 通過 clone
簿姨,把file.html所在工程下載到了本地倉庫(操作指令的文件路徑下距误,會自動初始化為本地倉庫)。------------> 通過 checkout
扁位,把file.html檢出到了工作區(qū)准潭。
常用指令說明
我的入門參考過阮大大博客,也入手過圖靈的教材域仇。但真正比較有感知的還是廖雪峰大大的git教程系列刑然。這個教程雖然有一點點年代了,但作為入門一點都不過時暇务。只要按照步驟一步一步的走一遍泼掠,就能大體體味Git操作到底是什么個鬼東西了。
此處我是精煉出指令來垦细,以備查閱择镇。
1 創(chuàng)建版本庫
#初始化版本庫
git init
#添加工作區(qū)變動到暫存區(qū)
git add
#添加暫存區(qū)內容到本地倉庫
git commit
#查看倉庫狀態(tài)(工作區(qū)的變動文件是紅色,暫存區(qū)的文件是綠色括改,也會有相關提示操作的語句)
git status
#查看文件修改(本地倉庫和工作區(qū)比較)
git diff file1.txt
2 版本回退
#查看提交日志(`git commit` 時腻豌,附錄的說明)
git log
#查看提交日志(單行顯示,看起來會更簡潔)
git log --pretty=oneline
#回退上一個版本
git reset --hard HEAD^
# HEAD 當前版本
# HEAD^ 上一個版本
# HEAD^^ 上上一個版本
# HEAD~100 往上100個版本
#查看每一次命令(可以查看commit id嘱能,用以查找版本)
git reflog
#指定到commit id為3628164版本(實際的commit id數字串很長吝梅,可以不寫全)
git reset --hard 368164
3 撤銷修改
#把工作區(qū)的修改撤銷(丟棄工作區(qū)修改)
git checkout -- file1.txt
# 注意:
# 1. 若file1.txt沒有add,上面的指令會讓工作區(qū)回到版本庫相同的狀態(tài)惹骂;
# 2. 若file1.txt已經add到了暫存區(qū)苏携,上面的指令會讓工作區(qū)回到暫存區(qū)狀態(tài)上
# 補充說明:checkout 是檢出的意思,也就是從本地倉庫提取指定文件來覆蓋工作區(qū)的文件析苫。
# 暫存區(qū)是工作區(qū)和本地倉庫中間的一個橋梁兜叨,所以檢出時候會先到暫存區(qū)去探究下,若沒有再到本地倉庫取衩侥。
#把暫存區(qū)的修改撤銷国旷,修改只保留在了工作區(qū)
git reset HEAD file1.txt
#若希望把已添加暫存區(qū)的修改丟棄,就得分別執(zhí)行兩步: 先撤銷暫存區(qū)的修改(此時修改還在工作區(qū))茫死,再撤銷工作區(qū)的修改跪但。
git reset HEAD file1.txt
git checkout -- file1.txt
# 注意:以上兩行代碼會讓臨時修改的代碼徹底消失,謹慎操作。
4 刪文件
#1. 直接在工作區(qū)的文件夾把文件刪除(右鍵-刪除)
#2. 若確定要刪除屡久,繼續(xù)執(zhí)行以下指令
git rm file2.txt
git commit
#3. 若誤刪了忆首,可以使用撤銷修改
git checkout -- file2.txt
5 遠程庫 origin
5.1 添加遠程庫
#1. 關聯(lián)
git remote add origin git@server:path/repo.git
#2. 第一次推送 -u:是對本地master與遠程master分支進行關聯(lián)
git push -u origin master
#3. 以后的推送
git push origin master
# 或者
git push
5.2克隆遠程庫
#1. 關聯(lián)
git clone git@server:path/repo.git
#也支持https協(xié)議,但速度會偏慢
5.3查看遠程庫
# 列出遠程庫被环,遠程庫默認名稱origin
git remote
#顯示遠程庫信息
git remote -v
#查看遠程庫詳細信息
git remote show [origin]
5.4 向遠程庫推送分支
# 推送 master 分支
git push origin master
# 推送 dev 分支
git push origin dev
5.5從遠程庫拉取分支
# 方法一
# 獲取遠程所有分支
git fetch
# 查看所有遠程分支
git branch -r
# 在本地新建一個同名分支糙及,并與該遠程分支關聯(lián)
git checkout same_name_origin
#注意:不要使用 git checkout origin/mybranch ,會進入detached head狀態(tài)筛欢,不會在本地新建分支浸锨。
# 方法二
# 語法
git checkout -b 本地分支名 origin/遠程分支名
# 比如
git checkout -b dev2 origin/dev2
6 分支管理 branch
6.1 創(chuàng)建、合并分支
# 創(chuàng)建并切換到分支dev
git checkout -b dev
# 上面的指令等于下面兩條指令的集合
# 創(chuàng)建分支
git branch dev
# 切換分支
git checkout dev
# 查看當前所有分支
git branch
# 查看當前所有分支版姑,包括遠程分支
git branch -a
# 推送分支:把dev分支推送到遠程庫
git push origin dev
# ... 在dev分支上做編輯柱搜,并add、commit等操作后
# 切回master分支
git checkout master
# ... dev分支上的修改不會出現(xiàn)在master分支上
# 把dev分支合并到master分支:可以把dev上的修改同步到master
git merge dev
# 刪除dev分支(注意:不能在dev分支上刪除dev分支)
git branch -d dev
6.2 查看兩個分支區(qū)別
# 查看兩個分支區(qū)別剥险,將結果輸出到指定文件
#1. 覆蓋方式:若執(zhí)行指令的路徑下已經有file1.diff聪蘸,會進行覆蓋
git diff [branchA] [branchB] > file1.diff
#2. 追加方式
git diff [branchA] [branchB] >> file1.diff
#3. 顯示出所有有差異的文件列表
git diff branch1 branch2 --stat
#4. 顯示指定文件的詳細差異
git diff branch1 branch2 [filepath]
#5. 顯示出所有有差異的文件的詳細差異
git diff branch1 branch2
# 查看分支創(chuàng)建時間
git reflog show --date=iso branchA
6.3 解決合并沖突
當使用merge
操作合并時,若兩個分支修改了相同位置內容表制,就會出現(xiàn)沖突健爬。
可以具體查看發(fā)生沖突的文件,文件里頭會有<<<<
====
>>>>
來標記出同一位置么介,不同分支各自的內容塊浑劳。然后由我們來選擇保留想要留下的內容,刪除不要的內容以及標記符號夭拌。保存、add衷咽、commit鸽扁,即可。
# ... 假設當前在master分支上镶骗,要合并dev分支
git merge dev
# ... 發(fā)生了沖突
# 1. 查看沖突發(fā)生文件:一般在進行git merge 時就會有提示文字
git status
# 2. 處理沖突:打開產生沖突的文件桶现,進行主觀編輯,然后保存
# 3. 之后進行正常的更新文件操作
git add
git commit -m "fix conflict"
# 最后鼎姊,如果想要查看分支合并圖
git log --graph --pretty=oneline --abbrev-commit
6.4 分支管理策略
分支是版本管理工具的一大特色骡和。如何來管理分支,不同人不同團隊采用的也不一樣相寇。
有兩篇博文可以參考下:源代碼主干分支開發(fā)四大模式 和 英文版的 A successful Git branching model慰于。
團隊開發(fā)中,一般會有以下幾種分支分類(僅供參考):
- master - 主分支唤衫,時刻與遠處同步
- dev - 開發(fā)分支婆赠,團隊成員在此分支上工作
- bug - 本地修復bug分支,可以不推送到遠程
- feature - 新功能分支佳励,若是團隊合作休里,可以push到遠程
關于分支合并蛆挫,分為兩種模式:快速模式和普通模式。
# 快速模式:上面使用的合并模式妙黍。
git merge dev
# 普通模式:以非 “Fastforward” 模式合并悴侵,合并后歷史記錄有分支,能看出合并過
git merge --no-ff -m "merge with noff" dev
# 目前我都是用普通模式拭嫁。 0 0 因為我使用快速模式的時候可免,都會自動進入 -m 編寫提示文字模塊。還沒有去仔細研究為何這樣噩凹。
6.5 Bug分支 git stash:保存工作現(xiàn)場
場景模擬:
... 在dev分支上熱火朝天干活ING ... 但完整模塊還沒有完成巴元,并不想提交
... 但線上出現(xiàn)緊急bug需要修復,必須切到master分支修改bug ...
... 該如何是好 ... 別怕驮宴!我們有 git stash 來保存當前工作現(xiàn)場
# 在dev分支上逮刨,保存當前工作現(xiàn)場
git stash
# ... 切到master分支上,進行bug修復 ...
git checkout master
# 創(chuàng)建修復bug新分支 issue-101
git checkout -b issue-101
# ... 修改代碼后
git add
git commit -m "fix bug 101"
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101
# ... 切回到dev分支堵泽,要繼續(xù)之前的工作 ...
git checkout dev
# 查看保存的工作現(xiàn)場
git stash list
# 恢復并刪除stash內容
git stash pop
# 以上 git stash pop 等同于下面兩條指令
# 恢復工作現(xiàn)場
git stash apply
# 刪除stash內容
git stash drop
注意:在dev分支創(chuàng)建的stash內容修己,是屬于本地庫的,而不隸屬于分支迎罗。所以如果當前的工作現(xiàn)場睬愤,我希望在其他分支進行編輯提交,就可以在其他分支上進行 git stash pop
纹安。
6.6 給分支添加描述
#給當前分支添加描述
git branch --edit-description
#執(zhí)行上面指令尤辱,界面會進入一個編輯界面,可以按【insert】鍵厢岂,然后在里面噼里啪啦寫下你的感言
#寫完后光督,【Q】鍵退出編輯,然后輸入":wq!"保存退出塔粒。
#查看分支描述
git config branch.<branch>.description
注意:
- 分支描述是保存在
.git/config
下的结借,是本地存儲,所以不能被推送卒茬。當刪除分支時船老,對應的分支描述也會一起刪除。 - 設置
git config --global branchdesc true
, 就可以將此描述推送到合并提交圃酵。即git merge --log<branch>
,分支描述會添加到合并提交消息柳畔。(此條規(guī)則我還沒有測試,你們可以先測測看郭赐。)
7 標簽 Tag
標簽的作用相當是 commit版本號的一個別稱荸镊,能方便我們回退到指定的commit。
7.1 創(chuàng)建標簽
# 切換到要打標簽的分支上
git checkout master
# 給最新提交打上標簽 v1.0
git tag v1.0
# 若想給歷史提交打標簽,可以git log查看其版本號
git log --pretty=oneline --abbrev-commit
# 假如查閱到的 commit id 是 6224937****
git tag v0.9 6224937
# 查看標簽
git tag
# 查看標簽信息
git show v0.9
# 創(chuàng)建帶有說明文字的標簽
git tag -a v1.0 -m "version 1.0 released"
# 把標簽推送到遠程
git push origin v0.1
# 一次性全部推送
git push origin --tags
# 獲取遠程tag
git fetch origin tag <tagname>
7.2 刪除標簽
#本地刪除標簽
git tag -d v1.0
# 若標簽已推送到遠程躬存,要刪除就得兩步:先本地刪除张惹、再遠程刪除
git tag -d v1.0
git push origin :refs/tags/v1.0
7.3 刪除遠程tag
git push origin --delete tag <tagname>
也可以使用推送一個空分支到遠程分支,其實就相當于刪除遠程分支:
# 推送一個空分支到遠程分支
git push origin :<branchName>
# 推送一個空tag到遠程tag
git tag -d <tagname>
git push origin :refs/tags/<tagname>
以上兩種語法岭洲,作用完全相同宛逗。
8 遠程分支的相關操作
8.1 查看遠程分支
加上 -a
參數可以查看遠程分支,遠程分支會用紅色表示出來(如果開了顏色支持的話)
git branch -a
8.2 刪除遠程分支
git push origin --delete <branchName>
(8) 查看分支的創(chuàng)建時間
git reflog show --date=iso master
參考文章: