課程源碼Git操作指南

本文章不是Git指南,不會談及過多Git知識點,只談如何使用;至於原理,詳細操作手段建議百度。

首先Git與SVN一樣都是版本控制系統;大部分同學應該在學校都聽老師說過或者用過,那麼把Git當作SVN來用也未嘗不可;當然沒有用過也無所謂,咱們不一定需要這樣的基礎。

Git是一個開源的分散式版本控制系統,用于敏捷高效地處理任何或小或大的項目。

Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支持。

簡單來說,Git就是版本控制系統,並且不需要伺服器支持就可以運轉。你可以在自己電腦上安裝Git工具,即可建立Git項目,進行Commit提交。同樣的把Commit提交的項目拷貝到其他電腦,只要其他電腦也有GIt軟體,則就可以讀取Commit等一系列記錄。

Git 軟體

官網:git-scm.com/

通過官網你可以下載Git的基礎軟體,通過該軟體你就可以建立你的項目了。

市面上的:Github、開源中國的Git、Gitlab都是基於Git進行後續的開發與擴展;而慕課的也是類似。

在前面,我們談到Git不需要伺服器也可以運轉,那麼為什麼需要Github,Gitlab這些網站?

這更多的是為了進行多人開發協作,Git不光是可以進行Commit提交,還可以進行合併操作。

簡單來說,小明把代碼開發後在自己電腦建立Commit1,小溪開發後在自己電腦建立了Commit2;如果他們開發的是同一份項目,理論來說應該進行同步;那麼此時就是Github這些發揮作用的時候,小明把自己的Commit push到伺服器上,而小溪先拉取小明的Commit,隨後與自己的進行合併,然後push到伺服器,那麼此時伺服器就同時包含了小明、小溪的代碼了。

Git Gui

默認的Git都是命令操作的,你在GitHub,慕課上看見的網頁操作其實僅僅只是將步驟簡化為可視化界面了而已。

可視化軟體集合

這裡給大家推薦兩個可視化工具:

  • Mac:Tower
  • Windows:SourceTree

兩個平台推薦的是不同的工具,並不是功能有多強大,僅僅只是界面更加人性化,舒服而已。

創建一個項目

git init

進入任意目錄你可以將當前目錄轉變為Git倉庫;可以是空目錄,也可以是已有項目的目錄。

與普通目錄相比,在當前目錄下會多一個隱藏的**.git**目錄,在該目錄下包含有所有的Git記錄與操作。

所以很多同學,常常是這樣複製代碼的:

這樣複製代碼後放到新的電腦上,你如果使用Git可視化界面打開會發現你的所有記錄都沒有了,這是因為你並沒有Copy到Git文件夾,僅僅只是把當前的狀態下的快照拷貝了而已。

Ok,這樣拷貝則沒有問題,因為你Copy的是外部文件夾,默認會把隱藏文件也一起Copy。

配置Git

官方配置教程

一般來說主要配置一下自己的賬戶與郵箱即可:

$ git config --global user.name "John Doe"$ git config --global user.email [email protected]

其他的,大家可以百度,或者看教程都是不錯的選擇。下面我們進入正題如何玩轉慕課的代碼提交。

進入慕課Git倉庫

一般來說老師至少建立有一個線上倉庫,這裡我們進入code倉庫。

這裡,我們關注3個地方:

  1. 分支:通過分支我們可以切換到不同的代碼進度上,當然一般情況下我們只需要master即可。大部分的慕課老師也是基於master主分支進行開發的。
  2. 下載:紅色箭頭部分;點擊後可以實現下載當前分支的最後的代碼狀態。不建議,因為你只能下載當前的快照而不包含提交記錄,這跟前面所說的拷貝的原理一樣。
  3. Clone地址:這個強烈建議,通過該地址可以將伺服器上的Git倉庫完美的同步到電腦上成為本地的倉庫項目。

Ok,大家一定要有遠程倉庫(慕課網上的,Github上的)與本地倉庫(自己電腦上的)的概念。

另外頂部有3個按鈕可以選擇:

  • 關註:該選項點擊後,當老師更新當前倉庫時你可以收到通知
  • 點贊:這個就。。。使勁點吧
  • Fork:這個的作用相當於把可以在伺服器上創建一個私人的副本。具體流程可以簡單理解為:imooc/課程/code -> imooc/私人/code代碼還是在伺服器上,但是有一個自己的空間來存儲。

伺服器上主倉庫,與私有倉庫區別在於:

  1. 主倉庫老師具有寫入許可權push;學生僅有pull讀取許可權
  2. 私人倉庫自己具有所有許可權,可以把本地倉庫代碼push到自己的私人倉庫中。

基礎信息:

  1. 提交記錄當前從圖片來看是86個提交;我一般是一個課程小節一次提交記錄;這樣方便同學可以查閱每一次小節課程的對比差異。
  2. 代碼分支:1個;本來有多個,但是為了不混淆大家的視線,所以僅僅是master;以後可能會有一些額外的分支用來做後續的擴展開發。
  3. 版本發布:13次;這個其實是TAG,我一共打了13個TAG,每個大章節結束後打一次TAG,方便同學能夠快速定位大章節。

在本地可視化工具看來就是類似於:

額外Tab介紹

  1. 代碼:這個部分就是預覽代碼的視圖
  2. Issues:這是有BUG,有意見的時候可以去這兒提交;老師可以看見並且回復。課程答疑區也是可以。
  3. Pull Request:簡稱PR,簡單來說就是合併請求。前面我們說了同學沒有push許可權,也就是不能直接推代碼到主倉庫;但是同學可以fork到自己的私人倉庫,私人倉庫是允許本地倉庫推送文件上去的。那麼此時同學可以本地修改好提交到私人倉庫,然後從私人倉庫提交合併請求到主倉庫;當老師合併後你的代碼就到主倉庫去了。
  4. Wiki:文檔,對於代碼的一些注意事項老師可能會寫到這裡。
  5. 綠框部分:這就是提交一個Pull Request的地方。

PR示意圖:

Clone 到本地倉庫

這裡需要注意,Clone到本地的文件夾必須是空文件夾,因為遠程倉庫clone到本地後就是一個本地倉庫了;不需要在本地執行 git init 初始化倉庫。

HTTPS模式

複製地址後,在點上打開命令輸入;隨後進入到任意空文件夾。比如我電腦上的demo目錄;隨後執行 git clone + url地址的命令

$ cd /Users/qiujuer/Downloads/Doc/demo
$ git clone https://git.imooc.com/coding-286/code.git

在該流程中首次會叫你輸入用戶名+密碼;你可輸入慕課的賬戶郵箱與密碼即可。建議在進行本地git初始化工作時設置郵箱為慕課的賬戶郵箱。

Last login: Sat Dec 22 17:24:06 on ttys000
qiujudeMacBook-Pro:~ qiujuer$ cd /Users/qiujuer/Downloads/Doc/demo
qiujudeMacBook-Pro:demo qiujuer$ git clone https://git.imooc.com/coding-286/code.git
Cloning into code...remote: Counting objects: 1909, done.remote: Compressing objects: 100% (510/510), done.remote: Total 1909 (delta 683), reused 1887 (delta 665)Receiving objects: 100% (1909/1909), 1.18 MiB | 1.43 MiB/s, done.Resolving deltas: 100% (683/683), done.qiujudeMacBook-Pro:demo qiujuer$

當看見出現done的字眼時,恭喜你已經clone一個倉庫到本地了。

SSH模式

該模式更適合大文件,大項目傳輸;當項目中有較大文件,或項目較大時建議使用;一般情況下直接使用HTTPS模式即可。對於SSH模式需要配置本地ssh。

關於本地SSH如何生成流程本身較為繁瑣,這裡貼上一些鏈接:

  • 伺服器上的 Git - 生成 SSH 公鑰
  • 百度搜索

需要注意的是:

  1. 建立ssh的時候建議使用默認**「id_rsa」命名,並存儲在用戶/.ssh** 目錄中。
  2. 郵箱使用慕課的賬戶郵箱,密碼也建議使用慕課網站的賬戶,也可以空密碼。

以上做法最主要的是避免clone慕課ssh地址時識別本地ssh文件錯誤;無法正常拉項目;在Mac上若沒有使用默認的id_rsa命名,也可以先進行***touch***操作後再進行拉取操作。

當建立好ssh文件後會得到兩份文件:id_rsa、id_rsa.pub ;使用文本打開你的 id_rsa.pub ,當然也有可能是其他命名。

複製好內容後點擊網頁:用戶設置:

點擊新增:

隨後在密鑰內容處粘貼內容,名稱一般會自動識別到你的密鑰中的郵箱;如果沒有回車一下試試;實在沒有那就自己把郵箱寫上去吧。

進行Clone:

$ cd /Users/qiujuer/Downloads/Doc/demo
$ git clone ssh://[email protected]:80/coding-286/code.git

箭頭輸入yes,綠框部分是提示輸入本地創建ssh文件的密碼,你設置的什麼就輸入什麼;我這個地方3次是因為輸入錯誤了2次。

成功後和上面HTTPS模式類似,本地已經多了一個倉庫了。

基礎查閱

一般來說我們使用老師的代碼clone到本地都是為了方便查閱提交。

Commit查閱

$ git log

往下回車將會查閱更多的歷史信息。

第一行中還包含了:當前的文件狀態就是指向的當前的最後一次Commit,並且Tag:L12-END也是指向的當前Commit,以及遠程倉庫的分支等信息。

退出Commit查閱

英文狀態下輸入Q即可。

差異對比

git diff commit-id commit-id --stat

commit-id為commit記錄的唯一標誌。;若我們想要對比:**「12-11 前置-簡單內存復用與細節優化(四)」與「12-10 簡單內存復用與細節優化(三)」**之間的差異則可以執行:

可以見有1個文件更改,26行新增,47行刪除。

加上**—stat**是為了查閱狀態,而非具體的內容;如果不加則是:

可以看到具體的刪除,更改狀態。

其他的一些diff命令:

git diff 無參數默認比較工作區與暫存區

git diff --cached 比較暫存區與最新本地版本庫最好commitgit diff HEAD 比較工作區與最新本地版本庫HEAD位置git diff [commit-id] 比較工作區與指定commit-id的差異      git diff --cached [commit-id] 比較暫存區與指定commit-id的差異git diff [commit-id1]~[commit-id2]比較兩個commit-id之間的差異

以上的操作使用可視化工具依然可以,而且更為方便:

至於如何新增一個commit,那對於大家來說就是非常簡單的了。

遠程倉庫

可能你會在本地有一個項目後需要提交到自己的遠程倉庫中,此時涉及到遠程倉庫的使用,那麼我建議你閱讀:Git-基礎-遠程倉庫的使用

這裡就不再補充講解了。

高級操作

在這個部分你將了解到如何把倉庫的代碼會滾到對應章節,以便自己核對代碼。

前景提要

小明正在學習課程並且根據課程一點點敲自己的項目代碼;雖然老師的代碼步驟很完整,但是小明還是遇到一些問題,運行後與老師的效果有所不同;此時小明想要知道自己的代碼哪裡有問題。

  • 小明學習的章節是:4-1章節
  • 目前課程代碼HEAD章節:12章節

若小明直接在網站上下載代碼後進行對比會發現與課程差異太多了,根本不是老師講的代碼,這不是老師的錯;而是快照的鍋。小明下載的代碼是12章節的快照,自然與前面章節差異較大。小明應該得到的是4-1章節的快照。

簡要步驟

  1. 我們拉取代碼到本地
  2. 將代碼基於4-1的提交創建新的分支
  3. 將HEAD指向新的分支(檢出分支)

此時代碼已經自動回滾到HEAD指向的Commit記錄中;並且步驟2並不是必須,你也可以直接強制將HEAD指向歷史的某個Commit記錄,但需要保證當前工作區無更改。

$ git reset --hard

qiujudeMacBook-Pro:code qiujuer$ git reset --hard 9d0234f6323cd17c98994c608d1f83eac4fe48a7
HEAD is now at 9d0234f L4 新增實戰課程第一小節代碼內容

以上是強制指定到某個Commit記錄的方案,HEAD則代表當前的工作區。該方案是較為臨時的,暴力的方案。

這種方案不利於我們回到最後的提交記錄上,所以我們使用分支的方案。

回到最初的指向:

$ git reflog
$ git reset --hard 164f75f

git reflog 得到我們最近的更改記錄Commit的變化,然後再次進行指向回去即可。

基於分支的方案

關於什麼是分支,我建議查閱:官方的分支介紹

首先我們基於Commit創建分支:

git checkout -b test_4_1 9d0234f

  • test_4_1 分支名字
  • 9d0234f 4-1章節的Commit記錄的前面7位

可以看出,我們創建了分支,並且自動檢出了分支;當前的工作區就在當前分支了。

qiujudeMacBook-Pro:code qiujuer$ git branch
master* test_4_1
qiujudeMacBook-Pro:code qiujuer$

執行git branch命令可以看出也是OK的。此時我們就是2個分支了,若想回到12章節的狀態,我們只需要檢出master分支即可。

想要回到4-1,那就再檢出test_4_1分支即可。

這種方式是較為健康的優秀的方案。

第一種方案雖然簡單快捷,但是有一定的隱患。

意外問題

第一種方案是有隱患的,咱們前面說了,具體是什麼隱患;來看看:

我們先強制定位到當前的4-1位置。

此時已經OK,但是你會發現工作區居然有512個更改。這是因為該方式其實就是將工作區目標重定向到歷史的某個節點。

而歷史的節點與最後的節點之間肯定有非常多的更改,這些更改中可能存在文件新增或者其他更改,對於git可能並不能安全的回滾,所以默認的工具會將這些更改放到未提交的工作區中。

而這些更改我們並不需要,所以直接刪除即可:

注意:Windows的欄位命名可能不同。

如果發現刪除多了文件,比如這種顯示D的就是刪除了文件,但是該文件本應該再4-1有的文件就會這樣顯示。我們只需將其直接設置到4-1即可:

此時我們分支是master ,那麼選擇master即可;你當前的HEAD指向的是什麼分支就選擇什麼分支:

OK,此時工作區已經乾淨了,此時的代碼就是4-1的代碼。

4-1 = master = test_4_1

至於旁邊顯示向下箭頭77,那是因為在當前commit之後還有77個提交記錄而已。如果你看完代碼後,也可以直接通過工具重定向回到最後的更改即可。

只是回到最後的分支時也有可能出現工作區有更改的情況,參照上面的方式直接把文件更改重置即可。

如果你在軟體中切換分支則沒有那麼繁瑣,所以先建立分支,隨後切換分支的方式是我推薦的方案。

總結

以上就是慕課的Git的一些簡單操作,大家可以使用命令;也可以使用可視化工具操作,我建議使用可視化工具查閱代碼更改更為方便。

當然你也可以使用命令操作後再使用idea打開項目進行git log查閱這也是非常好的。

最後還是推薦一下我的課程:

  1. Socket網路編程進階與實戰
  2. 手把手開發一個完整即時通訊APP

IM 通訊課程耗費1年才錄製完成,Socket課程總耗時1年半完成;算是難產,但內容絕對超值。

感謝大家閱讀全文。

作者:Qiujuer來源:慕課網本文首次發佈於慕課網 ,轉載請註明出處,謝謝合作
推薦閱讀:
相关文章