大家好,我是若川。持續組織了近一年的源碼共讀活動,感興趣的可以?加我微信?ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列。另外:目前建有江西|湖南|湖北
籍前端群,可加我微信進群。
在工作中,發現不少同學對Git的掌握非常基礎,同樣作為版本控制系統,使用好Git比SVN要更有挑戰,需要對Git有一定的了解,才能在工作中,駕馭好Git。
本文從最簡單的基礎入門,講解工作中常用的Git基礎,掌握這些是Git進階的基礎,足夠日常工作場景。
安裝
學習 git 前,你需要先安裝 git,git 安裝流程請移步這里[1],里面有各個平臺的安裝方法
基礎
學習命令行工具要學會的第一步就是查看幫助文檔,可以用下面的命令查看 git 的幫助信息
git?help
git?help?xxx
git?xxx?--help
git?xxx?-h
接下來就是一些自定義信息了,比如配置用戶名和快捷命令(別名)
git?config?--global?user.name?yanhaijing
git?config?--global?user.email?yanhaijing@yeah.netgit?config?--global?alias.st?status?#git?st
git?config?--global?alias.co?checkout?#git?co
git?config?--global?alias.br?branch?#git?br
git?config?--global?alias.ci?commit?#git?ci
值得一提的就是配置換行符了,windows 上的換行符和 mac 和類 unix 不一樣,在跨平臺時就痛苦了,為了統一,可以將提交到倉庫的換行符同配置成 unix 格式
git?config?--global?core.autocrlf?input
如果想把 git 倉庫提交到服務器,可能還要配置秘鑰,如果你不想每次都輸入密碼的話
ssh-keygen?-t?rsa?-C?yanxuefeng@baidu.com?#?生成秘鑰cat?~/.ssh/id_rsa.pub?#?獲取公鑰,配置到github?的sshkeyssh?-T?git@github.com?#?測試是否生效
玩轉 git 的第一步,你需要有一個倉庫,獲取倉庫總共有兩種辦法
git?init?#?初始化一個倉庫
git?clone?url?#?克隆一個已有倉庫
有時候我們不想把某些文件提交到倉庫里,比如編譯產生的臨時文件,此時.gitignore 能夠發揮作用,.gitignore 的規則如下
??# 代表注釋
??每行是一個 path,glob 模式匹配
? !代表取非
??*代表 0 個或多個字符
???代表一個字符
??[]代表集合
.gitattributes 這個還沒想好怎么講,挖個坑坑坑坑
git 倉庫的工作流如下

git 的文件狀態如下

想查看當前的倉庫狀態可以使用git status
,這個命令能夠給出很多提示信息,建議經常使用
關于 commit 的提交,每個 commit 必須是獨立,完整的功能,保持適當粒度,不要過大也不要過小;關于提交信息的描述可以參考下開源屆的規范,也可以看下我之前整理的提交規范[2],下面是一個提交的例子
Header?=?type:?subject(feat?fix?style?refactor)
Body?=?listfeat:?添加分享功能給每篇博文添加分享功能?-?添加分享到微博
-?添加分享到微信
在 git 內部一個 commit 的信息如下

但后面我們會進行如下的抽象

分支
git 中的分支非常輕量,就是對 commit 的一個引用,默認 git 會新建一個 master 分支,git 中有一個特殊的引用講座 HEAD,他只想當前所在的位置

有時我們需要新建或刪除分支
git?branch?test?#?新建分支test
git?branch?–d?test?#?刪除test分支,當前HEAD必須不能指向test分支

建好分之后,就該切換到那個分支去了
git?checkout?test?#?切換到test分支
新建并切換分支,可以合并成一個命令,下面的命令等同于上面兩條命令
git?checkout?–b?test

在新建的分支上開發一段時間后,你可能需要將其合并到另一個分支去,而合并分支共有 4 種不同的方法,關于這四種方法的區別和場景請看這篇文章《圖解 4 種 git 合并分支方法》。
遠端
一張圖概括遠端和本地的關系,以及相應的操作命令

其實 git 在遠端是一個完整的倉庫,和本地其實一樣,也有 HEAD,也有 master;但我們本地為了防止沖突,都將遠端的引用名字放到了 origin 下(origin 也可是別的名字)
Remote?HEAD?->?xxx/HEAD(origin/HEAD)
Remote?master?->?xxx/master(origin/master)
在.git 下面的 config 文件里面又對應規則的配置信息,fetch 哪一行,設置將遠端refs/heads
下的放到本地的refs/remotes/origin
下
[remote?"origin"]url?=?git@github.com:yanhaijing/yanhaijing.github.io.gitfetch?=?+refs/heads/*:refs/remotes/origin/*
對于遠端最常用的操作就是更新和推送
git?fetch?origin?#?將本地的遠端和遠端進行同步
git?merge?origin/master?#?將本地的遠端合并到本地分支git?pull?origin?#?這相當于上面兩條命令git?push?origin?master?#?將本地推送到遠程分支
關于 push 的必須得說一下引用展開,下面這些命令是一樣的,git 內部都會自動展開成最后一條
git?push?origin?master
git?push?origin?master:master
git?push?origin?heads/master:heads/master
git?push?origin?refs/heads/master:refs/heads/master
有時候我們可能會查看遠端的信息,比如看下遠端地址啥的
git?remote?–v?#?查看全部遠端的摘要信息
git?remote?show?xxx?#?查看具體遠端的詳細信息
有時候我們也會增加或刪除遠端
git?remote?add?xxx?url?# 新加一個新的遠端
git?remote?remove?xxx?#?刪除一個遠端
日志
有時我們需要查看 git 的提交日志,可以使用git log
,log 有大量參數,感興趣的同學可以自行探索,但常用的就下面這么幾個
git?log?-number?#?顯示最近幾條
git?log?--oneline(--abbrev-commit?--pretty=oneline)#?單行顯示,顯示簡短commit?id
git?log?--graph?#?以樹形展示
git?log?--decorate?#?顯示分支名等
git?log?--first-parent?#?顯示第一父元素(不顯示merge進來的樹形結構)
git?log?--all?#?顯示全部分支
除了git log
我們還可以使用 gitk 這個工具,這是 git 2.0 以后加入的圖形化工具,可以以更友好等方式查看 log 樹,常用的有兩個參數
gitk?–all?#?顯示全部分支
gitk?--first-parent?#?顯示第一父元素(不顯示merge進來的樹形結構)
下圖是git log
和 gitk 的命令復雜度和顯示效果


注:如果你在 mac 下使用 gitk,可能會發現顯示非常模糊,這是因為 retina 屏幕的問題,可以嘗試下下面的方法
首先安裝 retinizer,如果你沒安裝 brew 可能需要安裝 homebrew
$?brew?cask?install?retinizer
然后打開 gitk 所在的目錄
$?open?/System/Library/Frameworks/Tk.framework/Versions/Current/Resources/
打開 retinizer,并將 Wish.app 拖拽到 retiniaer 的界面,然后點一下那個按鈕,然后就 ok 了
下面是帶不帶--first-parent
的區別

有人用 git 的 commit 只做了臺北的公交線路圖,我表示給跪了,感興趣猛戳這里[3]
diff
diff 命令常用的命令有兩個
git?diff?file?#查看指定文件的差異
git?diff?--stat?#查看簡單的diff結果
下圖總結了 diff 全部情況

常用命令總結
config
help?status?log
clone?init
add?commit
branch?checkout?diff
merge?rebase
fetch?pull?push?remote
總結
歡迎大家閱讀本文,如果你覺得本文對你有幫助,那就點贊加關注作者吧,如果對本文有任何疑問,歡迎在評論區交流。
引用鏈接
[1]
?這里:?https://git-scm.com/downloads[2]
?提交規范:?http://yanhaijing.com/git/2016/02/17/my-commit-message/[3]
?猛戳這里:?http://gugod.org/2009/12/git-graphing/
我在阿里招前端,我該怎么幫你?(現在還可以加模擬面試群)
如何拿下阿里巴巴 P6 的前端 Offer
如何準備阿里P6/P7前端面試--項目經歷準備篇
大廠面試官常問的亮點,該如何做出?
如何從初級到專家(P4-P7)打破成長瓶頸和有效突破
若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?
如何準備20K+的大廠前端面試
·················?若川簡介?·················
你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經堅持寫了8年,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助4000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。
掃碼加我微信 lxchuan12、拉你進源碼共讀群
今日話題
目前建有江西|湖南|湖北?籍 前端群,想進群的可以加我微信 lxchuan12?進群。分享、收藏、點贊、在看我的文章就是對我最大的支持~