———本文是學習廖雪峯老師的Git教程以後所寫的筆記,方便記憶,提升。git
Git是目前世界上最早進的分佈式版本控制系統。github
版本控制就是能夠在一個項目,管理、控制本身寫的不一樣版本的代碼。可用於團隊協做、在不修改原代碼的狀況下經過分支開發新功能以及臨時修改程序bug等。同時,還能夠記錄下代碼修改操做,便於查看和管理代碼。簡單理解,就是一個管理代碼的系統。shell
此外,還要弄清分佈式與集中式的區別:安全
區別 | 集中式 | 分佈式 |
---|---|---|
互聯網 | 必須 | 非必須,能夠本地操做 |
中央服務器 | 有 | 無,僅用於交換代碼 |
便捷性 | 低,依賴服務器 | 高 |
安全性 | 低 | 高 |
主要軟件 | SVN,CVN | Github,BitKeeper |
sudo apt-get install git
homebrew
安裝或經過Xcode
安裝安裝完後,還要對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 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下查看結果:
圖片中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_rsa
和id_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做用: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
複製代碼
多人工做模式:
git push origin (分支名)
推送本身的修改git pull
試圖合併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 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的機器
sudo apt-get install git
\sudo adduser git
/home/git/.ssh/authorized_keys
文件裏,一行一個sudo git init --bare (版本庫名).git
/etc/passwd
文件,改成git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
git clone
命令克隆遠程倉庫