Git &GitHub Git版本控制

Git版本控制

GIT介紹  

Git 是一個開源的分佈式版本控制軟件,用以有效、高速的處理從很小到很是大的項目版本管理。 Git 最初是由Linus Torvalds設計開發的,用於管理Linux內核開發。Git 是根據GNU通用公共許可證版本2的條款分發的自由/免費軟件,安裝參見:http://git-scm.com/html

GitHub是一個基於Git的遠程文件託管平臺(同GitCafe、BitBucket和GitLab等)。git

Git自己徹底能夠作到版本控制,但其全部內容以及版本記錄只能保存在本機,若是想要將文件內容以及版本記錄同時保存在遠程,則須要結合GitHub來使用。使用場景:github

  • 無GitHub:在本地 .git 文件夾內維護歷時文件
  • 有GitHub:在本地 .git 文件夾內維護歷時文件,同時也將歷時文件託管在遠程倉庫

其餘:django

    集中式:遠程服務器保存全部版本,用戶客戶端有某個版本
    分佈式:遠程服務器保存全部版本,用戶客戶端有全部版本服務器

GIT安裝

安裝:https://git-scm.com/downloadsapp

GIT基本使用

先進入你要管理的文件夾,例如咱們進入一個django項目文件夾分佈式

打開GIT工具ide

git init 初始化,表示即將對當前文件夾進行版本控制工具

初始化後,會在當前目錄自動建立 .git 文件夾,該文件是Git中最重要的文件夾,由於Git相關文件以及版本都將保存在該文件夾中,有了它,媽媽不再用擔憂我好多文件來記錄版本了,經過Git命令能夠將全部版本保存在 .git 文件中post

git status  查看Git當前狀態,如:那些文件被修改過、那些文件還未提交到版本庫等

上圖中紅色的文件就是還未管理的文件

git add .  git add 文件名,將指定文件添加到版本庫的暫存狀態

添加完成後再次查看狀態git status

能夠看到這些文件都變綠了,都被管理起來了

git commit -m "描述信息"  將暫存區的文件提交到版本庫的分支

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

  • git config --local user.name 'xxx'
  • git config --local user.email 'you@example.com'

提交完成後再次查看狀態git status

發現當前工做目錄已經空了,這時若是對一個文件進行修改,再查看

會發現該文件又出現了,此時能夠再次提交

這樣咱們就又了兩個版本了,如何查看呢

git log 查看提交記錄,即:歷史版本記錄

 能夠看到每個版本都對應一段字符串,若是要回滾到第一次提交

git reset --hard daf67abd92c4425f61575200da54b56d8978b380

這時再查看歷史記錄git log

發現第一次修改的版本沒有了,要如何找到呢

git reflog

切換回第一次修改

代碼開發到一半,須要修改前一個版本的bug

有時候當咱們正在開發時,可能上一個版本出現了bug,須要緊急修復,這時該怎麼辦呢,這裏有兩種方式

方式一:使用git stash

咱們可使用git stash命令,這樣咱們寫了一半的代碼就會被保存到一個暫存區域,而後代碼會回滾到咱們修改前的版本,也就是有bug的版本,咱們就能夠進行bug修復了,修復完bug後,咱們進行提交

提交完成後咱們須要回到咱們以前開發了一半的狀態繼續進行開發,這時須要執行git stash pop將以前開發了一半的內容從暫存區再次拿到工做區進行開發

特別的:執行 git stash pop 命令時,可能會遇到衝突,由於在緊急修復bug的代碼和經過stash存儲在「某個地方」的代碼會有重合部分,因此執行 git stash pop 時候就會出現衝突,有衝突解決衝突便可

複製代碼
a. 原來內容:
    from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲專區') b. 開發到一半直播功能: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲專區') def live(request): print('開發到一半') return HttpResponse('....') c. 執行git stash,回到當前版本未修改狀態: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲專區') d. 修復Bug並提交: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲xxxxx專區') e. 繼續開發直播功能 git stash pop,此時會出現衝突: MacBook-Pro-4:pondo wupeiqi$ git stash pop Auto-merging app01/views.py CONFLICT (content): Merge conflict in app01/views.py 表示app01/views.py存在衝突須要解決,此時文件內容爲: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): <<<<<<< Updated upstream: # 修復Bug時更改的內容 return HttpResponse('非洲xxxx區') ======= # 修復Bug前正在開發新功能時的內容 return HttpResponse('非洲專區') def live(request): print('剛開發到一半') return HttpResponse('直播功能') >>>>>>> Stashed changes 須要自行解決衝突,而後繼續開發,如: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲xxxx區') def live(request): print('剛開發到一半') return HttpResponse('直播功能')
複製代碼

git stash其它相關命令

git stash             將當前工做區全部修改過的內容存儲到「某個地方」,將工做區還原到當前版本未修改過的狀態
git stash list        查看「某個地方」存儲的全部記錄
git stash clear     清空「某個地方」
git stash pop       將第一個記錄從「某個地方」從新拿到工做區(可能有衝突)
git stash apply     編號, 將指定編號記錄從「某個地方」從新拿到工做區(可能有衝突) 
git stash drop      編號,刪除指定編號的記錄

方式二:使用分支

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

 咱們要開發時通常要先建立一個dev分支,並在dev分支上進行開發,master分支上通常放咱們開發完成的代碼

  • git branch 分支名稱            建立分支
  • git checkout 分支名稱          切換分支
  • git branch -m 分支名稱         建立並切換到指定分支
  • git branch                    查看全部分支
  • git branch -d 分支名稱         刪除分支
  • git merge 分支名稱             將指定分支合併到當前分支

假如咱們如今正在dev分支上開發,忽然master分支上的前一個版本出現了bug,須要緊急修復咱們須要進行以下操做

複製代碼
dev(開發)

當要緊急修復bug了
    a. [dev]將 dev 中如今正在開發的功能提交到dev
        git add .
        git commit -m 'xxx'
        
    b. 切換回主分支
        git checkout master 
    
    c. 建立並切換到bug分支
        git branch bug 
        git checkout bug 
        在bug分支上進行修復....
        git add .
        git commit -m 'xxx'
        
    d. git checkout master 將修復好的bug分支合併到主分支
        git merge bug 
        
        git branch -d bug  刪除bug分支
複製代碼

git merge 時也可能會出現衝突,解決衝突的方式上述stash相同,即:找到衝突文件,手動修改衝突並提交,此處再也不敖述

git rebase

git rebase也是用來合併的,只是和git merge有一點小區別,git merge合併的提交記錄仍是兩條線,而git rebase會將提交記錄合併到一條主線

git rebase  合併+將提交記錄合併到一條主線=> 提交記錄整潔

若是產生衝突:
    解決完衝突後
    git rebase --skip

遠程git倉庫

上面咱們使用git都是將全部的內容存在本地,若是咱們既在公司寫代碼,回了家也要寫呢,這時咱們就須要一個遠程的倉庫,將咱們的代碼保存在這個遠程倉庫中

GitHub,一個基於Git實現的代碼託管的平臺,能夠將內容以及版本記錄在遠程也保存一份,這樣就不用U盤咯(相似於雲盤)。PS: 相似GitHub的產品還有許多,如:GitLab、Bitbucket、碼雲等

基於GitHub實現代碼託管,須要一下步驟:

  • 註冊GitHub
  • 建立倉庫,建立完倉庫後會有一個URL代指該倉庫,如:

  • git能夠是用該URL進行向遠程推送版本信息或獲取版本信息

這樣咱們就能夠在家和在公司都進行開發了,具體步驟

複製代碼
a. 註冊帳戶 + 建立項目 + 拷貝地址 https://gitee.com/wupeiqi/xianglong.git

b. 家,本地代碼推送遠程
        cd 項目目錄
        git remote add origin https://gitee.com/wupeiqi/xianglong.git   給遠程地址建立一個別名origin,這個別名能夠任意寫
        
        git push origin master    將本地內容推送到遠程的master分支
        git push origin dev       將本地內容推送到遠程的dev分支
        
        繼續寫代碼
        git add . 
        git commit -m '提交記錄'
        git push origin dev 
c. 第一次公司
    下載代碼
        git clone https://gitee.com/wupeiqi/xianglong.git    適合在一個空目錄執行,這句命令就至關於下面的好幾個命令
        或
        建立目錄 
        cd 目錄 
        git init 
        git remote add origin https://gitee.com/wupeiqi/xianglong.git
        git pull origin master
        
        
    建立dev分支
        git checkout dev 
        git pull origin dev 
        
        
        繼續寫代碼
        git add . 
        git commit -m '提交記錄'
        git push origin dev 
d. 回家 
    拉代碼:
        git pull origin dev 
        
    繼續寫:
        
        繼續寫代碼
        git add . 
        git commit -m '提交記錄'
        git push origin dev 
複製代碼

久而久之,將Git和GitHub結合使用作到避免電腦損壞形成數據丟失以及多地開發的問題,上文執行過程當中執行 【git pull origin 分支】命令等同於【git fetch origin 分支】+ 【git merge origin/分支】,而且在執行過程當中可能會出現衝突,緣由是因爲本地代碼和獲取的最新代碼有重合部分,那麼就須要本身手動解決衝忽然後再繼續開發

協同開發

以前咱們都是一我的在作開發,如今業務變複雜了,須要多人協同開發了,該怎麼辦呢

多人協同開發:每一個人建立一個分支
master 
dev 
    - kouxinlong
    - heng 

咱們能夠在dev下每人再建立一個分支,每一個人在本身的分支中開發,開發完一個功能後再合併到dev分支,固然在合併以前咱們也能夠進行檢查,能夠再dev再建一個review分支

複製代碼
公司是否作代碼的review?誰來作?怎麼作?
master 
dev 
    - review(組長作代碼review)
    - kouxinlong
    - heng 
通常:小功能合併;1/2/3
複製代碼

review完沒有問題的代碼再合併到dev分支上

github中如何和別人一塊兒開發

  • 合做者,將其餘用戶添加到倉庫合做者中以後,該用戶就具備向當前倉庫提交代碼。
  • 組織,建立一個組織,而後再該組織下能夠建立多個項目,組內成員能夠向組內全部項目提交代碼。PS:也能夠對某個項目指定合做者

協同開發命令和以上步驟相似,此處就再也不從新寫代碼,而是使用文件描述三人協同開發整個過程。

  • 建立程序
    • 用戶A建立程序,提交到GitHub
    • 用戶B克隆項目
    • 用戶C克隆項目
  • 開發功能
    • 用戶A開發功能1
    • 用戶B開發功能2
    • 用戶C開發功能3
  • 提交
    • 用戶A提交功能1,並push(A用戶手速快,先提交。)
    • 用戶B提交功能2,沒法push,由於GitHub上已經有其餘人提交的新代碼。
      解決方法:從GitHub上獲取最新代碼併合併到本地,提交本身開發的功能2。
    • 用戶C提交功能3,沒法push,沒法提交,由於GitHub上已經有其餘人提交的新代碼。
      解決方法:從GitHub上獲取最新代碼併合併到本地,提交本身開發的功能3。
  • 獲取最新代碼
    • 用戶A獲取最新代碼
    • 用戶B獲取最新代碼
    • 用戶C獲取最新代碼

給別人的代碼提意見 

從上面咱們知道要想修改別人的代碼須要成爲別人的合做者,可是有些牛逼的代碼是不會讓你成爲合做者的,那麼咱們要怎麼作呢

找到想搞的項目,fork一下,而後這個項目就在本身倉庫出現了

從本身倉庫獲取代碼並進行編輯提交

建立並提交一個pull request,而後等待原做者是否贊成這個pull request,若是贊成那麼在做者的源代碼中就推出現我提交的功能

.gitignore 文件

建立 .gitignore 文件,編寫git忽略哪些文件

複製代碼
以斜槓「/」開頭表示目錄;

以星號「*」通配多個字符;

以問號「?」通配單個字符

以方括號「[]」包含單個字符的匹配列表;

以歎號「!」表示不忽略(跟蹤)匹配到的文件或目錄;
複製代碼

當咱們在github上建立項目時能夠根據語言自動生成ignore文件

相關文章
相關標籤/搜索