Git實戰進階教程

大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以?加我微信?ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信進群。

Git的功能是對文件做版本管理,其底層原理是一個對文件存取的系統,要想掌握Git,最重要的是理解commit tree,也就是提交記錄歷史,平時開發中我們都是通過分支來更新commit tree,Git的基礎就是要學會分支操作,推薦閱讀 《圖解Git分支和命令》。

在日常開發中,只掌握分支操作是不夠的,還需要通過各種命令操作commit tree,本文我們選擇5個典型場景,介紹一下 Git 的進階技巧,如下所示,學會這些技巧,可以極大提高工作中Git使用的效率:

  • ??選擇版本

  • ??搜索調試

  • ??重寫歷史

  • ??重置揭秘

  • ??高級合并

選擇版本

假設當前版本庫如下圖所示,有時我們可能先找到當前提交的父提交和祖先提交,^和~可以滿足我們的需求。

^和~都匹配當前提交的父提交,^和~匹配父提交的父提交,^和~后面跟數字的時候意義是不同的,具體可以看下面的例子,假設有如下圖所示的提交樹:

d1b48fcf2c1634e486447016fbbe45dd.png
image.png

如下的命令,可以看到^和~的區別:

$?git?log?HEAD^
A2
$?git?log?HEAD^^
A1
$?git?log?HEAD^2
B1
$?git?log?HEAD~
A2
$?git?log?HEAD~~
A1
$?git?log?HEAD~2
A1

有時候我們可能會想選擇一個區間,比如 A1,A2,A3,下面通過例子說明..,...和^的區別

$?git?log?master..test
C0?C1
$?git?log?^master?test
C0?C1
$?git?log?master…test
A1?A2?A3?C0?C1

搜索調試

A:設想這樣一種情況,某個分支 test,開發完后被刪除了,怎么找回這個分支呢?

其實 git 會在本地記錄每次 HEAD 的變化,通過 reflog 命令可以拿到這些記錄

$?git?reflog
0e94c5b?HEAD@{0}:?commit:?222
7e07aa7?HEAD@{1}:?commit:?111
c5aba97?HEAD@{2}:?commit:?000

比如 111 是 test 分支最后一個提交,我們可以去 111 這個提交,然后再新建一個分支就 ok 了

$?git?checkout?7e07aa7?#?或者git?checkout?HEAD@{1}
$?git?checkout?-b?test

B:設想這樣一種情況,某天你突然發現某行代碼寫錯了,你想快速找到這個 bug 的始作俑者?

blame 可以快速顯示文件的每一行最后一次修改是誰

$?git?blame?README.md
f6ffa8f4?(yanhaijing?2016-08-03?19:54:42?+0800?1)?123
f6ffa8f4?(yanhaijing?2016-08-03?19:54:42?+0800?1)?456

blame 時可以指定范圍

$?git?blame?-L10,15??README.md?#?查看10-15行的信息

C:設想這樣一種情況,你想在 Git 的某個歷史提交中進行搜索?

grep 只能搜索工作目錄,git grep 可以在指定提交中進行搜索

$?git?grep?yanhaijing?HEAD~27?fis-conf.js
HEAD~27:fis-conf.js:?*?@author?yanhaijing.com

D:設想這樣一種情況,你想在 Git 的整個歷史中進行搜索?git log 可以實現這個功能

$?git?log?-Syanhaijing?--oneline
0a191c?message?aaa

E:設想這樣一種情況,某一天你突然發現線上代碼掛了,但你找不到原因,你想快速找到是哪一個版本引入的 bug?

git bisect 是一個非常有用的調試工具,它通過自動進行一個二分查找來找到哪一個特定的提交是導致 bug 或者問題的第一個提交

$?git?bisect?start?#?開始
$?git?bisect?bad?#?標記為好的
$?git?bisect?good?#?標記為壞的
$?git?bisect?reset?#?結束

重寫歷史

假設你提交完后發現忘記了一些東西,打算更改上次提交,在 git 中可以使用追加提交,假設現在倉庫狀態如下所示

53695af792d5f2c49b7e89c46437314d.png
image.png

修改完后可以再次提交

$?git?add?.
$?git?commit?--amend

就可以修改上次提交,需要注意的是上一次提交并沒有被刪除,只是沒有分支引用,變成了游離狀態,在未來的某個時間會被 git 自動回收

05eafda6380d8afce66dbf3ba599c3c3.png
image.png

如果你進行了幾次提交后后悔了,想重寫之前的好幾次提交,那就只能用 rebase 了,假設目前狀態如下

0fd6fc571d1580e165c1dc97f4a77b9a.pngimage.png

假設你想重寫 A1 和 A2

$?git?rebase?-i?HEAD~2

需要注意的是已經 push 到遠端的提交,就不要再重寫了,不然世界人民會恨你,因為你需要git push -f

4c87824d4b19ac5b068103925bf8b183.png
image.png

重置揭秘

重置有兩種方法,reset 和 checkout,這兩個方法非常容易混淆,兩個命令都分為全局模式和文件模式

reset 全局模式可以用下圖總結

3fc940f59cff4ea358e542387f4a0fc6.png
image.png

reset 的文件模式可以覆蓋索引區,一個副作用就是用來取消暫存

git?reset?xxx?–?file

checkout 的全局模式可以用下圖總結

b73d0a2635284ea477d6e90418683aa6.png
image.png

checkout 的文件模式會覆蓋索引區和工作區,可以用來丟棄修改,屬于不可逆轉的操作

git?checkout?xxx?–?file

其實下圖就總結兩個命令的區別

43f0f86a6072fe571297c86962ba6934.png
image.png

高級合并

合并分支時,很多人非常害怕遇到沖突,其實沖突并不可怕

A:git 默認的沖突顯示包括 our 和 their,如果想得到和 svn 那樣包含 base+our+their 的代碼,可以檢出沖突

$?git?checkout?--conflict=diff3?hello.rb

B:如果在沖突時想想 svn 一樣得到,base+our+their 三個文件的代碼

$?git?show?:1:xxx?>?xxx.base
$?git?show?:2:xxx?>?xxx.our
$?git?show?:3:xxx?>?xxx.their

C:合并沖突一團亂麻,想撤銷合并

$?git?merge?--abort

D:合并后后悔了?想撤消合并?分為兩種情況

假如還沒推送到遠端,可以 reset 掉

$?git?reset?--hard?HEAD~
abcfc4fd7c1813a5c0f9070894dfe99e.png
image.png

如果已經推動到遠端,可以用 revert

$?git?revert?-m?1?HEAD
e638d2c60f86b06b4f502ac810e2d722.png
image.png

總結

歡迎大家閱讀本文,如果你覺得本文對你有幫助,那就點贊加關注作者吧,如果對本文有任何疑問,歡迎在評論區交流。

我在阿里招前端,我該怎么幫你?(現在還可以加模擬面試群)
如何拿下阿里巴巴 P6 的前端 Offer
如何準備阿里P6/P7前端面試--項目經歷準備篇
大廠面試官常問的亮點,該如何做出?
如何從初級到專家(P4-P7)打破成長瓶頸和有效突破
若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?

如何準備20K+的大廠前端面試

1c2d862cd507c208639f88ffbdd182b9.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經堅持寫了8年,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助4000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

f3320a767f3189d0856337961fbf12eb.jpeg

掃碼加我微信 lxchuan12、拉你進源碼共讀

今日話題

目前建有江西|湖南|湖北?籍 前端群,想進群的可以加我微信 lxchuan12?進群。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274571.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是設計模式_什么是設計?

什么是設計模式Imagine, you are out waiting for a taxi. You are about to miss your appointment. You wait for minutes but Good Lord! — there’s not a single taxi that can offer you a ride.想象一下,您正在外面等出租車。 您將錯過約會。 您等待幾分鐘&…

hive實現not in

當前HIVE 不支持 not in 中包含查詢子句的語法,形如如下的HQ語句是不被支持的: 查詢在key字段在a表中,但不在b表中的數據 select a.key from a where key not in(select key from b) 該語句在hive中不支持 可以通過left outer join進行查詢,&#xff0…

有哪些值得學習的大型 React 開源項目?

大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以 加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

成年人的樣子是什么樣子_不只是看樣子

成年人的樣子是什么樣子As a branding, packaging, and digital product designer, both at Input Logic and as a freelancer, I work with clients across a wide array of industries, and am responsible for simultaneously getting to the heart of what each client wan…

HDU 3664 Permutation Counting(DP)

題目鏈接 弱爆啦,組合弱爆了,反正是沒想出來怎么搞這個題,其實這個公式不難推啊,反正就是沒推出來。今天隊內賽,實在是沒辦法了,暴力寫了個DFS,先把10以內的打出表來,發現類似楊輝三…

如何在工作中打造影響力,帶動同事?

大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以 加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

谷歌maps菜單語言設置_Google Maps:拯救未來之路— UX案例研究

谷歌maps菜單語言設置I have a lousy sense of direction, so Google Maps has always been my right-hand app. On a whim last year, I decided to skip the beach and sunburn and head to Budapest for spring break. That’s when Google Maps became my best friend.我的…

this和prototype

this出現在構造函數中,更多的是表示一種特有的屬性; prototype主要用于拓展函數的屬性,方法。 在函數類實例化的時候,this的屬性需要復制相應的副本,prototype不用。 function Blog(title,content) { this.titletitle;…

1萬小時后,我從外包走進了字節跳動,現在出了一本書,文末送書!

謹以此書獻給相信“努力有用”的你by 大史不說話《 前端跨界開發指南:JavaScript工具庫原理解析與實戰》先做個自我介紹我是大史不說話,是一名前端工程師,一個相信“努力有用”的、不太聰明的、行動力還可以的程序員。曾經因為一篇《10000小時…

視覺設計師跟平面設計_使設計具有視覺吸引力

視覺設計師跟平面設計Interaction Design is very gratifying.交互設計非常令人滿意。 From fast critical thinking to extracting ideas in tangible forms within the team is sure fun and challenging.從快速的批判性思維到在團隊內部以有形的形式提煉想法,無…

ExtJs4 筆記 Ext.tab.Panel 選項卡

本篇講解選項卡控件。 一、基本選項卡 首先我們來定義一個基本的選項卡控件,其中每個Tab各有不同,Tab的正文內容可以有三種方式獲取: 1.基本方式:通過定義html和items的方式。 2.讀取其他html的信息:通過設置contentEl就可以獲取其他html的信…

一直刷不動算法題,懷疑人生?試試五毒掌法!

大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以 加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

還在用開發者工具上傳小程序? 快來試試 miniprogram-ci 提效摸魚

1. 前言大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以 加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含包含jQuery、underscore、lo…

ListView幾個比較特殊的屬性

Android:stackFromBottom"true" 設置該屬性之后你做好的列表就會顯示在列表的最下面,值為true和false android:transcriptMode"alwaysScroll" 要用ListView或者其它顯示大量Items的控件實時跟蹤或者查看信息,并且希望最新的…

超級瑪麗馬里奧版下載_將超級馬里奧賦予生命

超級瑪麗馬里奧版下載Have you ever seen a zoetrope? If today’s sophisticated computer animation is the latest evolution of the form, then the remarkable zoetrope is a crucial ancestor; the transitional form between the drawing and the animation.等皆你見過…

如何在繁重的工作中持續成長?

大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以 加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

Mono for Android 對話框 倒計時

UI調度:public class Dispatcher : Handler { public override void HandleMessage(Message msg) { var ai msg.Obj as ActionItem; if (ai ! null) { try { …

熊kong作品資源鏈接_Kong雀技術:向世界展示您的設計作品

熊kong作品資源鏈接The door opened and I entered the bedroom of an apartment I was looking to rent. No furniture or items inside, it was almost empty except for a frame in the wall. It was a photo of a peacock. As I stared at it, I could not shake one clear…

漫談前端工程化基建和架構設計 | 留言送書

大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以 加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。本文留言抽獎送書,具體規則看文末。透過工程基建,架構有跡可循。前…

oracle中 rownum與rowid的理

一、 Oracle分頁查詢 我們先看學習一下oracle分頁查詢的語法示例,然后在具體學習用rownum的原理。 /*從第1條開始,每次選N個,從第1M個開始每次選N個*/ /**/ select t2.* from (select rid from (select r.rid, rownum linenum from (select r…