Git分佈式版本控制工具

1、安裝Git

   一、下載Windows版的Git:msysgit;官方下載地址:http://msysgit.github.io,安裝選定要安裝的目錄(路徑杜絕中文),剩下的按照默認安裝便可,參考:GIt安裝教程 。html

   二、安裝完成後,在開始菜單裏找到「Git」->「Git Bash」,彈出一個相似命令行的窗口;或是在CMD命令提示符下,輸入git回車能夠看到不少提示,就說明Git安裝成功!python

   三、初始化目錄 生成隱藏文件 .git 負責版本的保存git

mu@mu-PC MINGW64 /c/guotianbao
$ git init
Initialized empty Git repository in C:/guotianbao/.git/

   四、安裝完成後,由於Git是分佈式版本控制系統,因此,每一個機器都必須自報家門:你的名字和Email地址,在命令行輸入:  github

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git config --local user.name 'guotianbao'

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git config --local user.email 'gmu1592618@gmail.com'

 2、經常使用命令

 

 

1.基本命令

  -1.查看狀態服務器

$ git status //查看工做區狀態
$ git diff //若git status提示有文件被修改,則可執行此命令查看修改的內容

    執行git status命令會看到兩部分,上邊是文件提交的暫存區,下邊是文件所在的工做區;在當前工做區,而沒有提交到暫存區的文件顏色是紅色的,提交到暫存區的文件是綠色的,若是工做檯面是乾淨的話,證實全部文件已提交到倉庫。ssh

  -2.提交數據分佈式

$ git add .                     #提交全部文件
$ git commit -m "自定義提交信息"  #提交註釋

     $ git add . 把文件從工做區提交到暫存區ide

     $ git commit 把暫存區的全部內容提交到當前分支(倉庫)fetch

   -3.查看文件信息網站

$ git ls-tree head   #查看版本(分支)中全部的文件
$ git ls-files -s    #查看暫存區和版本中全部文件的詳細信息
$ git ls-files       #僅查看全部的文件名

  -4.查看全部日誌

$ git log    //顯示操做日誌
$ git log  --pretty=oneline //顯示精簡信息
$ git reflog //查看全部的日誌

  -5.回滾版本

#方式一: (三步操做)
    $ git reset --soft 版本號  #從分支回到暫存區
    $ git reset head 文件      #從暫存區回到修改過的內容
    $ git check out  文件      #從修改過的文件到原文件
#方式二: (兩部步操做)
    $ git reset --mix 版本號   #從分支回到修改過的內容 == git reset 版本號
    $ git check out  文件      #從修改過的文件到原文件
#方式三: (一部步操做)
    $ git reset --hard 版本號  #從分支回到原文件

  -6.刪除文件

$ git rm test.txt
$ git commit -m "remove test.txt"  
2. 場景案例模擬

示例一:

1.  建立msg.py 寫入短信功能代碼並提交到分支

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git add .

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git commit -m '開發短信功能'
[master (root-commit) 99afeac] 開發短信功能
 1 file changed, 1 insertion(+)
 create mode 100644 msg.py

2.回滾到無短信功能的版本

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git log
commit 99afeacb8e856c7c4fd66cde1d633923703775f7 (HEAD -> master)
Author: guotianbao <gmu1592618@gmail.com>
Date:   Sat Nov 4 08:09:18 2017 +0800

    開發短信功能

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git reset --hard 99afeacb8e856c7c4fd66cde1d633923703775f7
HEAD is now at 99afeac 開發短信功能

3.直接再次回滾到有短信功能的版本

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git reflog
99afeac (HEAD -> master) HEAD@{0}: reset: moving to 99afeacb8e856c7c4fd66cde1d633923703775f7
39b29ba HEAD@{1}: commit: 增長aaa
99afeac (HEAD -> master) HEAD@{2}: reset: moving to 99afeacb8e856c7c4fd66cde1d633923703775f7
99afeac (HEAD -> master) HEAD@{3}: commit (initial): 開發短信功能

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git reset --mix 39b29ba
Unstaged changes after reset:
M       msg.py

mu@mu-PC MINGW64 /c/guotianbao (master)
$ git checkout msg.py

# 底下兩部操做等於 git reset --hard 版本號
    git reset --mix 版本號
    git checkout 文件名

 

示例二:

    stash 將工做區作的全部修改(作到一半的操做)保存到一個臨時地方  

#- 正在寫代碼(a.txt),發現線上代碼(a.txt)有bug,先把如今代碼保存到臨時空間
#- 修改完bug(a.txt)提交,再次取回以前保存的文件,這時發現以前保存的代碼和提交的bug是同一個文件,有衝突
#- 這時(a.txt)中二者都保留,手動保留想要的代碼,再次提交
#臨時保存如今寫的代碼
git stash  

#去修改出現bug再次提交 
bug....# 解決bug的過程
git add .
git status
git commit -m "修改完bug"
git status

#切回以前保存的狀態 git stash pop
  -若是修改的文件和保存的文件是同一個文件,則此文件中會保留二者的代碼,需手動改回本身須要的代碼
  - 若是不是同一個文件,則直接提交
git stash pop
git add .
git status
git commit -m "bug上又一次修改"
具體過程
3.分支  
dev     #負責開發新功能
bug     #負責修復線上的bug
master  #線上代碼
###分支

#dev分支
    git branch       #查看全部分支
      * master       #前面有*號表明是當前分支
    
    git branch dev   #建立dev分支
    
    git branch       #查看全部分支
        dev
      * master       #前面有型號表明是當前分支
      
    git checkout dev #切換到dev分支
    
    git branch
      * dev          #當前分支
        master


#bug分支
    git branch bug   #給master建立一個bug分支
    git branch       #查看當前分支
        bug
        dev
      * master       #當前所在分支
      
    git checkout bug #切換到bug分支
    git branch
      * bug
        dev
        master

#修改完bug 把bug分支和master合併
    git checkout master #切換到master分支,而後合併bug分支
    git merge bug
    
# 刪除分支
    git branch -d bug   #只刪除完成合並以後的dev分支
    git branch -D bug   #強制刪除dev分支
建立、合併、刪除分支
4.遠程倉庫

  因爲本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的,因此,須要以下設置:

  第1步:建立SSH Key。在用戶主目錄下(例如:C:\Users\Administrator\),看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key: 

$ ssh-keygen.exe //建立SSH key 【公鑰和私鑰,鏈接省卻了用戶名密碼的輸入】git窗口下,直接執行ssh-keygen.exe,默認往下執行,而後把公鑰複製到github上

  若是一切順利的話,能夠在用戶主目錄裏找到.ssh目錄,裏面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa私鑰,不能泄露出去,id_rsa.pub公鑰,能夠放心地告訴任何人。
  第2步:登錄GitHub,打開「settings」,「SSH and GPG Keys 」頁面,而後,點「New SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容,最後點擊「Add Key」按鈕完成。
  說明:爲何GitHub須要SSH Key呢?由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。固然,GitHub容許你添加多個Key。
  假定你有若干電腦,你一下子在公司提交,一下子在家裏提交,只要把每臺電腦的Key都添加到GitHub,就能夠在每臺電腦上往GitHub推送了。  

添加遠程倉庫

  一、登陸GitHub網站,並按網站要求建立一個新的倉庫;

  二、根據GitHub網站提示,能夠從這個倉庫克隆出新的倉庫,也能夠把一個已有的本地倉庫與之關聯,而後,把本地倉庫的內容推送到GitHub倉庫。

  三、本地倉庫與GitHub上相應的倉庫創建關聯,代碼以下:(git@github.com:tianbaoo/test.git爲我新建的倉庫路徑)

$ git remote add origin git@github.com:tianbaoo/test.git

  添加後,遠程庫的名字就是origin,這是Git默認的叫法,也能夠改爲別的,可是origin這個名字一看就知道是遠程庫。

  四、把本地庫的內容推送到遠程庫上,用git push命令,實際是把當前分支master推送到遠程。

$ git push -u origin master

  因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令(不用帶-u參數)。固然也能夠不寫!就須要你手動輸入yes
  當你第一次使用Git的clone或者push命令鏈接GitHub時,會獲得一個警告,這是由於Git使用SSH鏈接,而SSH鏈接在第一次驗證GitHub服務器的Key時,須要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes回車便可。  

  五、經過GitHub上的倉庫來克隆出新的本地倉庫(能夠在任意一個文件夾下,建議最好在一個固定的盤下方便於管理),要克隆一個倉庫,首先必須知道倉庫的地址,而後使用 git clone命令克隆從遠程庫克隆到本地(說白了就是下載版本庫)。代碼以下:  

$ git clone git@github.com:tianbaoo/test.git //應用場景:切換辦公地點:家和公司,第一次都能從遠程庫上克隆而後進行開發!

注意點:執行clone命令,實質上內部已經完成了初始化git庫和本地與遠程庫鏈接的過程(內部config文件,已寫好命名,同時遠程庫名字默認爲origin)!

  也許還注意到,GitHub給出的地址不止一個,還能夠用 https://github.com/tianbaoo/test.git 這樣的地址。實際上,Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議。使用https除了速度慢之外,還有個最大的麻煩是每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh協議而只能用https。Git支持多種協議,包括https,但經過ssh支持的原生git協議速度最快。

本地和遠程倉庫

#本地代碼推送到遠程倉庫
git remote add origin git@github.com:tianbaoo/test.git  #設置遠程倉庫並設置別名origin
git checkout master       #把當前分支切換到master分支
git push origin master    #推送到master分支
 
#從遠程倉庫拉代碼
git clone git@github.com:tianbaoo/test.git
cd test/
git branch          #只下載master分支
    #* master
git branch  -a      #查看全部分支 有遠程的分支
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/dev
      remotes/origin/master
git branch dev origin/dev       #拉遠程分支的代碼
git branch
        dev
    *  master
經常使用命令

 

現實場景:

  在公司進行開發代碼,代碼沒有寫完,想要回家加班繼續寫,而後應該把公司的代碼push到服務器上

$ git remote add origin https://github.com/tianbaoo/test.git #給本身的遠程庫起origin別名

$ git checkout master     # 切換到master分支
$ git push origin master  # 把master分支推送到GitHub上

  回到家之後先把代碼clone下來,進行修改後,再push到遠程倉庫上

$ git clone https://github.com/tianbaoo/test.git #去GitHub上把代碼複製下來

$ cd test/ #進入test文件夾

$ git branch dev origin/dev #建立一個跟遠程倉庫同名的dev分支
$ git checkout dev          #切換到dev分支下

#寫代碼. . .
	. . .
	. . .

$ git add .                       #加到暫存區
$ git commit -m '自定義提交信息'  #加到分支
$ git push origin dev             #把dev分支提交到遠程倉庫orgin
公司:
    git checkout dev
    #選其中一個
    git fetch origin dev    #從遠程拉到本地的倉庫 還須要 git reset --hard 文件        
    git pull origin dev     #從遠程拉到原文件
    
    #----------提交成功完成-----------
    功能11
        git add .
        git commit ...
        git push origin dev
    #----------忘記提交,下班回家-------
    功能12:
        git add .
        git commit ...
        git push origin dev
回家:
    git branch dev
    git pull origin dev
    功能13:
        git add .
        git commit ...
        git push origin dev


#如今處於功能12沒有提交的狀態
#先拉代碼查看功能13和功能12是否有衝突,若是有衝突,手動修改 不能直接提交        
公司:
    獲取代碼,
        git pull origin dev
        
        無衝突:過
        有衝突:
            手動解決
            git add .
            git commit -m '解決衝突'
後續

 

情景:

第一步:在github上建立項目myblog,而後本地在blog目錄下啓動GIT執行命令git init

第二步:git add .  而後再次 git commit -am "第一次提交項目"

致使github上的版本里有文件和本地版本衝突,下面給出衝突緣由:

1 $ git push -u origin master
2 Username for 'https://github.com': tianbaoo
3 To https://github.com/tianbaoo/myblog.git
4 ! [rejected] master -> master (non-fast-forward)
5 error: failed to push some refs to 'https://github.com/tianbaoo/myblog.git'
6 hint: Updates were rejected because the tip of your current branch is behind
7 hint: its remote counterpart. Integrate the remote changes (e.g.
8 hint: 'git pull ...') before pushing again.
9 hint: See the 'Note about fast-forwards' in 'git push --help' for details. 
View Code

解決方法:

  git push -u origin master -f

上述問題僅會在第一次提交可能出現。

重點:對於多人協調開發時,提交也可能會出現衝突,由於別人可能已經比你更快的提交了,此時你只能把遠程的克隆下來,合併,解決衝突後再提交

 

 

git工做的通常流程:http://blog.csdn.net/javyzheng/article/details/50311175

參考資料:Git開發 、 廖雪峯 、 武老師

相關文章
相關標籤/搜索