1. 程式人生 > >Git的使用以及GitHub

Git的使用以及GitHub

  

現在從一個故事開始講起:

  說到版本控制,腦海裡總會浮現大學畢業是寫畢業論文的場景,你電腦上的畢業論文一定出現過這番景象!

畢業論文_初稿.doc
畢業論文_修改1.doc
畢業論文_修改2.doc
畢業論文_修改3.doc
畢業論文_完整版1.doc
畢業論文_完整版2.doc
畢業論文_完整版3.doc
畢業論文_最終版1.doc
畢業論文_最終版2.doc
畢業論文_死也不改版.doc
...

以上就是使用最原始的方式進行版本控制,但是這種方式有顯著缺點:

  • 多個檔案,保留所有版本時,需要為每個版本儲存一個檔案...
  • 協同操作,多人協同操作時,需要將檔案打包發來發去...
  • 容易丟失,被刪除意味著永遠失去...(可以選擇網盤)

為了解決以上版本控制存在問題,應運而生了一批版本控制工具:VSS、CVS、SVN、Git等,其中Git屬於絕對霸主地位。

1.首先去下載Git

    Git是一個用於幫助使用者實現版本控制的軟體

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

    Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。

    Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援。

 

 

小A創業筆記:

第一階段:在沙河的的日子

  小A是一個年輕有為程式設計師,從小立志要幹出一番大事,某個深夜小A在網上查詢**老師主演的學習視訊,花了1個小時才找到想要的資源,小A想到和自己一樣的有為青年每天花費大量的時間尋找喜歡老師的作品,感覺自己幹大事的機會來了,毅然決然選擇創業,建立一個XX平臺

命令:

git init #初始化

初始化後,會在當前目錄自動建立 .git 資料夾,該檔案是Git中最重要的資料夾,因為Git相關檔案以及版本都將儲存在該資料夾中,有了它,媽媽再也不用擔心我好多檔案來記

錄版本了,通過Git命令可以將所有版本儲存在 .git 檔案中,兩條命令建立一個版本:

 

MacBook-Pro-4:pondo wupeiqi$ git status               #對指定資料夾下的所有檔案及子目錄進行版本控制 檢視當前git狀態
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
  
    .idea/
    app01/
    db.sqlite3
    manage.py
    pondo/
    readme
    templates/
  
nothing added to commit but untracked files present (use "git add" to track)
MacBook-Pro-4:pondo wupeiqi$ git add .                       # 添加當前目錄下所有檔案到版本庫
MacBook-Pro-4:pondo wupeiqi$ git commit -m '第一次提交'        # 提交到版本庫,並填寫版本說明,以便以後回滾。
[master (root-commit) df47fe4] 第一次提交
 33 files changed, 879 insertions(+)
 create mode 100644 .idea/dictionaries/wupeiqi.xml
 create mode 100644 .idea/encodings.xml
 create mode 100644 .idea/inspectionProfiles/profiles_settings.xml
 ...

注意:執行git commit 命令時,可能會提示進行使用者和郵箱的配置,該配置用於記錄當前版本由那個使用者提交

  • git config --local user.name '郭成'
  • git config --local user.email '[email protected]'

 

基本命令總結:

  • git init,初始化,表示即將對當前資料夾進行版本控制。
  • git status,檢視Git當前狀態,如:那些檔案被修改過、那些檔案還未提交到版本庫等。
  • git add 檔名,將指定檔案新增到版本庫的暫存狀態。
  • git commit -m '提交資訊',將暫存區的檔案提交到版本庫的分支。
  • git log,檢視提交記錄,即:歷史版本記錄
  • git reflog
  • git reset --hard 提交記錄(版本號)
 

 

工作區:當前開發程式所在目錄稱為工作區,即:工作開發都是在該目錄,該區域的檔案會有狀態的變化且狀態由git自動檢測,如果程式中檔案做任何操作(增、刪、改),檔案狀態均會被檢測到,可以使用 【git status】命令檢視。

版本庫:工作區檢測到有檔案發生變化,那麼意味著較上一個版本之後對程式進行了修改,修改完成之後,可以當做下一版本進行提交,那麼就是執行 【git add .】 將所有檔案提交到暫存區,然後再執行【git commit -m '又一個版本'】提交到版本庫的分支即可,之後可以使用【git log】命令檢視版本記錄。

MacBook-Pro-4:pondo jesi$ git log
commit 0972f4bb43104baee15aeec2dd62bd0a307ec837
Author: jesi <[email protected]>
Date:   Fri Aug 11 10:54:42 2017 +0800
    非洲專區上線
commit 6c439d2fd0d943f36f3ee84e158ff86b052961d2
Author: jesi<[email protected]>
Date:   Fri Aug 11 10:42:09 2017 +0800
    專案首次移植到Git控制版本

MacBook
-Pro-4:pondo jesi$ git reset --hard 6c439d2fd0d943f36f3ee84e158ff86b052961d2 HEAD is now at 6c439d2 專案首次移植到Git控制版本 # 命令執行完,工作區的所有檔案就變成未開發非洲專區功能之前了,太爽了有麼有....

回滾倒是完成了,小A在想如果某一天想要在回有非洲專區功能的版本怎麼辦呢?來來來,不能像以往通過【git log】來檢視記錄再回滾了,再回去需要這麼搞:

MacBook-Pro-4:pondo jesi$ git reflog
6c439d2 [email protected]{2}: reset: moving to 6c439d2fd0d943f36f3ee84e158ff86b052961d2
0972f4b [email protected]{3}: commit: 非洲專區上線
6c439d2 [email protected]{4}: commit (initial): 專案首次移植到Git控制版本
 
MacBook-Pro-4:pondo jesi$ git reset --hard 0972f4b
HEAD is now at 0972f4b 非洲專區上線

 

第二階段:開發直播的功能  開發過程中臨時需要修復BUG或臨時有新功能到來

方式一:

            git stash   [暫存走手頭工作]
            
            修完BUG後...
git stash pop [在拿回來] git stash 將當前工作區所有修改過的內容儲存到“某個地方”, 將工作區還原到當前版本未修改過的狀態 git stash list 檢視“某個地方”儲存的所有記錄 git stash clear 清空“某個地方” git stash pop 將第一個記錄從“某個地方”重新拿到工作區(可能有衝突) git stash apply 編號, 將指定編號記錄從“某個地方”重新拿到工作區(可能有衝突) git stash drop 編號,刪除指定編號的記錄 git stash幫助我們暫時儲存已經開發了一些功能的程式碼,繼續做其他事, 做完之後再回來繼續開發。

 特別的:執行 git stash pop 命令時,可能會遇到衝突,因為在緊急修復bug的程式碼和通過stash儲存在“某個地方”的程式碼會有重合部分,所以執行 git stash pop 時候就會出現衝突,有衝突解決衝突即可。

 

 

方式二【推薦使用,公司都建立分支】:

       git branch dev   建立DEV分支
            
            git branch bug   建立bug分支
            git branch -d bug 刪除bug分支
            git checkout dev  跳到Dev這個分支
            
            bug修復完成。
            跳到master 
            
            想把bug的程式碼合併過來 git merge bug

分支學習:branch稱為分支,預設僅有一個名為master的分支。一般開發新功能流程為:開發新功能時會在分支dev上進行,開發完畢後再合併到master分支。 

整體這個流程就是下面這樣子:

MacBook-Pro-4:pondo wupeiqi$ git branch                     # 當前在master分支
* master
 
 
MacBook-Pro-4:pondo wupeiqi$ git branch dev                 # 建立dev分支用於開發新功能
 
MacBook-Pro-4:pondo wupeiqi$ git checkout dev               # 切換到dev分支
Switched to branch 'dev'
 
MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py             # 開發新功能到一半,需要緊急修復Bug
 
MacBook-Pro-4:pondo wupeiqi$ git add .
 
MacBook-Pro-4:pondo wupeiqi$ git commit -m '新功能開發一半'
[dev b3ac2cb] 新功能開發一半
 1 file changed, 2 insertions(+)
 
MacBook-Pro-4:pondo wupeiqi$ git checkout master            # 切換回master分支
Switched to branch 'master'
 
MacBook-Pro-4:pondo wupeiqi$ git branch bug                 # 建立bug分支
 
MacBook-Pro-4:pondo wupeiqi$ git checkout bug               # 切換到bug分支
Switched to branch 'bug'
 
MacBook-Pro-4:pondo wupeiqi$ vim pondo/settings.py          # 修改bug
 
MacBook-Pro-4:pondo wupeiqi$ git add .                      # 提交bug
 
MacBook-Pro-4:pondo wupeiqi$ git commit -m '緊急修復bug'      # 提交bug
[bug f42f386] 緊急修復bug
 1 file changed, 1 insertion(+), 1 deletion(-)
 
 
MacBook-Pro-4:pondo wupeiqi$ git checkout master            # 切換會master
Switched to branch 'master'
 
MacBook-Pro-4:pondo wupeiqi$ git merge bug                  # 將bug分支內容合併到master分支,表示bug修復完畢,可以上線
Updating 0972f4b..f42f386
Fast-forward
 pondo/settings.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 
 

MacBook-Pro-4:pondo wupeiqi$ git checkout dev               # 切換到dev分支,繼續開發新功能
Switched to branch 'dev'
 
MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py             # 繼續開發其他一半功能
 
MacBook-Pro-4:pondo wupeiqi$ git add .                      # 提交新功能
 
MacBook-Pro-4:pondo wupeiqi$ git commit -m '繼續開發完成'      # 提交功能
[dev c0bfb27] 繼續開發完成
 1 file changed, 1 insertion(+)
 
MacBook-Pro-4:pondo wupeiqi$ git checkout master            # 切換回master分支
Switched to branch 'master'
 
MacBook-Pro-4:pondo wupeiqi$ git merge dev                  # 將dev分支合併到master分支
Merge made by the 'recursive' strategy.
 app01/views.py | 3 +++
 1 file changed, 3 insertions(+)

 

這裡有一個面試題問到的就是:線上臨時出了BUG,怎麼解決? 

    首先建立一個BUG的分支,
    把程式碼修改處理完成在合併到master,
    最後把這個bug分支刪除掉,
    回到Dev分支繼續開發。

 

第三階段:在三里屯買了一層樓,不再侷限於家裡。

需要程式碼託管的網站或平臺:GitHub

登入GitHub
建立新的倉庫
然後執行git init
git commit -m '版本資訊'


上傳程式碼 git remote add origin https:
//github.com/jesiDream/pay.git 給地址起一個別名origin git push origin master 將本地master分支內容以及版本資訊推送到GitHub 輸入使用者名稱密碼上傳完成!
git push origin dev               將本地dev分支內容以及版本資訊推送到GitHub

 

在公司

新電腦第一次使用,需要將程式碼從GitHub中獲取並繼續開發,開發完事下班就下班回家。

git clone https://github.com/WuPeiqi/pondo.git    # 將專案從GitHub中獲取
git Branch                      # 預設獲取到得只有master分支

git branch dev origin/dev                        # 建立dev分支且和遠端dev分支同步
git checkout dev                   # 切換到dev分支

開發了1/3的會員功能 git add .    # 提交新功能到版本庫的分支 git commit -m '第一天開發了1/3的會員功能' git push origin dev   # 提交dev分支內容到遠端GitHub託管倉庫的dev分支

 

在家裡

回到家後
git checkout dev                   # 切換到dev分支 git pull origin dev   # 從遠端GitHub倉庫獲取dev分支最新內容,併合併到本地 這時拿到的就是會員開發了1
/3的功能的程式碼 在家把功能寫完了! git add . git commit -m '會員功能開發完畢' git push origin dev  # 提交新功能到版本庫的分支

第二天去了公司:
git checkout dev                                    # 切換到dev分支
git fetch origin dev                # 從GitHub倉庫獲取dev分支最新內容到版本庫的分支
這時候拿到就是昨晚寫的
git merge origin/dev                           # 將版本庫的分支內容合併到工作區
 git add                              # 新增檔案到版本庫的暫存狀態    git commit -m  'xxxxxxxxxxx'                     # 提交新功能到版本庫的分支

如果git log

那麼
會員功能開發完畢
第一天開發1/3
這兩個版本的都有。

 

命令:

git remore add origin https://xxxxx

git push origin dev 往上推程式碼

git clone httos://github.com/xxxxx

git pull origin dev 往下拉程式碼

git fetch origin dev
git merge origin/dev

git pull origin master
git fetch origin master 
git merge origin/master 改:git rebase origin/dev

 

面試題:git rebase的作用?

保持一條幹淨的提交記錄。[提交記錄的整潔]

 

第四階段:招到人了,多人協同開發

 未完待續。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

感謝沛齊老師幽默風趣的講述了Git.