接上篇,這裏繼續知識點的總結javascript
Vue經過getter/setter以及數據劫持來實現監聽數據的變化 React則是經過比較引用(diff算法)來實現,若是不優化可能致使大量沒必要要的VDOM的從新渲染。 二者設計理念不一樣,Vue使用的是可變的數據,React則強調數據的不可變,Vue更加簡單,React構建大型應用的時候更加魯棒。 2. 數據流向不一樣
Vue2.0中組件與DOM能夠經過v-model雙向綁定,2.0中再也不支持父子組件之間經過props雙向綁定,不鼓勵組件對props進行修改,會警告。 React提倡單向數據流,使用Redux進行數據流狀態管理 3. 組件間的通訊方式不一樣
Vue的組件通訊由三種方式:父組件經過props向子組件傳遞數據或者回到,子組件經過事件想父組件傳遞消息,經過2.2.0中新增的provide/inject實現父組件向子組件注入數據,能夠跨越多個層級。 React的組件通訊有三種方式:父組件經過props能夠向子組件傳遞數據或者回調,能夠經過context進行跨層級的通訊,這其實和provide/inject起到的做用差很少,React自己不支持自定義時間,React中子組件向父組件傳遞消息使用回調函數。 4. 模板渲染方式不一樣
React經過JSX渲染模板,Vue經過拓展的HTML語法進行渲染。 React是在組件的js代碼中,經過原生js來實現模板中的常見語法,好比插值,條件,循環等等,更加純粹原生,而Vue是在和組件js代碼分離的單獨的模板中經過指令來實現的。 5. 渲染過程不一樣
Vue能夠更快計算出虛擬DOM的差別,由於渲染過程當中,Vue會收集依賴,而後根據註冊的組件渲染對應的DOM,不須要從新渲染每個組件 React在應用的狀態改變時,所有子組件都會從新渲染。 6. 框架本質不一樣
Vue本質是MVVM框架,由MVC發展而來; React是前端組件化框架,由後端組件化發展而來。 7. Vuex和Redux的區別
Redux使用的是不可變數據,而Vuex的數據是可變的,所以,Redux每次都是用新state替換舊state,而Vuex是直接修改。Redux在檢測數據變化的時候,是經過diff的方式比較差別的,而Vuex其實和Vue的原理同樣,是經過getter/setter來比較的,這兩點的區別,也是由於React和Vue的設計理念不一樣。React更偏向於構建穩定大型的應用,很是的科班化。相比之下,Vue更偏向於簡單迅速的解決問題,更靈活,不那麼嚴格遵循條條框框。css
在通訊中,不管是子組件向父組件傳值仍是父組件向子組件傳值,他們都有一個共同點就是有中間介質,子向父的介質是自定義事件,父向子的介質是props中的屬性。抓準這兩點對於父子通訊就好理解了html
2.在須要傳值的組件中引入eventBus.js,用bus.$emit
觸發一個自定義事件,並傳遞參數 3. 在須要接收數據的組件中引入eventBus.js,在mounted() 鉤子函數(掛載實例) 中用bus.$on
監聽自定義事件,並在回調函數中處理傳遞過來的參數前端
v-once
:能執行一次性地插值,當數據改變時,插值處的內容不會更新。v-show
:和v-if同樣,區別是if是將代碼註釋掉,v-show是給一個display:none的屬性 讓它不顯示。v-if 有更高的切換消耗而 v-show 有更高的初始渲染消耗。所以,若是須要頻繁切換使用 v-show 較好,若是在運行時條件不大可能改變則使用 v-if 較好。v-for
:基於數據渲染一個列表,相似於JS中的遍歷。其數據類型能夠是 Array | Object | number | string。v-html
:雙大括號會將數據解釋爲普通文本,而非HTML 代碼。爲了輸出真正的 HTML,你須要使用 v-html 並且給一個標籤加了v-html 裏面包含的標籤都會被覆蓋。v-text
:給一個便籤加了v-text 會覆蓋標籤內部原先的內容v-bind
:動態屬性綁定,縮寫:v-on
:動態事件綁定,縮寫@v-model
:雙向數據綁定,限制在<input>
、<select>
、<textarea>
、components
中使用在組件中定義自定義指令,使用directives屬性 全局自定義指定
鉤子函數
一個指令定義對象能夠提供以下幾個鉤子函數 (均爲可選):
vue
inserted
:被綁定元素插入父節點時調用 (僅保證父節點存在,但不必定已被插入文檔中)。bind
:只調用一次,指令第一次綁定到元素時調用。在這裏能夠進行一次性的初始化設置。update
:所在組件的 VNode 更新時調用,可是可能發生在其子 VNode 更新以前。指令的值可能發生了改變,也可能沒有。可是你能夠經過比較更新先後的值來忽略沒必要要的模板更新 (詳細的鉤子函數參數見下)。componentUpdated
:指令所在組件的 VNode 及其子 VNode 所有更新後調用。unbind
:只調用一次,指令與元素解綁時調用。指令鉤子函數會被傳入如下參數:
html5
el
:指令所綁定的元素,能夠用來直接操做 DOM 。binding
:一個對象,包含如下屬性:name
:指令名,不包括 v- 前綴。value
:指令的綁定值,例如:v-my-directive=「1 + 1」 中,綁定值爲 2。oldValue
:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。不管值是否改變均可用。expression
:字符串形式的指令表達式。例如 v-my-directive=「1 + 1」 中,表達式爲 「1 + 1」。arg
:傳給指令的參數,可選。例如 v-my-directive:foo 中,參數爲 「foo」。modifiers
:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象爲 { foo: true, bar: true }。vnode
: Vue編譯生成的虛擬節點。移步 VNode API 來了解更多詳情。oldVnode
:上一個虛擬節點,僅在 update 和 componentUpdated 鉤子中可用。一個組件從開始到最後消亡所經歷的各類狀態,就是一個組件的生命週期
java
說明:在實例初始化以後,數據觀測 (data observer) 和 event/watcher 事件配置以前被調用
注意:此時,沒法獲取 data中的數據、methods中的方法
node
說明:這是一個經常使用的生命週期,能夠調用methods中的方法、改變data中的數據
react
說明:在掛載開始以前被調用,此時沒法獲取到el中的DOM元素
webpack
說明:此時,vue實例已經掛載到頁面中,能夠獲取到el中的DOM元素,進行DOM操做
說明:數據更新時調用,發生在虛擬 DOM 從新渲染和打補丁以前。你能夠在這個鉤子中進一步地更改狀態,這不會觸發附加的重渲染過程。
注意:此處獲取的數據是更新後的數據,可是獲取頁面中的DOM元素是更新以前的
說明:組件 DOM 已經更新,因此你如今能夠執行依賴於 DOM 的操做
說明:實例銷燬以前調用。在這一步,實例仍然徹底可用。
使用場景:實例銷燬以前,執行清理任務,好比:清除定時器等
說明:Vue 實例銷燬後調用。調用後,Vue 實例指示的全部東西都會解綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
父beforeUpdate->子beforeUpdate->子updated->父updated
父beforeUpdate->父updated
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
只要來讀取的狀態集中放在store中;改變狀態的方式就是提交mutations。這是個同步的實物;異步邏輯應該封裝中action中。
Modeules:項目特別複雜的時候,可讓每個模塊擁有本身的state,mutation,action,getters,使得結構很是清晰,方便管理
vue router和vue.js的核心深度集成,能夠方便的用於spa的應用程序開發
它的功能有:
支持HTML5 history模式,和hash模式;支持嵌套路由;支持路由參數,支持編程式路由,支持命名路由。
路由的進階,導航守衛,路由元信息,過渡效果,數據獲取,滾動行爲,路由懶加載。
基本使用步驟:
<script src="./lib/vue-routerxxx.js"></script>
<router-link to="/user">User</router-link>
<router-view></router-view>
var User = {template: '<div>user</div>'}
路由重定向值的是,用戶在訪問地址a的時候,強制用戶跳轉到地址c,從而展現特定的組件頁面,經過路由規則的redirect屬性,指定一個新的路由地址,能夠方便地設置路由的重定向。
var router = new VueRouter({
routers: [
// 其中,path表示須要被重定向的原地址,redirect表示將要被重定向的新地址
{path;'/', redirect: '/user'},
{path:'/user', component: User},
{path:'/register', component:Register}
}
})
複製代碼
什麼是動態路由匹配,爲啥要動態路由匹配?即經過路由傳參。
路由傳參的三種方式:
很顯然,須要在path中添加/:id來對應 $router.push 中path攜帶的參數。在子組件中可使用來獲取傳遞的參數值。
getDescribe(id) {
this.$router.push({
path: `/describe/${id}`,
})
{
path: '/describe/:id',
name: 'Describe',
component: Describe
}
//對應子組件: 這樣來獲取參數 this.$route.params.id
複製代碼
this.$router.push({
name: 'Describe',
params: {
id: id
}
})
{
path: '/describe',
name: 'Describe',
component: Describe
}
//對應子組件: 這樣來獲取參數 this.$route.params.id
複製代碼
this.$router.push({
path: '/describe',
query: {
id: id
}
})
//對應子組件: 這樣來獲取參數 this.$route.query.id
複製代碼
路由的name能夠指定命名名稱,不用寫path。命名路由的配置規則
// 路由導航
const router = new VueRouter({
routes: [
{
path: '/user/id',
name: 'user',
component: User
}
]
})
<router-link :to="{name:'user', params: {id:1} }">dada</router-link>
router.push({name:'user', params: {id:1} }}
複製代碼
使用router.beforeEach 註冊一個全局的路由守衛
當一個導航守衛觸發時,全局前置守衛按照建立順序調用,守衛是異步解析執行,此時導航在全部守衛resolve完成以前一直處於等待狀態中
全局後置鉤子 router.afterEach((to,from)=){})
全局後置鉤子就是在路由跳轉以後執行的鉤子函數
頁面獨享的守衛
以下能夠在路由的配置上面定義beforeEnter()
經過meta屬性實現要監聽的路由元信息
鉤子函數的執行順序
beforeRouteEnter --> created --> mounted --> destroyed
beforeRouteEnter --> created --> mounted --> activated --> deactivated
再次進入緩存的頁面,只會觸發beforeRouteEnter -->activated --> deactivated 。created和mounted不會再執行。由於這個頁面須要緩存。只有第一次進入時纔會執行created和mounted方法,再次進入就不執行了。而activated每次進入都執行,因此在這個鉤子函數中獲取數據。
#後面的hash的變化,不會致使瀏覽器向服務器發送請求,瀏覽器不發出請求,也就不會刷新頁面,每次hash值的變化,會觸發hashchange這個時間,經過這個時間咱們能夠知道hash值發生了什麼變化,能夠監聽hashchange來實現更新頁面部份內容的操做,這就是前端路由的實現原理。 並且hash發生變化的url會被瀏覽器記錄下來,因此瀏覽器的前進後退等功能均可以用了。頁面狀態和url關聯起來
特色:hash值雖然出如今url中,可是不會被包括在http請求中,對後端徹底沒有影響,因此改變hash不會重現加載頁面
2. History模式
Url以/分割,單頁面沒有跳轉,這種模式須要服務端支持,服務端在接收到全部請求後,都指向同一個html文件,否則404,單頁面應用只有一個html,整個網站的內容都在html中,由於咱們的應用是個單頁客戶端應用,若是後臺沒有正確的配置,當用戶在瀏覽器直接訪問www.yongcun.wang/tclass就會返回 404,這就很差看了。這須要在後臺配置匹配不到資源的時候返回主頁面。
History模式利用了html5中新增的pushState()和replaceState()方法,這兩個方法能夠改變url且不會發送請求,不只能夠讀取歷史記錄棧,還能夠對瀏覽器的歷史記錄棧進行修改,以上兩個方法用於修改歷史狀態,還有back,froward,go三個方法用來切換歷史狀態。
Vue默認使用hash模式,能夠設置成history模式
區別:
hashchange,你只能改變#後面的url片斷。而pushState設置的新URL能夠是與當前URL同源的任意URL
history模式則會將URL修改得就和正常請求後端的URL同樣,如後端沒有配置對應/user/id的路由處理,則會返回404錯誤
和
this.$route.params獲取
`中的動態參數方法,返回上一個history也要使用
$router.go(-1)`方法Vue 最獨特的特性
定義了對象間一種一對多的關係,當目標對象Subject的狀態發生改變時,全部依賴他的對象observer都會獲得通知
模式特徵:
優勢:目標者與觀察者,功能上的關聯性下降,專一自身的功能邏輯,觀察者被動接收更新,時間上的關聯性下降,實時接收目標更新狀態
缺點:觀察者模式雖然減小了對象間的依賴關係,但卻不能對事件通知進行細分管控,如篩選通知,指定主題事件通知。
觀察者模式是爲了實現對象間的解耦,是鬆耦合的,而發佈訂閱模式則是徹底解耦的。
Vue 最獨特的特性之一,是其非侵入性的響應式系統。數據模型僅僅是普通的 JavaScript 對象。而當你修改它們時,視圖會進行更新。 那麼,Vue是如何實現的呢?
vue.js 則是採用數據劫持結合發佈者-訂閱者模式的方式,經過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變更時發佈消息給訂閱者,觸發相應的監聽回調。當把一個普通的js對象傳給vue實例來做爲它的data選項時,vue將遍歷它的屬性,用object.defineproperty()將它們轉化爲getter/setter,用戶看不到getter/setter,可是內部它們讓vue追蹤依賴,並在屬性被訪問和修改時通知變化
總體思路 經過Object.defineProperty()來實現對屬性的劫持,達到監聽數據變更的目的
要實現mvvm的雙向綁定,就必需要實現如下幾點:
總共分爲三步驟:
new watcher的時候會在watch中生成一個updateComponent函數,這個函數會調用render函數來從新渲染對應的component。
當render一個vue組件的時候,若是這個組件用到了某個屬性title,那麼這個組件對應的watcher對象會被註冊到這個屬性title的dep對象中,這就是收集依賴,收集完屬性全部的依賴組件以後,當這個屬性title發生改變以後,就會找到dep中註冊過的全部的watcher對象,通知他們執行updateComponent函數來更新對應的組件
在組件更新的時候,render函數裏,會訪問他所依賴的data的getter函數。
3. 更新階段:
當某個屬性title發生改變的時候,就去調用Dep的notify函數,而後通知全部的Watcher調用updateComponent函數更新。
總結
第一步:組件初始化的時候,先給每個data屬性都註冊getter,setter,也就是reactive化。而後再new 一個本身的Watcher對象,此時watcher會當即調用組件的render函數去生成虛擬DOM。在調用render的時候,就會須要用到data的屬性值,此時會觸發getter函數,將當前的Watcher函數註冊進dep裏。
第二步:當data屬性發生改變以後,就會遍歷dep裏全部的watcher對象,通知它們去從新渲染組件。
vue-diff 是什麼?
提到vue的diff算法就不得不提一個名詞 虛擬dom(Virtual DOM) ,什麼是虛擬dom,個人理解是使用js對象來描述dom節點,是js和html的中間層,是一層對真實 DOM 的抽象。之前傳統的開發直接使用js操做dom,如今使用js操做js對象(虛擬dom),在合適的時機將虛擬dom轉化爲真實dom節點
爲何須要虛擬dom?
爲何須要虛擬dom,直接操做dom不是更方便嗎?實際上真正的 DOM 元素是很是龐大的,裏面有很是多的屬性,當咱們頻繁的去作 DOM 更新,會產生必定的性能問題。而虛擬dom使用js對象來描述dom節點,因此它比建立一個 DOM 的代價要小不少。
虛擬DOM的最終目標是將虛擬節點渲染到視圖上。可是若是直接使用虛擬節點覆蓋舊節點的話,會有不少沒必要要的DOM操做。例如,在一個dom元素很是多的頁面你只改裏其中的一個地方,這種狀況下若是使用新的虛擬節點覆蓋舊節點的話,形成了性能上的浪費,這個時候就須要比較計算新老虛擬節點的不一樣,差量的更新。因此這個時候vue-diff 就出現了。
下面說說 Diff 的比較邏輯
比較處理流程是下面這樣
在新舊節點中
比較是爲了修改DOM樹
其實這裏存在三種樹,一個是頁面DOM樹,一個是舊VNode樹,一個是新Vnode樹
頁面DOM樹和舊VNode樹節點一一對應的
而新Vnode樹則是表示更新後頁面DOM樹該有的樣子
這裏把舊Vnode樹和新Vnode樹進行比較的過程當中
不會對這兩棵Vode樹進行修改,而是以比較的結果直接對真實DOM 進行修改,好比說,在舊Vnode樹同一層中,找到和新Vnode樹中同樣但位置不同節點,此時須要移動這個節點,可是不是移動舊Vnode樹中的節點,而是直接移動DOM,總的來講,新舊Vnode樹是拿來比較的,頁面DOM 樹是拿來根據比較結果修改的
immediate:組件加載當即觸發回調函數執行,
deep: 深度監聽,爲了發現對象內部值的變化,複雜類型的數據時使用,例如數組中的對象內容的改變,注意監聽數組的變更不須要這麼作。注意:deep沒法監聽到數組的變更和對象的新增,參考vue數組變異,只有以響應式的方式觸發纔會被監聽到。
定義:在下次DOM更新循環結束以後執行延遲迴調,在修改數據以後當即使用這個方法,獲取更新後的DOM。
理解:nextTick(),是將回調函數延遲在下一次dom更新數據後調用,就是當數據更新以後,而且在dom中渲染以後,自動執行該函數。 何時要用到?
2. 當項目中要對改變以後的DOM元素作必定的操做時,將操做放在this.nextTick()的回調函數中 3. 在使用某些第三方插件時,想要在vue生成的某些DOM發生變化後從新應用該插件時,須要在this.nextTick()的回調函數中從新執行該插件的方法
Vue主要的特色有三個方面,響應式機制,模板,以及對象式組件聲明語法。
2.x的響應式是基於Object.defineProperty實現的代理,可以監聽數據對象的變化,可是監聽不到對象屬性的增刪,數組元素和長度的變化,同時會在Vue初始化的時候把全部的Observer創建,實現數據視圖與數據的響應式更新,底層須要Observer的支持,因此須要Observer都創建好,才能觀察到數據對象的變化。
3.0中使用es6中的Proxy來代替Object.defineProperty,在目標對象之上架了一層攔截,代理的是對象而不是對象的屬性。這樣能夠將本來對對象屬性的操做變爲對整個對象的操做,能夠監聽到對象屬性的增刪和數組長度的變化,還能夠監聽Map,Set,WeakSet,WeakMap等,同時實現了惰性監聽,即不會再初始化的時候建立全部的observer,而是會在用到的時候纔去監聽。
proxy在目標對象的外層搭建了一層攔截,外界對目標對象的某些操做,必須經過這層攔截
new Proxy()表示生成一個Proxy實例,target參數表示所要攔截的目標對象,handler參數也是一個對象,用來定製攔截行爲
Proxy 實例也能夠做爲其餘對象的原型對象
Proxy的做用
對於代理模式 Proxy 的做用主要體如今三個方面
1.攔截和監視外部對對象的訪問
2.下降函數或類的複雜度
3.在複雜操做前對操做進行校驗或對所需資源進行管理
Proxy所能代理的範圍--handler
實際上 handler 自己就是ES6所新設計的一個對象.它的做用就是用來 自定義代理對象的各類可代理操做 。它自己一共有13中方法,每種方法均可以代理一種操做.其13種方法以下
Proxy場景:實現私有變量,抽離校驗模塊,訪問日誌,預警和攔截,過濾操做,中斷代理
模板方面沒有大的變動,只改了做用域插槽,2.x 的機制致使做用域插槽變了,父組件會從新渲染,而 3.0 把做用域插槽改爲了函數的方式,這樣只會影響子組件的從新渲染,提高了渲染的性能。
同時,對於 render 函數的方面,vue3.0 也會進行一系列更改來方便習慣直接使用 api 來生成 vdom 。
3. 對象式的組件聲明方式
vue2.x 中的組件是經過聲明的方式傳入一系列 option,和 TypeScript 的結合須要經過一些裝飾器的方式來作,雖然能實現功能,可是比較麻煩。
3.0 修改了組件的聲明方式,改爲了類式的寫法,這樣使得和 TypeScript 的結合變得很容易。
此外,vue 的源碼也改用了 TypeScript 來寫。其實當代碼的功能複雜以後,必須有一個靜態類型系統來作一些輔助管理。
如今 vue3.0 也全面改用 TypeScript 來重寫了,更是使得對外暴露的 api 更容易結合 TypeScript。靜態類型系統對於複雜代碼的維護確實頗有必要。
4. 其它方面的更改
vue3.0 的改變是全面的,上面只涉及到主要的 3 個方面,還有一些其餘的更改:
支持自定義渲染器,從而使得 weex 能夠經過自定義渲染器的方式來擴展,而不是直接 fork 源碼來改的方式。
支持 Fragment(多個根節點)和 Protal(在 dom 其餘部分渲染組建內容)組件,針對一些特殊的場景作了處理。
基於 treeshaking 優化,提供了更多的內置功能
Webpack常見配置:
處理一個文件可使用多個loader,loader的執行順序和配置中的順序是相反的
第一個loader接收源文件內容做爲參數,其餘loader接收前一個執行的loader的返回值做爲參數,最後一個執行的loader會返回此模塊的js源碼
Loader是一個轉換器,對A文件進行編譯造成B文件,這裏操做的是文件,例如將A.scss轉換爲A.css,單純的文件轉換過程。
Plugin是一個擴展器,豐富了webpack自己,針對的是loader結束後,webpack打包的整個過程,它不直接操做文件,而是基於事件機制工做,會監聽webpack打包過程當中的某些結點,執行對應的任務。
Babel是一個JavaScript編譯器。他把最新版的javascript編譯成當下能夠執行的版本,簡言之,利用babel就可讓咱們在當前的項目中隨意的使用這些新最新的es6,甚至es7的語法。
Babel運行原理:
分爲兩個階段:詞法分析,語法分析
詞法分析:將字符串形式的代碼轉換爲令牌流
語法分析:使用令牌中的信息將它們轉換成一個AST表述的結構
2. 轉換:接收AST並對其進行遍歷,對結點進行添加更新移除等操做。
Babel提供了@babel/traverse(遍歷)方法維護這AST樹的總體狀態,而且可完成對其的替換,刪除或者增長節點,這個方法的參數爲原始AST和自定義的轉換規則,返回結果爲轉換後的AST。
3. 生成:把通過一系列轉換後的AST從新轉換成字符串形式的代碼,同時還會建立源碼映射。
本質實際上是深度優先遍歷整個AST,而後構建能夠表示轉換後的代碼的字符串,Babel使用@babel/generator將修改後的AST轉換成代碼,生成過程能夠對是否壓縮以及是否刪除註釋等進行配置,而且支持sourceMap。
Vue中配置babelrc
git經常使用命令:
git add
# 將工做區的修改提交到暫存區git commit
# 將暫存區的修改提交到當前分支git reset
# 回退到某一個版本git stash
# 保存某次修改git pull
# 從遠程更新代碼git push
# 將本地代碼更新到遠程分支上git reflog
# 查看歷史命令git status
# 查看當前倉庫的狀態git diff
# 查看修改git log
# 查看提交歷史git revert
# 回退某個修改git add相關
git add .
將文件的修改,新建添加到暫存區git add -u
將文件的修改,刪除添加到暫存區git add -A
將文件的修改,新建,刪除添加到暫存區git commit 相關
git commit -m 「本次提交描述」
該命令會將git add . 存入暫存區修改內容提交至本地倉庫中,若文件未添加至暫存區,則提交時不會提交任何修改git commit -a
至關於運行git add -u
把全部當前目錄下的文件加入緩存區域再運行git commit
,注意新增文件並無被commitgit commit -am
「本次提交描述」 或 git commit -a -m 「本次提交描述」
,等同於git commit -m
和git commit -a
git commit -amend
修改最近的一次提交,提交註釋書寫有誤或者漏提文件的時候使用,注意漏提的文件要先用git add添加到緩存區以後,git commit -amend才能追加到git stash用法
git stash
將全部未提交的修改保存起來,用於後續恢復當前的工做目錄git stash save 「name」
給每一個stash添加一個message,用於記錄版本git stash pop/git stash apply
恢復最新緩存的工做目錄,並恢復緩存堆棧中的那個stash刪除(pop),apply則只恢復不刪除git stash list
查看現有的全部stashgit stash drop
移除最新的stash,也能夠指定名字git reset用法
git reset HEAD^ 回退版本
,一個^表示一個版本git reset HEAD~n
回退n個版本git reset commit-id
回退到指定版本git reset
命令有三個參數,git reset --soft HEAD~1
--soft
:軟回退,表示將本地版本庫頭指針重置到指定版本,且將此次提交以後的全部變動都移動到暫存區--mixed
:默認參數,可不寫,將本地版本庫的頭指針重置到指定版本,且重置暫存區,即此次提交以後全部變動都移動到工做區--hard
:回退一個版本,將本地版本庫的頭指針重置到指定版本,重置暫存區,並將工做區代碼清空。git reset HEAD filename
回退指定文件git reflog用法
git reflog
查看全部分支的操做記錄,包括commit 和reset的操做,包括已經被刪除的commit操做,git log則不能查看已經刪除commit 記錄git checkout用法
git checkout [<commit>] [--] <paths>
用於拿暫存區的文件覆蓋工做區的文件,或者用指定提交中的文件覆蓋暫存區和工做區中對應的文件,帶commit參數則是從暫存區檢出文件覆蓋工做區,不帶commit參數則用--path中的文件覆蓋暫存區和工做區的文件。git checkout <branch>
用於切換分支git checkout -b <new_branch> [<start_point>]
用於建立並切換分支,-b 選項表示建立新分支。git revert用法
git revert
反轉提交,撤銷一個提交的同時會建立一個新的提交,至關於用一個新提交來消除一個歷史提交所作出的修改git revert commit-id
反轉提交指定一個commitgit revert HEAD~3
反轉提交第四個commitgit revert --abort
終止這次revert,防止產生衝突git branch用法
git branch -d <branchname>
刪除分支,前提要切換到其餘分支git push用法
git push <遠程主機名> <本地分支名>:<遠程分支名>
將本地分支的更新,推送到遠程主機。git push origin master
將本地的master分支推送到origin主機的master分支。若是master不存在,則會被新建。git push origin :master
等同於 git push origin --delete master
省略本地分支名,則表示刪除指定遠程分支。若是本地分支和遠程分支之間存在追蹤關係,則直接git push origin,若是遠程倉庫只有一個分支,則git push
git push -u origin master
使用-u命令創建當前分支與某個主機的追蹤關係,能夠不加參數使用git pushgit pull用法
git pull <遠程主機名> <遠程分支名>:<本地分支名>
從另外一個存儲庫或者本地分支獲取並整合,取回遠程主機某個分支的更新,再與本地的指定分支合併git pull origin master:test
取回origin主機的master分支與本地的test分支合併,若是是與本地的master分支合併,則:test可省略git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
git中fetch命令是將遠程分支的最新內容拉到了本地,可是fetch後看不到變化,由於此時本地多了一個FETCH_HEAD指針,checkout改指針後能夠查看遠程分支的最新內容,而後checkout到master分支,執行merge,選中FETCH_HEAD指針,合併後並解決衝突後,能夠commit。
數據鏈路層:實現了網卡接口的網絡驅動程序,以處理數據在物理媒介上的傳輸
網絡層:實現數據包的選路和轉發,廣域網一般使用衆多分級的路由器來鏈接分散的主機,所以通訊的兩臺主機通常是經過多箇中間節點鏈接的,網絡層的任務就是選擇這些中間節點,以肯定兩臺主機以前的通訊路徑
傳輸層:爲兩臺主機上的應用程序提供端到端的通訊,與網絡層使用逐跳通訊的方式不一樣,傳輸層只關心通訊的起始端和目的端,而不在意數據包的中轉過程。
應用層:負責處理應用程序的邏輯,應用層在用戶空間實現,由於它負責處理衆多的邏輯,好比文件傳輸,名稱查詢和網絡管理等等。
TCP報文包含了哪些內容?
三次握手過程:
三次握手過程分析:
爲何要有三次握手的過程?
由於只有通過三次,服務器和客戶端才能夠互相知道對方和本身發送接收都正常,通過兩次握手的話服務端沒法知道客戶端是否具有接收以及本身是否具有發送的能力;而且兩次握手的話若是首次握手的報文超時客戶端再重發以後,服務端接收到以前的那個報文也會直接創建鏈接,浪費資源;
四次揮手過程:
四次揮手過程分析:
爲何揮手要進行四次?
由於服務器端發送確認客戶端斷開的ACK以後,還要進行數據處理,處理完數據以後才能夠發送本身的斷開請求。這裏不能合併成一個請求過程。
PS:以上知識點的內容是樓主根據本身的理解和其餘大神的博客內容整理出來的,可能有一些內容是原文,若是侵犯到了哪位大大的版權,請聯繫我及時刪掉對應的內容。