Git學習總結

Git介紹

———本文是學習廖雪峯老師的Git教程以後所寫的筆記,方便記憶,提升。git

導圖

Git是目前世界上最早進的分佈式版本控制系統。github

版本控制就是能夠在一個項目,管理、控制本身寫的不一樣版本的代碼。可用於團隊協做、在不修改原代碼的狀況下經過分支開發新功能以及臨時修改程序bug等。同時,還能夠記錄下代碼修改操做,便於查看和管理代碼。簡單理解,就是一個管理代碼的系統。shell

此外,還要弄清分佈式與集中式的區別:安全

區別 集中式 分佈式
互聯網 必須 非必須,能夠本地操做
中央服務器 無,僅用於交換代碼
便捷性 低,依賴服務器
安全性
主要軟件 SVN,CVN Github,BitKeeper

Git安裝

  • Linux上安裝方式: sudo apt-get install git
  • Mac上安裝方式:經過homebrew安裝或經過Xcode安裝
  • Windows上安裝Git:直接到官網下載安裝包安裝

安裝完後,還要對git進行設置bash

$git config --global user.name "Your name"
$git config --global user.email "example@email.com"
複製代碼

配置我的信息,--global全局參數表示機器上全部git倉庫都使用這個配置服務器

建立版本庫

版本庫(reposity)就是一個代碼目錄,目錄裏的全部文件均可經過Git進行管理。app

建立代碼:ssh

$ mkdir newCode
$ cd newCode
$ git init 
複製代碼

運行結果:分佈式

Initialized empty Git repository in /Users/taokexia/newCode/.git/
複製代碼

git init:把目錄變成git管理目錄。在目錄下會生成.git文件(Linux下,經過ls -ah可查看該文件),沒事不要手動修改目錄,避免破壞版本庫學習

若是使用的是Window系統,爲避免因字符集的問題出錯,要確保目錄名不含中文

把文件添加到版本庫

不要使用Windows自帶的記事本編輯任何文本文件,會形成錯誤。

使用git add (文件名)往當前代碼庫添加文件。可一次添加多個文件。
使用gti commit -m (註釋內容)把文件提交到倉庫,-m表示添加本次提交的說明,最好有意義,明白本次提交代碼的主要做用,便於之後查看

Git版本控制

查看版本庫

使用git status查看當前代碼庫的狀態,瞭解到當前代碼是否上傳。(經常使用) 常見有三種狀態:

  • 尚未提交修改
# On branch master
# Changes not staged for commit
複製代碼
  • 以及提交修改
# On branch master
# Changes to be committed:
複製代碼
  • 提交成功
# On branch master
nothing to commit (working directory clean)
複製代碼

使用git diff (fileName) 查看文件修改的地方。
使用git log查看提交的歷史記錄,使用參數--pretty=oneline簡潔顯示

window下查看結果:

git log

圖片中comit行顯示的16進制數是commit id(版本號)可用於控制版本。

跳轉版本庫

git reset --hard HEAD:查看當前版本號,HEAD指針指向當前版本號

結果顯示爲:

HEAD is now at 143cc02 three hello
複製代碼

使用git reset往以前的版本號跳:

如要跳轉到上一版本的代碼庫,使用代碼git reset --hard HEAD^,使用HEAD^^表示跳轉到上兩個版本,HEAD~100表示跳轉到上100個版本

注意:跳轉後,git log顯示也會發送改變,只顯示當前版本號以前的歷史信息。

使用git reset跳日後面的版本號:

git reset --hard 143cc02,143cc02爲版本號前幾位數字。 查看版本號方式:
git reflog記錄你的每一次命令,並提供了跳轉的號碼

版本轉換

暫存區和工做區

工做區:代碼庫所在的文件夾就是工做區。工做區有隱藏目錄.git,爲版本庫。
版本庫裏包括暫存區(stage),分支和指針HEAD
git工做時,當接收到add命令時,把文件添加到暫存區,再經過commit把暫存區文件添加到分支。即須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。

暫存區

注意:
每修改一次文件,git add把文件加入到暫存區,再修改文件,暫存區內的內容沒有發生變化,這時候若是使用git commit則最後一次修改的內容沒有保存到分支中。避免的方法是:沒修改一次文件,就使用add添加一次文件。

修改操做

撤銷修改:
使用git chekcout -- (文件名)來撤銷對文件的修改,若是文件修改後還沒有被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態。若是已經添加到暫存區,則撤銷修改就回到添加到暫存區後的狀態
若是想把暫存區的修改撤銷掉,使用代碼git reset HEAD (文件名),文件從新回到工做區。

刪除操做:
使用git rm (文件名)刪除代碼庫裏的文件。
若是想恢復刪除的文件,則使用git checkout -- (文件名),用版本庫裏的版本替換工做區的版本。

遠程倉庫

Git能夠經過服務器管理代碼,每一個人均可以從這個服務器倉庫克隆一份代碼到本身的電腦上,而且各自把各自的提交推送到服務器倉庫裏,也能夠從服務器倉庫中拉取別人的提交,完成協做開發。

實現遠程管理能夠經過Github網站,Github是提供Git倉庫託管服務的免費網站,經過SSH加密進行代碼傳輸。

Github設置SSH
建立SSH key:$ ssh-keygen -t rsa -C "youremail@example.com"
建立完成後,能夠在目錄裏看到.ssh目錄,裏面有id_rsaid_rsa.pub兩個文件,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。

設置SSH:登錄GitHub,打開「Account settings」,「SSH Keys」頁面,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容,點「Add Key」,你看到已經添加的Key

ssh

SSH做用:GitHub經過SSH識別出你推送的提交確實是你推送的

遠程倉庫操做

添加遠程庫:
Github倉庫與本地倉庫同步操做: 首先,登錄GitHub,建立一個新的倉庫 在Repository name填入倉庫名,其餘保持默認設置,點擊「Create repository」按鈕,就成功地建立了一個新的Git倉庫,倉庫目前沒有任何代碼。\

在本地代碼目錄下,使用$ git remote add origin git@github.com:(用戶名)/(倉庫名).git,這樣,本地就關聯了遠程庫。遠程庫的名字就是origin,這是Git默認的叫法,也能夠改爲別的。

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

因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數,Git不但會推送代碼,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時只須要使用git push origin master命令。

從遠程庫克隆:
使用git clone git@github.com:(用戶名)/(倉庫名).git克隆一個本地庫。

Git支持多種協議,包括https,但經過ssh支持的原生git協議速度最快。

分支管理

建立合併分支

建立分支:
當咱們建立新的分支,會建立一個分支指針,例如Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。Git建立分支主要進行操做:建立一個dev指針,改變HEAD指針指向。工做區文件沒有任何變化。
此後,對工做區的修改和提交主要針對的是dev分支,而master分支沒有變化

建立代碼:

$ git checkout -b dev
複製代碼

checkout命令加上參數-b表示建立並切換,等價於:

$ git branch dev
$ git checkout dev
複製代碼

查看代碼:

git branch
複製代碼

會列出全部分支,在當前分支前面會標一個*

$ git branch
* dev
  master
複製代碼

切換分支代碼:

$ git checkout master
複製代碼

切換到master分支

合併分支:
Git合併直接把master指向dev的當前提交,就完成了合併,經過修改指針實現合併,工做區沒有任何變化。合併完成以後,最後的步驟是刪除dev指針。

合併代碼:

$ git merge dev
複製代碼

合併指定分支到當前分支。若是合併無發生衝突,常見的模式是:Fast-forward,表示此次合併是「快進模式」,也就是直接把master指向dev的當前提交,因此合併速度很是快。

若是合併的兩分支都有了各自的提交,則可能會發生衝突,這時合併模式就不是Fast-forward,這時必須手動解決衝突
經過git status獲取衝突的文件, 在衝突的文件內容裏面,git會對衝突的部分進行標記,使用<<<<<<<=======>>>>>>>標記出不一樣分支的內容,修改完衝突後保存文件。使用add,commit命令傳遞文件,合併完成。

使用$ git log --graph --pretty=oneline --abbrev-commit能夠查看分支合併圖

刪除分支代碼:

git checkout -d dev
複製代碼

由於建立、合併和刪除分支很是快,因此使用分支完成某個任務,合併後再刪掉分支,這樣更安全。

分支管理策略

Fast-forward模式下,刪除分支後,會丟失分支信息。強制禁用Fast-forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。

禁用Fast-forward代碼:

git merge --no-ff -m "description" (合併分支名)
複製代碼

--no-ff表示禁用Fast-forward模式,-m表示添加描述,不使用Fast-forward模式,merge後分支dev指針位置沒有變化,HEAD指針指向master

分支管理原則:

  • 保持master分支穩定,僅用於發佈新版本
  • 主要在dev分支上編寫代碼,要發佈新版本時才合併到master
  • 每一個人均可以有本身的dev分支,時不時地往dev上合併分支

bug分支: 遇到程序出bug時,常見的作法是創建新的臨時分支,進行修復,修復後再合併分支,刪除臨時分支。
此外,若是當前項目只進行了一半,可使用git stash功能,把當前工做現場儲藏起來,等之後恢復現場後繼續工做。

git stash list
複製代碼

查看儲存的工做環境,恢復工做環境代碼

git stash apply #恢復,不過恢復後須要刪除stash內容
git stash drop #刪除
git stash pop #恢復的同時,刪除stash
git stash apply stash@{0} #若是有多個stash,能夠指定恢復的stash
複製代碼

Feature分支: 經過建立Feature分支,能夠在不影響主程序的狀況下,給程序添加新的功能,完成後,再合併,刪除分支。

若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <分支名>強行刪除。

多人協做: 查看遠程庫信息:git remote
查看遠程庫更詳細信息:git remote -v
推送分支:git push origin master,推送master分支到遠程庫中

推送原則:

  • master主分支,要時刻與遠程同步
  • dev是開發分支,也須要與遠程同步
  • bug分支只用於在本地修復bug,就不必推到遠程
  • feature分支是否推到遠程,取決因而否須要合做開發

抓取分支:
clone遠程庫使,默認只克隆master分支,可在本地往遠程庫推送dev分支,若是發生推送衝突,可以使用git pull把最新的提交從origin/dev抓下來,在本地合併,解決衝突,再推送。

若是git pull也失敗了,提示no tracking information,則緣由是沒有指定本地dev分支與遠程origin/dev分支的連接,設置代碼:

$ git branch --set-upstream dev origin/dev
複製代碼

多人工做模式:

  1. git push origin (分支名)推送本身的修改
  2. 推送失敗,則由於遠程分支比你的本地更新,須要先用git pull試圖合併
  3. 若是合併有衝突,則解決衝突,並在本地提交
  4. 沒有衝突或者解決掉衝突後,再用git push origin (分支名)推送就能成功

標籤管理

因爲版本的commit id難於記憶,通常使用標籤標記版本號,便於記憶,操做

建立標籤:
切換到須要打標籤的分支上,使用git tag (name)就能夠打一個新標籤。
使用git tag (name) (commit id)給對應的commit id的版本打上標籤
git tag查看標籤,建立帶有說明的標籤:

  • -a指定標籤名,
  • -m指定說明文字,
  • -s指用私鑰簽名一個標籤,簽名採用PGP簽名 git show (標籤姓名)查看標籤信息

操做標籤:
刪除標籤:git tag -d (標籤名)
推送一個本地標籤:git push origin (標籤名)
能夠推送所有未推送過的本地標籤:git push origin --tags
刪除一個遠程標籤:git push origin :refs/tags/<標籤名>

自定義Git

git config --global color.ui true讓Git顯示顏色,會讓命令輸出看起來更醒目

忽略特殊文件: Git工做區的根目錄下建立一個特殊的.gitignore文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。

使用git add -f (文件名)強制添加文件
使用git check-ignore檢測忽略文件

忽略文件的原則:

  • 忽略系統生成文件
  • 忽略編譯生成的中間文件、可執行文件等
  • 忽略你本身的帶有敏感信息的配置文件

.gitignore文件自己要放到版本庫裏,而且能夠對.gitignore作版本管理!

配置別名:

$ git config --global alias.st status
複製代碼

git st等價於git status

配置文件存放位置`每一個倉庫的Git配置文件都放在.git/config文件中``,別名就在[alias]後面

搭建Git服務器:
答建Git服務器首先須要準備一臺運行Linux的機器

  1. 安裝gitsudo apt-get install git\
  2. 建立一個git用戶,用來運行git服務:sudo adduser git
  3. 建立證書登陸:全部公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個
  4. 初始化Git倉庫,sudo git init --bare (版本庫名).git
  5. 禁用shell登陸,編輯/etc/passwd文件,改成git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
  6. 克隆遠程倉庫,經過git clone命令克隆遠程倉庫
相關文章
相關標籤/搜索