如何在Rstudio中運用Git進行版本控制

Warning:以下內容基於筆者本人使用的Win10操作系統編寫。

前言

R語言是進行生物信息學數據分析工作的主要計算機語言之一(加上」之一」免得被Python纏住脖子),大量的生物信息學包是基於R開發,比如著名的DESeq2。生物信息學工作者(干「幹活」的)與實驗室的一線研究員(干「濕活」的)都或多或少的會與R接觸。編程這種事情嘛,總是免不了時不時要修改下代碼什麼的。但是如果我某天突然想找回之前被刪掉的代碼呢應該怎麼辦呢(行話叫做「滾回,roll back」)?要知道在R中一但保存退出可就沒有後悔葯可以吃了(和大家使用Excel時完全相同)。這個時候我們就需要請出本文的正神——版本控制技術了。

版本控制(version control)是一種記錄代碼改變過程並加以記錄和管理的技術&工程思想,它可以幫我們輕鬆地歸納整理與可視化出程序「進化」的歷史過程,並且在我們提出要求時為我們滾回其中特定的歷史階段。這在多人合作開發的時候尤其有用。版本控制可以避免因為一個人的失誤而全局皆損,並且在最短的時間內幫助開發組回到上一步,甚至它還能統計出每個人的工作量。版本控制也可以被當成一個雲端資料庫用來託管我們繁雜而老舊的項目,這樣你就不用擔心自己的伺服器和工作站上有大量記不起來用途的文件夾了。託管別的東西也可以,比如本文採用的所有圖片都託管在GitHub上。如果你想了解更多相關內容可以閱讀以下官方文檔: About Version Control.

主流的版本控制系統(version control system)有SVN和GitHub等。其中GitHub採用了分散式代碼管理的技術,是目前最流行的代碼版本控制工具而且是開源和免費的(免費該打引號,免費的數據倉庫會處於公開狀態,任何人都可以訪問,但是只有項目參與者可以提交和修改,對於一般的生信項目這不算事。不公開的私人倉庫就要付費)。作為菜鳥的筆者接下來將分享連接Github與Rstudio的方法。本著能用圖片說明就不要用文字的原則,本文預計含有大量圖片,所以請注意流量消耗。

在開始前的準備

a. 安裝R語言:如果您沒有R應該也不會點進本文來……不過還是奉上鏈接R language。

b. 安裝Rstudio: Rstudio是R最受歡的集成開發環境(IDE),提供了成熟的可視化編程界面。而且其界面似乎為數據分析進行過專門的優化,使用MATLAB與Spyder(Python的一款開發環境)進行數據分析的讀者一定能發現三者窗口布置非常類似……強烈建議使用Rstudio來取代RGui,大幅提高效率。如果您還沒有安裝請點擊鏈接然後選擇適配操作系統的版本下載:Rstudio。

1. Git的安裝與配置

接下來我們將會一一步一步地安裝和配置Git。只有Git呢?Hub怎麼不見了?其實GitHub分為本地倉庫(local repository)與遠端倉庫(remote repository)兩部分,計算機上的代碼會先提交到本地再推送到遠端。其中本地的管理工具被叫做Git,遠端的就是GitHub的網站,統稱Github。

1.1 GitHub 申請賬戶

對於遠端其實比較簡單,登陸GitHub的網站註冊一個賬號就可以了,這個不多說。

1.2 下載和安裝Git

點擊鏈接後選擇合適的版本下載:Git download。 安裝時最好不要修改默認路徑,因為Rstudio會很死腦筋地來這個路徑搜索Git。 在安裝過程中會問你需要使用哪種命令行?其實用Git Bash only已經夠了,但是因為Win10幺蛾子多(我忍不住說了實話)所以還是選擇CMD + Git Bash(Unix命令行)的混搭方式:

其他選項都用默認就可以了。可以讓程序自己創建一個快捷方式,將來會方便些。

1.3 建立本地的R項目

在運用版本控制的過程中有兩種基本的劇本,第一種(劇本A)就是先在本地建立了項目進行開發,之後再在遠端建立倉庫,最後將已經存在的項目推送到遠端。這很常見,有的時候在旅途中突然有個點子立馬開始碼代碼,但是沒有wifi無法推送,就等到到達之後再建立遠端倉庫進行提交。但是這種方法會遇到一些問題,所以將是本文討論重點。第二種劇本(劇本B)略有差異,是先建立了遠端空倉庫,然後將遠端倉庫與Rstudio連接起來建立項目。換言之,建立項目時遠端倉庫已經存在。而且Rstudio會彈出窗口詢問你的遠端倉庫地址。Rstudio會把遠端的倉庫(如果不是空倉庫還會包括內容)克隆到了本地(執行這一操作的命令就是clone)。我們先討論較為複雜的劇本A:

打開Rstudio在菜單中選擇建立新項目:

然後選擇New Directory:

接下來當然是New Project:

最後設定項目的名稱,記得把建立本地倉庫的複選框打上勾:

點擊菜單欄Tools -> Version Control -> Project Setup,然後在彈出窗口中選擇Git/svn。最後將下拉菜單設置為Git再點擊Yes就好。Rstudio會自動重啟,不用擔心:

此時如果你在Rstudio右上角的窗口中發現多了一個Git選項,這就說明你設置成功了:

到此,R本地項目的建立完成。為了接下來的調試,我們可以在此項目下建立一個新的R腳本test.R並且寫入一句批註:

1.4 建立遠端倉庫

既然已經有了本地項目了,現在就該著手建立遠端倉庫了。 首先登陸Github賬戶,選擇Start a project,然後出現如下頁面:

輸入你想要的項目名稱和描述(可選),注意在下方有一個打鉤的選項詢問是否初始化一個README.md文件,那其實就是一個自述文件,你可以在其中輸入對項目的詳細說明免得將來忘記(和你下載遊戲補丁時遇到的讀我.txt是一類東西,不過是使用了Markdown格式,本文原稿也是Markdown格式)。你之後也可以手動創建這個文件。點擊Create repository完成創建遠端代碼倉庫。

1.5 將遠端地址添加到本地

Rstudio和Git還沒有智能到我們建立了GitHub遠端就自動知道的地步(就算能我也一定讓Firewall把他們ban掉,太嚇人了),所以我們需要人工的將遠端地址添加到本地的記錄中。本地的Git的配置有兩種方式,一個是使用Rstudio內部的Git菜單和控制台,對應的是CMD命令行。我實在不喜歡CMD的冗長顯示(其實是因為我記不住命令),所以選擇第二種方式使用Git bash,對應的是Unix/Linux命令行。有時遇到異常或錯誤Git bash會提示你可以嘗試的命令,只需要複製粘貼就行,很貼心。用剛才安裝時建立的快捷方式打開Git bash。

首先先切換到項目所在目錄,輸入命令cd與目錄地址:

cd 『f:/R workspace/test』

用單引號引起路徑是告訴控制台路徑是一個整體,不然會被誤認為是多個獨立的參數而報錯(因為我的路徑包含了一個空格)。單引號或雙引號都是可以的。需要指出因為是Unix的命令行所以使用了正斜杠/,如果你是直接從Windows中複製的路徑請記得把反斜杠換掉。 成功後會顯示如下:

在用戶名後會出現工作目錄的路徑並且有一個藍色的(master),這其實是提示你當前的文件夾內是你程序的主幹(暗示在將來的發展中可能會有其他分支)。同時這也告知你Git已經成功初始化了此項目的配置文件開始跟蹤這個項目(Git:放心,我盯著了)。如果沒有這個(master)出現,說明上面的建立項目的過程可能有誤,請重來,或手工輸入初始化命令:

git init

使用如下命令查看當前鏈接的遠端倉庫:

git remote -v

此時返回的應該是空白才對,因為我們還沒有連接遠程倉庫:

打開GitHub上的遠端倉庫,可以看到一個綠色按鈕clone or download,點擊並複製彈出窗口中的遠端地址:

在控制台中輸入添加遠端地址的命令,記得將你的地址粘貼在命令後。在Unix中複製是Ctrl + insert,粘貼是shift + insert:

git remote add origin github.com/WanYifei/tes ## 地址換成您自己的

然後再次檢查當前的鏈接設置,確認是否添加遠端成功:

可以看到返回的結果中有fetch(接收)與push(推送)兩個地址。當本地從遠端下載數據使用前者,向遠端發送數據使用後者,但是其實兩個地址是相同的。

1.6 將遠端數據拉取到本地

現在遠端已經添加成功,我們需要對本地和遠端進行同步,首先應該把遠端數據拉到本地來。還記得上文提到的README.md文件嗎,此文件當前只存在於遠端,而本地沒有。所以使用pull(拉取)命令將整個遠端拷貝到本地進行合併(merge)。程序只會選出在遠、本兩端存在差異的文件進行傳輸,所以在文件很多的時候也不會耗費太多時間:

git pull origin master

但是有時候會發生錯誤,因為Git無法判斷本地與遠端的數據是否存在歷史聯繫。此時添加如下參數進行拉取和合併:

因為這會對數據進行覆蓋,所以被要求編寫一個備註說明情況方便將來檢查。這裡會自動進入一個Vim文本編輯器內部。Vim可以被視為是Unix/Linux的Word,它有命令模式、輸入模式、底線命令模式三種狀態。不多說,直接開始操作:

當前Vim處於命令模式下:

按下字母i進入輸入模式,屏幕底端會出現或<插入>(專門調出中文操作系統讓大家看):

現在就可以像編輯txt一樣修改上方黃字為所需備註,然後Esc返回命令模式。按下冒號:進入底線命令模式,輸入』wq』回車(意為保存與退出):

控制台反饋顯示README.md被成功拉取合併到本地:

此時如果打開項目的工作目錄會發現README.md已經赫然在列。

1.7 將工作目錄內的文件提交本地倉庫

簡要介紹下Git在本地的三層結構:1. 工作目錄;2. 暫存區;3. 本地代碼倉庫。

工作目錄就是正在進行開發的R程序所在的文件夾。工作目錄中的文件在被加入(add)暫存區前被稱為「未暫存」(not staged)。暫存區顧名思義是暫時保存代碼等待進一步處理或批註的區域,是Git區別於其他版本控制程序的一個特點,有緩衝作用。處於其中的文件被稱為暫存的(staged)。暫存數據可以進一步被提交(commit)到本地代碼倉庫。我們將通過如下步驟來將工作目錄中新創建的test.R文件提交到本地倉庫:在Rstudio的git窗口中將需要提交到暫存區的文件打鉤,文件狀態欄(status)出現A表示添加(add)成功:

點擊git窗口中的Commit按鈕進入提交窗口,此時需要在commit message欄中輸入提交備註,雖然不寫也行,但是推薦在實際工作中認真填寫,對於管理項目幫助很大。填完後點擊Commit完成提交:

如果提交成功,git窗口中對應的文件條目應該會消失。此時test.R就已經處於本地代碼庫了(committed)。注意:提交的其實是文件的一個快照副本而非文件本身,所以工作目錄中的對應文件不會消失。

1.9 推送本地數據到遠端

此時git窗口的向上的箭頭按鈕」push」已經亮起,說明可以使用,但是為了排除可能的故障我們會用命令行而非圖形界面完成推送。與pull相對的push命令可以將本地倉庫中的文件發送到遠端,程序會自動比較兩地文件版本的差異並且加以記錄:git push

Git在開始推送之前會詢問Github用戶名與郵箱,因為Github遠端在接收本地數據時會記錄提交人的身份,郵箱地址被當作ID使用:

當然密碼也是少不了的:

這麼簡單就完了?當然不是,推送失敗了:

究其原因還是程序無法判斷本地和遠端的歷史先後,不知道以誰作為上級分支。所以需要手動為其添加設定,告知程序兩者其實是同一個東西,合併就好。應當使用的設置命令已經被bash貼心地給出在反饋中,直接複製粘貼。會有一個窗口彈出來詢問你的Github密碼:

git push –set–upstream origin master

此時顯示提交成功! 到GitHub的頁面上再去確認一下,可以看到test.R已經存在於遠端了!我們已經成功完成了A劇本下的Git + Rstudio配置!之後不喜歡命令行的同學就可以完全依靠Rstudio中git窗口下的按鈕進行簡單快速的操作了。

2. 項目文件修改與安全設置

本章節進一步介紹文件的推送和Git的一些全局設置,方便大家使用Git和理解Git的工作方式。為了能夠使執行更加清晰,這裡繼續使用命令行而非圖形界面進行操作。

2.1 文件修改後的提交

既然是開發中的項目,就很難避免頻繁的修改。讓我們修改一下工作目錄中的test.R看看會發生什麼。在test.R中隨便敲幾個字保存。回到Git bash,使用status命令查看本地git監視下的文件狀態變化:git status

反饋信息中第一行紅色的部分顯示test.R遭到修改(modified),其上方的白字指出修改後沒有添加到暫存區(not staged)。如果回到Rstudio中也可以看見Status中test.R前顯示了一個大寫的M。

用上文的方法或命令add添加修改後的文件,再次檢查狀態:git add test.R

此時反饋變為綠色並告知已經做好提交準備。

然後輸入commit命令將其提交到本地庫,在參數-m後輸入文件名與備註,備註多於一個單詞需要使用引號:

git commit -m test.R 『test password』 ## test password是隨手寫的備註

之後的推送過程就會與上文介紹的相同,完成後可以在網頁上看到文件與備註都發生了改變

2.2 開啟安全設置

在多次提交文件的過程中,git反覆要求用戶提供賬號密碼,這就尷尬了。難道每次提交都要輸入賬號密碼嗎?當然不是,我們可以將賬號、郵箱、密碼都保存在本地,git會自動地調用他們。在本例子中筆者將用戶名與郵箱設置為全局變數(Git bash默認推薦的設置方法)。當然也可以設置為局部的,大家可以另行谷歌。

設置全局用戶名:

git config –global user.name 「XXX」 ## XXX請換為您的用戶名

設置郵箱:

git config –global user.email 「XXX」 ## XXX請換為您的郵箱

設置完成後需要檢查一下全局設置清單,確認是否保存成功:git config –global –list

如上圖,用戶名和郵箱出現在列表中說明設置成功。

設置密碼: 密碼的設置與用戶名不同(畢竟最重要嘛)。有多種方式可以保存或緩衝密碼。對於最新的windows版本Git,官方推薦使用credential.helper下的manager進行密碼管理。密碼會被作為秘鑰保存在windows系統的秘鑰管理系統而非普通地保存在文本中:

git config –global credential.helper manager

在下次提交時輸入密碼後密碼就會被記錄保存,之後就不再需要反覆輸入了。

設置好之後再檢查一次全局列表確認密碼管理已經打開:

credential.helper = manager顯示已經成功啟動密碼管理。

3. 劇本B條件下的配置

劇本B是較為簡單的情況,有了上文劇本A的操作經驗可以很快完成設置。

首先建立遠端倉庫test2:

然後再打開Rstudio建立項目。這次請選擇第三項Version control:

然後選擇Git:

最後將遠端的地址粘貼到對話框中,項目名test2會自動出現,點擊Create project將遠端克隆到本地:

劇本B下的配置已經基本完成,能夠自由地進行pull與push操作了。可以根據需要決定是否進行安全設置。是不是比劇本A簡單多了呢?所以如果可能請選擇以這種方式建立項目。

尾聲

上面絮絮叨叨了這麼多,筆者初步地介紹了Git與Rstudio結合進行版本控制的方法,希望能給您帶來些許的收穫。生物信息學作為一個交叉學科涉及面極其廣闊,需要掌握大量的知識和技能,而計算機科學理論與計算機工程技巧毫無疑問是其中重要的一環。筆者作為初出茅廬的新人也在不斷學習當中。希望能有更多機會與大家交流,共同進步。如果您對此文有什麼意見或建議歡迎留言或發送郵件交流。

最後再次感謝閱讀!也歡迎您訪問BioEngX查閱更多生命科學相關文章。

作者:Yifei Wan, 馬凱特大學/威斯康辛醫學院,研究方向:生物信息學

關注作者:

Yifei Wan - BioEngX

原文鏈接:

如何在Rstudio中運用Git進行版本控制 - BioEngX


推薦閱讀:

生物信息學100個基礎問題:問題及答案目錄
【生信菜鳥經】漫談如何跨越擺在生信入門路上的三大障礙
生信入門系列之 linux 入門(一):初識 linux 系統
信分析平台搭建(十九):安裝Galaxy
生物信息學100個基礎問題 —— 第5題 測序建庫的adapter

TAG:生物信息學 | R語言繪圖 | GitHub |