git 查看分支編碼_12個常用的Git命令,趕緊記一波!

今天齊姐簡單講下 Git 的實現原理,知其所以然才能知其然;并且梳理了日常最常用的 12 個命令,分為三大類分享給你。

本文的結構如下:

  1. 作者和開發原由

  2. Git 的數據模型

  3. 常用命令

  4. 資源推薦

作者和開發原由

Talk is cheap. Show me the code.

這句話就出自 Linux 和 Git 的作者Linus Torvalds

原本 Linux 內核的版本控制系統是用的 BitKeeper,然而 2005 年,BitMover 公司不再讓 Linux 開發團隊免費使用了。。

Linus 一聽,不給用了?老子自己寫!

于是,大佬十天之內完成了 Git 的第一個版本。

所以 Git 是一個免費的、開源的版本控制系統。

版本控制系統

版本控制其實每個人都用過,那些年修改過的簡歷:

小齊簡歷 2012 版
小齊簡歷 2013 版
小齊簡歷 2014 版
小齊簡歷 2015 版
小齊簡歷 2016 版
小齊簡歷 2017 版
小齊簡歷 2018 版
小齊簡歷 2019 版
...

還有那些年打死都不再改的畢業論文:

畢業論文最終版
畢業論文最最終版
畢業論文最最最終版
畢業論文最最最最終版
畢業論文最終不改版
畢業論文最終真不改版
畢業論文最終真真不改版
畢業論文最終打死不改版
畢業論文最終打死不改版 2
...

沒錯,這就是本地版本控制系統。

很明顯,好處是簡單,但是只能一個人在這改,無法和他人完成合作。那么以下兩種主流的版本控制系統應運而生。

1. 集中化版本控制系統

Centralized Version Control Systems (CVCS)

比如:CVS, Subversion, Perforce, etc.

這種版本控制系統有一個單一的集中管理的服務器,保存所有文件的最新版本,大家可以通過連接到這臺服務器上來獲取或者提交文件。

dfae4dfc3590b14ac6c40899bec17bf2.png

這種模式相對本地版本控制系統是有所改進的,但是缺點也很明顯,如果服務器宕機,那么輕則耽誤工作、重則數據丟失。于是分布式版本控制系統應運而生。

2. 分布式版本控制系統

Distributed Version Control Systems (DVCS)

比如:Git, Mercurial, Bazaar, etc.

分布式的版本控制系統會把代碼倉庫完整地鏡像下來,這樣任何一個服務器發生故障,都可以用其他的倉庫來修復。

更進一步,這種模式可以更方便的和不同公司的人進行同一項目的開發,因為兩個遠程代碼倉庫可以交互,這在之前的集中式系統中是無法做到的。

那么什么叫“把代碼倉庫完整地鏡像下來”呢?

CVCS 每個版本存放的是當前版本與前一個版本的差異,因此也被稱作基于差異的版本控制 (delta-based);

Git 存儲的是所有文件的一個快照 (snapshot),如果有的文件沒有修改,那就只保留一個 reference 指向之前存儲的文件。

不是很好理解?那接著看吧~

Git 的數據模型

1. 什么是快照 (snapshot) 呢?

首先我們來學兩個 Git 中的術語:

  • blob, 就是單個的文件;
  • tree, 就是一個文件夾。

快照則是被追蹤的最頂層的樹。

比如我的“公眾號”文件夾的這么一個結構:

6e55f2375d977eac885b7860bf6ba2ac.png

那么一個快照就是追蹤的“公眾號”這顆樹。

2. 本地庫的數據模型

Git 記錄了每個快照的 parent,也就是當前這個文件夾的上一個版本。

那么快照的迭代更新的過程就可以表示為一個有向無環圖,是不是很熟悉?我們在「拓撲」那篇文章里講過,忘了的小伙伴快去公眾號內回復「拓撲」獲取拓撲的入門文章吧~

7e45f9cc4c16a262fd520c8077345a8e.png

每個快照其實都對應了一次 commit,我們用代碼來表示一下:

class commit {
array parents
String author
String message
Tree snapshot
}

這就是 Git 的數據模型。

blob, tree, snapshot 其實都一樣,它們在 Git 中都是對象,都可以被引用或者被搜索,會基于它們的 SHA-1 hash 進行尋址。

git cat-file -t: 查看每個 SHA-1 的類型;git cat-file -p: 查看每個對象的內容和簡單的數據結構。

但是通過這個哈希值來搜索也太不方便了,畢竟這是一串 40 位的十六進制字符,就是第二部分 git log 里輸出的那個編碼

因此,Git 還給了一個引用 reference

比如,我們常見的 HEAD 就是一個特殊的引用。

本地庫就是由 對象引用 構成的,或者叫 Repositories.

在硬盤上,Git 只存儲 對象引用,所有的 Git 命令都對應提交一個快照。

那有哪些常用命令呢?

常用命令

本章分三大部分介紹日常常用命令:

  • 本地操作
  • 和遠程庫的交互
  • 團隊協作 - 分支
41062c57eb28f685d6476f981a3a97d1.png

本地操作

在學習常用命令之前,你首先需要知道的 Git 的「三個分區」和對應的文件的「三種狀態」:

79d32d4a3f9096e00325730832c2102f.png
  • 工作區:就是你本地實際寫代碼的地方,無論你是用 vim 直接改也好,還是在 IDE 里寫,都無所謂。

    • 對應的文件狀態是:modified,已修改,但還沒保存到數據庫中。
  • 暫存區:就是臨時存放的地方。

    • 對應的文件狀態是:staged,Git 已經對該文件做了標記,下次提交知道要包含它。
  • 本地庫:存放本地歷史版本信息。

    • 對應的文件狀態是:committed,文件已經安全的保存在本地數據庫中。

1. $ git add

工作區改完了代碼,就用 git add 提交到暫存區。

這里如果文件改動的比較多,但又不是每個都需要提交,我會設置 git ignore file,就表示這些文件不要提交,比如在 build project 的時候會自動生成的那些文件等等。

2. $ git commit -m "comment"

從暫存區提交到本地庫,就需要用 commit。

一般后面都會跟個 -m 加句 comment,簡單說下改動的內容或者原因,我們公司大家默認也會把 Jira鏈接附上,這樣就知道這個改動對應哪個任務。

那如果想再改,再重新 git add 即可,但是 commit 這句需要改成

$ git commit --amend

這樣就還是一條 git log 信息。

3. $ git log

git log 可以查看到提交過的信息,從近到遠顯示每次 commit 的 comment 還有作者、日期等信息,比如大概長這個樣子:

commit 5abcd17dggs9s0a7a91nfsagd8ay76875afs7d6
Author: Xiaoqi
Date: xxx xxx xxx
改了 Test 文件

commit 后面的這個編號,是每次歷史記錄的一個索引。比如如果需要對版本進行前進或者后退的時候,就需要用到它。

這樣打印的 log 太多,更簡潔的打印方式是:

$ git log --oneline

就一行打印出來了。

或者:

$ git reflog

更常用一些。

4. $ git reset

那我們剛剛說過,如果需要前進或退回到某個版本,就用

$ git reset --hard 

這樣就直接跳到了這個編號對應的那個版本。

那么這個 hard 是什么意思呢?

這里有 3 個參數:hard, soft, mixed,我們一一來說一下。

回到我們最重要的這張圖上來:

79d32d4a3f9096e00325730832c2102f.png

我們剛剛說的前進或后退到某一版本,是對本地庫進行的操作。

那有個問題:本地庫的代碼跳到那個版本之后,工作區和暫存區的代碼就和本地庫的不同步了呀!

那這些參數就是用來控制這些是否同步的。

$ git reset --hard xxx

三個區都同步,都跳到這個 xxx 的版本上。

$ git reset --soft xxx

前面兩個區不同步,就只有本地庫跳到這個版本。

$ git reset --mixed xxx

暫存區同步,工作區不動。

所以呢,用的多的就是 hard.

41062c57eb28f685d6476f981a3a97d1.png

遠程交互

a9690c9d810158de57998dc61e0e6c21.png

和遠程庫的交互主要是,也就是寫入和讀取。

5. $ git push

小齊寫完了代碼,要提交到公司的代碼庫里,這個過程要用 git push.

當然了,這么用會被打的。。畢竟還要 cr 呢。

5. $ git clone

新來的實習生首先要 clone 整個項目到本地來,然后才能增刪改查。

當然了實際工作中也沒人這么用。。因為每家公司都會有自己包裝的工具。不過如果是做 Github 上的開源項目,就用得上了。

6. $ git pull

小齊提交了新的代碼之后,領導要審查呀,所以用 git pull 把最新的代碼拉取下來瞅瞅。

實際上呢,

git pull = fetch + merge

7. $ git fetch

git fetch 這個操作是將遠程庫的數據下載到本地庫,但是工作區中的文件沒有更新。

a2f0fed7f510b217234b5eeccc82d892.png

而要談 get merge,我們還需要先講下分支

mergegit pull 默認的選項,合并其實還有另外一種方法:rebase,中文叫做變基

8. $ git rebase

rebase 的作用更多的是來整合分叉的歷史,可以將某個分支上的所有修改都移到另一分支上,就像是變了基底。

分支與合并

首先我們來看幾個關于分支的基本操作:

9. 查看分支:

$ git branch

類似于ls,能夠列出當前所有分支。

git branch -v 能夠顯示更多信息。

10. 創建分支:

$ git branch

11. 切換分支:

$ git checkout

有了分支之后必然會有合并:

12. 合并分支:

$ git merge

而合并時就可能會有沖突,什么時候會有沖突呢?:

在同一個文件的同一個位置修改時。

因為 Git 會努力的把你們改動不同的地方合并在一起,但如果實在是在同一個地方改的,那它也沒辦法了,只能留給程序員去手動處理了。

當然了,每個命令延伸下去還有無限多個,本文不可能涵蓋全部,所以在此重磅推薦齊姐精心挑選的三大學習資源,大家可以自行享用~

學習資源

git help

其實我個人使用最多的是git help

真心方便又好用啊!

比如 git help pull:

57871a065ccd5f063fb65e3c4ebcfcea.png

先介紹了有哪些參數,然后 description 詳細解釋了它的工作原理,下面還有圖解,有木有太香!!

不過這種方式更像是 cheatsheet,當你已經知道了這個命令、只是忘了它的用法的時候去查。

如果你想系統的學習,那么下面 ? 的更適合你。

Pro Git

這本書是強烈推薦了!!

Pro Git 這本書不僅講了 Git 的基礎用法、高級用法,以及最后還深入講解了 Git 的原理,非常細致全面。

書的電子版也能在網站上直接下載。

英文版:

  • https://git-scm.com/book/en/v2

中文版:

  • https://git-scm.com/book/zh/v2

玩游戲

Practice makes perfect!

推薦一個寶藏資源:玩游戲來練 Git

項目:https://github.com/pcottle/learnGitBranching

網址:https://learngitbranching.js.org/

我熟悉很多工具都是通過小游戲來練習的,比如 vim 的操作,還是蠻推薦這種方式的。就不劇透啦,大家自己去探索吧~

推薦閱讀

  • 你居然還去服務器上撈日志,搭個日志收集系統難道不香么!
  • 真慘!連各大編程語言都擺起地攤了,Java攤位真大!
  • 再見,Eclipse!
  • RabbitMQ實現延遲消息居然如此簡單,整個插件就完事了!
  • 花了3天總結的RabbitMQ實用技巧,有點東西!
  • 面試官:不會看 Explain執行計劃,簡歷敢寫 SQL 優化?
  • IDEA同款數據庫管理工具,提示太全了,用起來賊香!
  • Github標星34K+Star,這款開源項目助你秒建Git服務!
  • 一個不容錯過的Spring Cloud實戰項目!
  • 我的Github開源項目,從0到20000 Star!

09cf9212b395297cab1e012804df6a33.png

歡迎關注,點個在看

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

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

相關文章

在域環境下搭建samba服務器

環境:samba:smbserver: 192.168.0.18AD:rise.com:192.168.0.37組:zixun xingzheng teacher class admin共享目錄:zixun xingzheng xueshu other一.安裝Samba服務器yum install -y samba二.把linux加入到ad中1.先…

Android NDK編程,引入第三方.so庫

android自帶的編譯工具NDK進行編譯時(非單純的調用第三方.so而是進行ndk編程),armeabi以及armeabi-v7a文件夾下的第三方so文件將會被刪除,只會產生編譯后的so文件,其他的so文件將無法引入,現在我們就來解決&#xff1a…

會做飯的機器人曰記_顏真卿《麻姑仙壇記》:蒼勁古樸,體態沉雄,氣象宏大...

《麻姑仙壇記》,全稱《有唐撫州南城縣麻姑山仙壇記》,或稱《麻姑山仙壇記》。顏真卿撰并書于大歷六年(771)四月。此碑有大、中、小三種刻本,且原石均佚,原拓佳本亦難得。大字本,字徑約5厘米&…

IBM服務器硬盤出現Other Error可能原因

除了確實物理等因素外,可能還因為:Other Errors的 很有可能也是固件(firmware)版本太低造成。 固件版本太低的話,硬盤自身有power safe模式,在硬盤長時間沒有I/O情況下,硬盤會自動斷電,而系統本身誤以為是硬…

怪異模式

眾所周知,HTML文檔結構可分為:文檔聲明<!DOCTYPE HTML>、HTML元素&#xff08;根元素/根標記/根標簽/祖先元素&#xff09;、head元素、body元素。 文檔聲明是用來通知瀏覽器&#xff0c;目前的文檔正使用哪個HTML版本&#xff0c;如果我們不寫文檔聲明<!DCOTYPE HTML…

Metro UI 菜單(Winform)

我有個項目需要要到菜單導航&#xff0c;就自己動作做了一個&#xff0c;感覺還可以&#xff0c;分享給大家。下載地址:http://files.cnblogs.com/files/dyj057/MetroUIMenu.zip 主要代碼&#xff1a; private void SetElements(){if (Elements null) return;int eWidth Bord…

echarts 山東地圖_用Python畫中國地圖,實現各省份數據可視化

第一步&#xff1a;安裝pyechartspyecharts是一款將python與echarts結合的強大的數據可視化工具&#xff0c;本文使用了0.1.9.4版本pip install pyecharts0.1.9.4第二步&#xff1a;讀取數據我的數據是在Excel表格里&#xff0c;如下圖&#xff1a;Execel數據使用xlrd(沒有就通…

mysql 中某個字段相同的數據拼接起來

2019獨角獸企業重金招聘Python工程師標準>>> mysql> select name, GROUP_CONCAT( age SEPARATOR ‘#’) from student group by name; ——————————————————— | name | GROUP_CONCAT( age SEPARATOR ‘#’) | ———————————————…

微信紅包系統架構的設計和優化分享

微信紅包系統架構的設計和優化分享 編者按&#xff1a;經過2014年一年的醞釀&#xff0c;2015微信紅包總量創下歷史新高&#xff0c;峰值1400萬次/秒&#xff0c;8.1億次每分鐘&#xff0c;微信紅包收發達10.1億次&#xff0c;系統整體運行平穩, 在這里我分享下微信紅包背后的技…

Jquery各版本下載

jquery-2.1.4 (注&#xff01;jquery-2.0以上版本不再支持IE 6/7/8) 百度引用地址 (推薦目前最穩定的&#xff0c;不會出現延時打不開情況) 百度壓縮版引用地址: <script src"http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> 微軟壓縮版引…

python list方法操作_Python 列表(List)操作方法詳解

參考文獻來源于腳本之家列表是Python中最基本的數據結構&#xff0c;列表是最常用的Python數據類型&#xff0c;列表的數據項不需要具有相同的類型。列表中的每個元素都分配一個數字 - 它的位置&#xff0c;或索引&#xff0c;第一個索引是0&#xff0c;第二個索引是1&#xff…

FastDFS單機版安裝教程

安裝清單如下&#xff1a; 一、安裝FastDFS 1. 安裝libfastcommon 先解壓安裝包到目錄 # unzip libfastcommon-1.0.36.zip 安裝編譯工具及環境&#xff08;后面Nginx也會用到這些依賴環境&#xff09; # yum -y install gcc gcc gcc-c openssl openssl-devel pcre pcre-deve #…

【原創】Chrome最新版(53-55)再次爆出BUG!

2019獨角獸企業重金招聘Python工程師標準>>> 前言 今年十月份&#xff0c;我曾發布一篇文章《Chrome53 最新版驚現無厘頭卡死 BUG&#xff01;》&#xff0c;不過那個BUG在最新的 Chrome 54 中已經修正。 而今天即將發布的Chrome弱智BUG&#xff1a; 僅 Chrome 53 -…

ThinkPHP 發送post請求

function post($url, $paramarray()){ if(!is_array($param)){ throw new Exception("參數必須為array"); } $httph curl_init($url); curl_setopt($httph, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($httph, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($httph,CURLOP…

vue 打包路由報錯_Vue下路由History模式打包后頁面空白的解決方法

vue的路由在默認的hash模式下,默認打包一般不會有什么問題,不過hash模式由于url會帶有一個#,不美觀,而且在微信分享,授權登錄等都會有一些坑.所以history模式也會有一些應用場景.新手往往會碰到history模式打包后頁面一片空白的情況,而且沒有資源加載錯誤的報錯信息.這個其實仔…

leetcode-回文鏈表

請判斷一個鏈表是否為回文鏈表。 示例 1: 輸入: 1->2 輸出: false 示例 2: 輸入: 1->2->2->1 輸出: true進階&#xff1a;你能否用 O(n) 時間復雜度和 O(1) 空間復雜度解決此題&#xff1f; 思路&#xff1a;先遍歷鏈表&#xff0c;獲得長度。 把前半部分的鏈表逆置…

進程kswapd0與events/0消耗大量CPU的問題

http://www.nowamagic.net/librarys/veda/detail/2539 今天下午網站宕了兩次機&#xff0c;發工單給阿里云&#xff0c;發現原因是服務器的CPU 100%了。 重啟服務器后&#xff0c;使用 top 命令看看是哪些進程消耗那么大的 CPU 使用。盯了有好十幾分鐘&#xff0c;主要消耗 CPU…

索引器

namespace _03{ class Program { //請編寫一個類&#xff1a;ItcastClass,該類中有一個私有字段_names,數據類型為&#xff1a;字符串數組&#xff0c;長度為5&#xff0c;并且有5個默認的姓名。 //要求&#xff1a;為ItcastClass類編寫一個索引器&#xff0c;要求該索引器能夠…

跑三小時的monkey測試該怎么算_淺談App測試(下)~帶音頻

文 | Vicky采編&#xff5c;Emily淺談App測試(上)&#xff5e;帶音頻一、功能測試?二、性能測試(1)耗電量影響因素&#xff1a;定位、傳感器、藍牙&#xff0c;其中CPU、持續定位是兩個平臺造成耗電的主要因素。(2)流量也就是常說的耗流量&#xff0c;影響因素有重復請求&…

Flask基礎(03)--創建第一個Flask程序

# 導入Flask from flask import Flask# 創建Flask的應用程序 # 參數__name__指的是Flask所對應的模塊&#xff0c;其決定靜態文件從哪個地方開始尋找 app Flask(__name__,static_url_path/static, # 靜態文件的訪問路徑&#xff0c;默認為/staticstatic_folderstatic, # 靜態…