国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Git 全功能介紹

系統 Linux
如今 Git 已經成為絕大多數開發者的選擇, Tom Preston-Werner、Chris Wanstrath 和 PJ Hyett 在 2007 年 10 月推出的 Github 已經成為了全球最大的開發者網站,

Git 歷史和現狀

Git 是 Linux 作者 Linus 的另一個作品。2002 年他還在使用 Bitkeeper 作為 Linux 內核的版本管理,但因為它是 Copyright 有版權的軟件備受質疑,然后 Andrew Tridgell 對 Bitkeeper 進行逆向工程,導致 BitMover 要回收 Linux 開發者的 Bitkeeper 的免費使用權,Linus 一怒之下花了 10 天寫出了 Git。

名字的意思是:egotistical bastard

如今 Git 已經成為絕大多數開發者的選擇, Tom Preston-Werner、Chris Wanstrath 和 PJ Hyett 在 2007 年 10 月推出的 Github 已經成為了全球最大的開發者網站,我們廠在上面也是貢獻頗多。

Tencent at Github

更有甚者,一向自己造輪子的的微軟,也打算把巨達 300G 的 Windows 源代碼遷移到 Git 上進行管理,他們為 Git 提供了新的 GVFS 實現,有效地改善了 Git 對巨大代碼倉庫的性能。

Microsoft will migrate windows source code to git

另外說一句:Docker 的二進制 image 管理,也是基于 git 實現的。

集中式版本管理和分布式版本管理

Git 和 SVN 是從設計理念上就不一樣的版本工具,SVN 將代碼進行中心化管理,擁有更好的穩定性和安全性,但是去中心化的 Git 卻是從 Linux 操作系統的開發需求而來,更加適合多人協作的開源項目,可以以任何一個點為 remote 將他的代碼與本地代碼合并,隨著時間發展,還衍生出了更多強大功能和一整套操縱流程,讓它也可以適應了商業軟件的開發。

Central and distribution

Git 和 SVN 代碼歷史的不同

SVN 的代碼歷史相對比較簡單,因為它是中心化的,所有人的代碼都直接提交到某個 repository 上,所以它的 Reversion ID 號是一個按順序增加的數字類型,一般情況下不能在兩個數字之間插入別的 reversion。

SVN History

Git 的看起來就是雜亂多了,它的 Reversion ID 號是一個 40 位長度的 hash 值,通常也可以縮寫為 7 位,這樣做的原因是因為 Git 的最小單位是代碼修改的歷史,即為補丁 Patch,而分支、 Tag、Remote(一會兒會說到這些概念)等都只是分支的集合,互相之間可以隨意拆分、合并。

我更愿意把分支、Tag、Remote 想象成不同的平行宇宙,因為某些機緣導致產生了分裂,走向了不同的歷史,也可能因為某些機緣又合并到了一起,變得更加強大。

Git history

Git 基礎命令

Git sences

Git 按照場景可以分為以下場景(Scence):

  • Workspace:當前工作區,修改的的最初狀態。
  • Staging:修改后,添加到準備提交的緩存狀態。
  • Local repository:本地的代碼倉庫,只對自己的代碼生效。這也是和 svn 區別之一,svn commit 之后就直接提交到遠程服務器了,git commit 之后只是到本地代碼庫。
  • Remote repository:遠程代碼庫,將自己的本地代碼庫同步到遠程代碼庫上,這樣可以供別的開發者分享自己的成果。

具體流程看圖即可,下面對幾個常用命令進行簡單介紹

PS: 圖中沒有提到 rebase 和 cherry-pick 命令,這兩個命令也非常強大,后面有提到,有時間可以關注一下。

補丁 diff

之前有提到過,補丁是 Git/SVN 代碼版本管理的基礎概念,它其實是以行為單位的文件修改歷史,增加行以 + 號開頭 ,刪除行以 - 號開頭,而修改一行,就是先 - 后 +。

在 Git 里可以通過 git diff 或者 Linux/Mac/Conemu 中,也可以通過 diff -Naur 來生成文件對比結果,有點類似下圖。

這是整個代碼管理的基礎概念,所有的分支、Tag、Remote 都是在此基礎上衍生的。

Git diff

基本流程

1. 克隆代碼到本地開發環境 - Clone

$ git clone [REPOSITORY_URL]

對應到了 svn checkout 命令,用于把遠程代碼克隆到本地,跟 svn 一樣,REPOSITORY_URL 的協議非常靈活,之前流行用 ssh/scp 協議,但現在 https/http 協議漸漸流行起來了。

2. 更新代碼 - Status/Commit/Log

剛有提到過 Git 的四種場景,其中前兩種場景需要通過

$ git status

命令查看,代碼剛剛新建可以看到是 Untracked files(Workspace) 狀態,執行 add 之后變成 Changes to be commited(Stage) 狀態,修改了 Stage 中的文件,又會變成 Changes not staged for commit 狀態。執行 commit 之后就從 Stage 中轉移到了 Local repository 中,可以通過

$ git log

查看到代碼提交。

3. Branch 和 Tag

如剛從所說,Branch 和 Tag 都可以看成是補丁的時序化集合,branch 可以互相合并,在 clone 完 repository 后有一個主線分支叫做 master。而 Tag 用于發布后標記版本,這兩個只是從名字上不一樣,功能(我感覺實現上)并沒有太大區別。

和 SVN 不同, SVN 的 Branch 和 Tag 都是把 Trunk 整個代碼庫拷貝出來,Git 只是將補丁引用重新對當前代碼應用一下,所以 Git 的 Branch/Tag 都非常輕量,切換起來非常輕松,使用 Git 要盡量多使用它的分支來提高開發效率,一會兒提到 Git flow 時會描述一下如果用分支進行代碼功能開發管理。

3.1 新建分支的兩種辦法

$ git checkout -b [BRANCH_NAME] # 在當前版本切換并新建分支
$ git branch [BRANCH_NAME] # 直接新建分支

3.2 切換分支

$ git checkout [BRANCH_NAME]

3.3 合并分支的兩種辦法

$ git merge [BRANCH_NAME] # 將另外一個分支的代碼,打到當前分支之后。
$ git rebase [BRANCH_NAME] # 不推薦,對代碼進行比較,將本分支修改后的代碼打到另外一個分支之后

rebase 通常情況下不推薦使用,因為 rebase 完下游分支,再從上游分支 merge 的時候會丟失分支合并的 commit,但是對于部分有 history mysophobia 的人來說,它是保持代碼提交歷史記錄干凈的神器,那個 Merge branch 'xxx' of http://git.code.oa.com/xxx into yyy 的 commit 看起來也挺討厭的。

對于已經推到 remote repository 的 commit,是不建議 rebase 的,因為一旦 rebase 了,別人再 pull 就會出一大堆的沖突 conflict,而且基本沒法修,通常情況下還是建議用 merge 穩妥一些。

PS: rebase 還有一個強大的功能是配合 --interactive 參數修改之前的補丁,具體自己查一下,但是改完了 push --force 上去,別人再 pull 回來出 conflict 是必然的,但是這招是修改 Github 上的 Pull request(后面有提到)必備技能。

3.4 刪除分支

$ git branch -d [BRANCH_NAME] # 已經合并到 master
$ git branch -D [BRANCH_NAME] # 該分支未合并到 master,強制刪除

PS: 即使刪除了分支等,也可以用 git reflogs 找回來喔

3.5 取消修改

git stash # 取消全部修改,很強大的是它可以恢復過來,具體自己查一下
git reset —soft [REV] # 保留修改內容,從 Local repository 中撤銷,也可以用于回退歷史記錄
git reset —hard [REV] # 丟掉修改內容,從 Local repository 中撤銷,也可以用于回退歷史記錄

推送本地代碼到遠程倉庫

推送代碼是為了跟別人一起合作,命令行非常簡單

$ git push [REMOTE] [BRANCH]

remote 默認為 origin,如果不填的話就推送到它上面,branch 默認為當前分支,其實可以不加,加了就把指定的分支推送到遠程了。如果要將推送本地功能分支,建議 push 后面加上 —set-upstream 參數。

鄭重警告:永遠不要對主線 master 分支執行 —force

獲取遠程分支更新

$ git pull # 把代碼更新到  workspace
$ git fetch # 把代碼更新到 Local repository,可能需要通過 merge 再合并到 worksapce 一次。

遠程倉庫

Clone 之后會有一個默認的遠程倉庫為 origin,但如果還要增加別的遠程倉庫,就需要用到下面命令了:

$ git remote add [REMOTE_NAME] [URL] # 添加原創倉庫
$ git fetch [REMOTE_NAME] # 獲取遠程倉庫更新
$ git branch -a # 查看包括遠程倉庫以內的所有分支
$ git push [REMOTE_NAME] [BRANCH_NAME] # 推送到遠程倉庫

Github Pull Request & Gitlab Merge Request

Github 在 Git Remote 的基礎上為了方便大家參與開源項目,衍生出的一套機制,目前常規開源項目的參與流程是,先注冊一個 Github 賬號,然后將感興趣的開源項目 Fork 一份到自己的 namespace 下,然后拆分分支進行修改,然后提交到自己的 Github repository 下,再發起一個 Pull Request,讓項目維護者來合并你的代碼(Pull request 名副其實),在這個過程中,項目維護者會對你的代碼進行 Review 和點評,你得按照維護者要求進行修改(這里 rebase 會用得很勤),修改通過,維護者同意后,就有他將代碼合并進項目中。

具體流程自己走一圈就明白了,Gitlab 的 Merge Request 原理是一模一樣的。

PS: 范例圖片在 PPT 的第 22 頁起

Git flow

Git flow 本來應該是本文的重點內容的,它是在 Git branch 的基礎上實現了一套簡單的功能模塊化開發流程,主要思想是把分支分成了上下游幾個層級,然后通過一套命令行工具進行維護。

  1.  master 分支 - 與線上版本保持一致,當發生線上問題后可以很輕松地修復。
  2.  develop 分支 - 功能開發基線分支,功能開發完之后合并到上面,所有功能開發完畢后經過測試上線,然后合并回 master。
  3. feature/* 功能開發分支 - 從 develop 上拆分,也需要隨時把 develop 的更新 merge 回來,跟上游的分支保持一致,等功能開發完畢之后,即可合并到 develop。通過和上游分支保持一致,這樣可以避免對誤刪別人的代碼,所有代碼沖突必須在下游分支修好,測試完畢后才可合并到上游分支。
  4. hotfix/* 熱修復分支 - 主要用于線上 bug 修復,但是修復后應該同時合并到 master 和 develop 兩個分支上。

Git flow

然后 git flow 提供了套命令行工具來更加輕松地去做這些代碼合并的事情。

$ git flow init # 初始化 git flow 分支模型
$ git flow feature start [NAME] # 開始一個功能分支
$ git flow feature finish [NAME] # 將功能分支合并進 develop
$ git flow hotfix start [NAME] # 開始一個熱修復分支
$ git flow hotfix finish [NAME] # 將補丁合并進 develop 和 master
$ git flow release [NAME] # 發布一個新版本,打 tag

感覺 Git flow 得有個篇幅,下次有機會再來詳述。

其它內容

有興趣可以繼續看一下別的相關內容,非常有意思:

  1. git svn - Git 可以以 svn 為代碼后端,通過 Giit 來對 SVN 里的代碼進行版本管理。
  2. git reflogs - 引用記錄,在 git 中誤刪除某提交是不用害怕的,只要 commit 了,就可以通過 reflogs 找到,用 reset 或者 cherry pick 恢復。
  3. git cherry pick - 摘櫻桃(commit),從另一個分支中單獨將某個 patch 摘回來。
  4. git bare repository - 建立 Git 服務器
  5. git submodule - 子模塊,一個大項目可以通過 submodule 進行拆分,可以隨時進行子模塊的版本更新和回溯。
  6. git hooks - 鉤子,當 git 在 repository 上發生某種行為的時候,可以通過鉤子觸發一些行為,像目前 Github 上的一些第三方持續集成服務,就是在此基礎上實現的。
  7. git signature - 簽名,通過 gpg 在 commit 時對 patch 進行簽名,證明那個補丁確實是自己提交的,可以參考一下 Github 的文檔。
  8. Source Tree - Source Tree 是一套跨平臺的 Git 圖形界面,簡單方便,我目前主要用它進行基本的 Patch 閱讀,比命令行更加舒服。
責任編輯:龐桂玉 來源: 奇妙的Linux世界
相關推薦

2009-12-07 10:27:51

WCF分頁

2020-02-15 17:09:07

交換機訪問安全以太網

2010-09-02 15:28:30

DHCP功能

2012-12-11 10:35:39

MDM安全MDM

2010-10-08 11:49:35

2015-01-20 09:11:19

2012-12-26 10:31:10

2014-12-31 17:12:54

模糊查詢模糊查詢

2012-09-11 09:45:34

2009-12-02 10:44:30

Visual Stud

2009-08-23 11:57:40

路由器安全網絡傳輸

2010-03-23 11:25:53

2012-12-25 10:17:24

2017-03-06 16:12:11

Linux安裝器Linux 發行版

2013-10-15 21:55:02

穿戴式電腦EYETOP

2011-09-28 09:26:55

2019-03-24 13:40:18

編程Julia開發

2012-04-06 08:50:42

微軟Azure安全

2017-09-19 14:40:07

軟件授權比特安索

2011-12-02 14:17:51

Java
點贊
收藏

51CTO技術棧公眾號

激情乱色小说视频| 老司机午夜在线视频| 亚洲国产精品va在线看黑人| 亚洲性色av| 免费毛片网站在线观看| 欧美激情一区二区三区全黄| 欧美亚洲三区| 精品一区中文字幕| 欧美激情电影| 精品国产一区二| 天堂av中文在线| 日韩精品中文字幕有码专区| 久久黄色片视频| 国产精品青草久久| 亚洲另类春色校园小说| 深夜爽爽视频| 国产在线播放91| 欧美伊人精品成人久久综合97| 美女国产精品| 欧美不卡高清一区二区三区| 18成人在线视频| 国产经典欧美精品| 精品一区二区三区免费看| 国产精品精品视频一区二区三区| 在线观看视频一区| 久久国产亚洲| 成人看片app| 丝袜一区二区三区| 国产精品女主播av| 性xxxx丰满孕妇xxxx另类| 91高清视频免费| 欧美激情在线一区二区| 性欧美1819sex性高清| 97视频中文字幕| 红杏aⅴ成人免费视频| 久久久久99精品成人片| 久久久久久久久中文字幕| 国产精品永久在线| 中文字幕日韩欧美一区二区三区| 91蜜臀精品国产自偷在线| 在线观看美女网站大全免费| 青娱乐国产91| 欧美精品制服第一页| 精品国产91乱高清在线观看| 色播在线观看| 亚洲成人在线视频播放| 久久综合色综合88| 久久亚洲国产| 中文字幕色婷婷在线视频| 五月亚洲综合| 日日骚一区二区网站| 久久99热精品这里久久精品| 精品久久久久久中文字幕大豆网| 久久国内精品视频| 伊人久久大香线蕉| 宅男在线观看免费高清网站| 亚洲日本电影在线| 国产精品成人自拍| 日韩精品黄色| 91人人澡人人爽人人精品| 国产日韩欧美综合精品 | 日本不卡影院| 久久久久久久片| 成人欧美一区二区三区黑人免费| 成人97精品毛片免费看| 91社在线播放| 国产91精品视频在线观看| 91精品视频网| 成人免费一区二区三区在线观看| 日韩成人伦理电影在线观看| 亚洲另类av| 欧美xx视频| 成人午夜影视| 国产视频1区2区3区| 日本在线观看一区| 日本久久亚洲电影| 亚洲天堂开心观看| 国产精品久久久久久妇女| 免费的一级黄色片| 91在线播放视频| 欧美高跟鞋交xxxxhd| 日韩精品在线网站| 亚洲一区二区在线播放相泽| 国产一区二区视频在线播放| 亚洲精品午夜av福利久久蜜桃| 国产aⅴ精品一区二区四区| 日本中文字幕在线播放| 成人亚洲成人影院| 中文字幕一区二区三区5566| 亚洲国产一区二区三区| 人人澡人人添人人爽一区二区| 嫩草影院官网| 日韩激情视频一区二区| 国产精品美女诱惑| 人人爽久久涩噜噜噜网站| 怡红院精品视频| 欧美一区二区三区视频免费| 亚洲成人你懂的| 欧美国产一区二区在线观看| 久久99精品久久久久| 午夜精品剧场| 在线看日韩欧美| 欧美军同video69gay| 亚洲精品国产精华液| 99精品视频在线播放观看| 男男视频亚洲欧美| 影音先锋亚洲一区| 99精品美女| 日韩成人av在线资源| 99综合久久| 日韩免费小视频| 91豆花视频在线播放| 免费看a在线观看| 夜色福利资源站www国产在线视频| 欧美精品www| 黄色小说综合网站| 免费在线亚洲| 亚洲一级影院| 欧美色综合网| 91精品一区二区三区综合在线爱 | 国产乱人伦偷精品视频免下载| 亚洲激精日韩激精欧美精品| 欧美激情偷拍自拍| 激情五月综合网| 午夜先锋成人动漫在线| 91麻豆精品激情在线观看最新 | 色美美综合视频| 一区二区三区欧美在线观看| 国产精品你懂的在线| 亚洲国产高清在线观看视频| 99久久婷婷国产精品综合| 一区二区三区高清国产| 亚洲电影中文字幕在线观看| 亚洲男人电影天堂| 椎名由奈av一区二区三区| 中文字幕一区二区三| 国产精品视频yy9299一区| 久久久久久久久久久久久久久99 | 2020中文字幕在线| 午夜免费高清视频| 天堂中文视频在线| 15—17女人毛片| 99视频资源网| 男女18免费网站视频| 午夜亚洲国产au精品一区二区| 26uuu欧美日本| 久久九九全国免费| 日本一二三不卡| 亚洲人成影院在线观看| 一区二区久久久| 色综合色综合色综合色综合色综合 | 亚洲视频 欧洲视频| 亚洲精品美国一| 亚洲va欧美va人人爽午夜| 色偷偷一区二区三区| sm久久捆绑调教精品一区| 在线午夜视频| 9i精品一二三区| 人成在线免费网站| 不卡精品视频| 精品久久美女| 国产日韩欧美一区在线| 狠狠网亚洲精品| 国产欧美精品国产国产专区 | 精品免费av在线| 国产日韩欧美中文在线播放| 色偷偷av一区二区三区乱| 欧美高清视频在线播放| 国产精品久久久久久搜索| 91社区国产高清| 日韩一本精品| 国产最新免费视频| jizz蜜桃视频在线观看| 蜜芽tv福利在线视频| 婷婷色在线播放| 先锋影音网一区二区| 西瓜成人精品人成网站| 亚洲视频高清| 国内精品视频666| 久久精品夜夜夜夜久久| 一区二区三区日韩精品视频| 国产精品视频首页| 爱情岛论坛亚洲品质自拍视频网站| 三上悠亚国产精品一区二区三区| 中文字幕久久精品一区二区| 日韩欧美自拍| 欧美aⅴ一区二区三区视频| 久久丝袜美腿综合| 欧美日韩国产精品专区 | 国产国语videosex另类| 国产精品久久久久久久久久直播 | 精品婷婷伊人一区三区三| 亚洲国产日韩一区| 欧美激情a∨在线视频播放| 91精品久久久久| 椎名由奈jux491在线播放| 免费羞羞视频网站| 欧美黑人xx片| aaa国产精品| 国产又黄又猛又粗|