Git 使用指南(標準版)

0. 說明

 
  至關於過了一遍
 

 

1. 介紹

 

1.1 Git 是什麼 

  Git 是分佈式版本控制系統
  工做原理/流程以下圖所示

 

  1. Workspace:工做區
  2. Index / Stage:暫存區
  3. Repository:倉庫區(或本地倉庫)
  4. Remote:遠程倉庫

 

1.2 SVN 與 Git 的最主要的區別

  SVN 是集中式版本控制系統,版本庫是集中放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此首先要從中央服務器哪裏獲得最新的版本,而後幹活,幹完後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做,若是在局域網還能夠,帶寬夠大,速度夠快,若是在互聯網下,若是網速慢的話,就納悶了。
  Git 是分佈式版本控制系統,那麼它就沒有中央服務器的,每一個人的電腦就是一個完整的版本庫,這樣,工做的時候就不須要聯網了,由於版本都是在本身的電腦上。既然每一個人的電腦都有一個完整的版本庫,那多我的如何協做呢?好比說本身在電腦上改了文件A,其餘人也在電腦上改了文件A,這時,大家兩之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。
 

 

2. 安裝 Git

2.1 在 Windows 上安裝 Git

   Git 下載
 
  在開始菜單裏找到  Git  ->   Git Bash ,名稱和郵箱是 Github 上的
# 指定 Github 的用戶名
git config -- global user.name "username"

# 指定 Github 的郵箱
git config -- global user.email "xxxxxxxx@gmail.com"

 

  由於Git是分佈式版本控制系統,因此須要填寫用戶名和郵箱做爲一個標識。
  注意:git config --global 參數,有了這個參數,表示你這臺機器上全部的 Git 倉庫都會使用這個配置,固然你也能夠對某個倉庫指定的不一樣的用戶名和郵箱。

 

2.2 在 Centos 下安裝 Git

 

sudo yum install git

 

3. 操做

3.1 建立版本庫

  版本庫又名倉庫,英文名 repository ,你能夠簡單的理解一個目錄,這個目錄裏面的全部文件均可以被 Git 管理起來,每一個文件的修改,刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻還能夠將文件」還原」。
 
  新建一個文件夾  test  ,在命令行下進入該目錄對其進行初始化操做
# 將當前目錄變成 git 能夠管理的倉庫
git init

 

3.2 添加文件到版本庫

  在倉庫中新建一個文件  readme.md ,添加相應的內容,而後進行以下操做
# 1. 將 readme.md 添加到暫存區
git add readme.md
 

# 2. 將暫存區的內容提交到本地倉庫, xxx 是提交的註釋
git commit -m "xxx"
 

# 3. 查看是否有文件未提交
git status
 

# 4. 修改 readme.md 文件內容,經過'git status'能夠獲得文件已經修改過
# 經過如下命令查看修改內容
 

git diff readme.md
 

# 5. 修改事後重複 12 步驟
 

# 6. 第一次提交到遠程
git push -u origin master

 

3.3 版本回退

  爲 readme.md 添加一行內容而後添加到本地倉庫html

  查看歷史提交記錄git

# 1. 查看歷史
git log

# 2. 單行顯示提交歷史註釋
git log –pretty=oneline

 

  版本回退github

# 1. 回退到上一個版本
git reset --hard HEAD^
 

# 2. 回退到上2個版本
git reset --hard HEAD^^
 

# 3. 回退到上100個版本
git reset --hard HEAD~100

 

  回退到以前的版本以後又想恢復到最新的版本服務器

# 1. 獲取版本號
git reflog

# 2. 恢復指定版本的數據,6fcfc89 爲要恢復版本的版本號
git reset --hard 6fcfc89

 

3.4 工做區與暫存區的區別

   區別app

  在電腦上看到的目錄,好比目錄下test裏的文件(.git隱藏目錄版本庫除外)。或者之後須要再新建的目錄文件等等都屬於工做區範疇。
  版本庫(Repository):工做區有一個隱藏目錄.git,這個不屬於工做區,這是版本庫。其中版本庫裏面存了不少東西,其中最重要的就是 stage(暫存區),還有Git爲咱們自動建立了第一個分支 master ,以及指向 master 的一個指針HEAD。
 
  使用Git提交文件到版本庫有兩步:
  1. 是使用  git add  把文件添加進去,實際上就是把文件添加到暫存區。
  2. 使用  git commit  提交更改,實際上就是把暫存區的全部內容提交到當前分支上。
  在屢次添加文件以後能夠經過  git commit  一次性提交
 

3.5 撤銷修改和刪除文件

  撤銷修改ssh

  對文件進行修改以後不滿意想回到原來的版本(但記不清該刪什麼,又想不經過版本回退)
# 1. 丟棄工做區的修改,若是加入到暫存區就不能撤銷修改了
git checkout -- readme.md
 
  (PS: 命令  git checkout -- readme.md  中的   --  很重要,若是沒有   --  的話,那麼命令變成建立分支了)

 

  刪除文件
# 1. 在工做區刪除文件
# 以後有兩個選擇(1. commit 2. 從版本庫中恢復被刪掉的文件)
rm readme.md
 

# 2. 未 commit 以前 從版本庫中恢復被刪掉的文件
git checkout -- readme.md

 

3.6 遠程倉庫

3.6.1 配置 GitHub

  登錄註冊 GitHub 分佈式

  本地 Git倉庫 和 GitHub倉庫 之間的傳輸是經過 SSH 加密的,因此須要以下操做學習

# 1. 建立 SSH Key
# 在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有
# id_rsa和id_rsa.pub這兩個文件,若是有的話,直接跳過此以下命令,
# 若是沒有的話,打開命令行,輸入以下命令
ssh-keygen -t rsa -C "Github的註冊郵箱地址"
 

# 2.
# 登陸 GitHub,打開 "Settings" 中的 SSH Keys 頁面
# 而後點擊 "Add SSH Key" ,填上任意 title
# 在 Key 文本框裏粘貼 id_rsa.pub 文件的內容。
  (PS: id_rsa 是私鑰,不能泄露出去,id_rsa.pub 是公鑰,能夠放心地告訴任何人)
 

3.6.2 添加遠程倉庫

  如今的情景是:咱們已經在本地建立了一個 Git倉庫 後,又想在 GitHub 建立一個 Git倉庫,而且但願這兩個倉庫進行遠程同步,這樣 GitHub 的倉庫能夠做爲備份,又能夠其餘人經過該倉庫來協做fetch

 

# 1. New repository
 

# 2. 輸入 Repository name (與本地倉庫同名)
testgit
# 3. Create repository
 

# 4. 將一個已有的本地倉庫與遠程倉庫關聯
git remote add origin https://github.com/username/testgit.git
 

# 5. 將本地倉庫 master 分支的內容推送到遠程倉庫中
git pish -u origin master
 

# 6. 第二次及以後上傳項目
git push origin master
 

# 說明 因爲遠程庫是空的,咱們第一次推送 master 分支時,加上了 –u 參數
# Git 不但會把本地的 master 分支內容推送的遠程新的 master 分支
# 還會把本地的 master 分支和遠程的 master 分支關聯起來

 

3.6.3 從遠程倉庫克隆項目到本地

 

git clone https://github.com/username/testgit

 

3.7 建立與合併分支

3.7.1 分支說明

  每次提交,Git 都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在 Git 裏,這個分支叫主分支,即 master 分支。HEAD 嚴格來講不是指向提交,而是指向 master ,master 纔是指向提交的,因此,HEAD 指向的就是當前分支。

 

3.7.2 Demo

  建立 dev 分支,並切換到該分支
# 1. 建立 dev 分支並切換分支
git checkout -b dev
 
# 2. 查看當前的分支,列出全部的分支,當前分支前面會添加一個星號
git branch

 

 

 

  git checkout 命令加上 –b參數表示建立並切換,至關於以下2條命令

 

# 建立分支
git branch dev
 
# 切換分支
git checkout dev

 

  新建一個文件  test_branch_dev.txt  ,在裏面添加一些內容,而後作如下操做,驗證切換分支以後前一個分支的操做可否被查看

 

 

3.7.3 合併分支

# 在 master 分支上合併 dev 分支的內容
git merge dev

# 繼續查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt

 

 

注意到上面的 Fast-forward 信息,Git 告訴咱們,此次合併是「快進模式」,也就是直接把 master 指向 dev 的當前提交,因此合併速度很是快。

 

3.7.4 刪除分支
# 刪除 dev 分支
git branch -d dev

# 查看分支命令
git branch

 

 

 

3.7.5 分支操做命令合集

# 查看分支
git branch

# 建立分支
git branch name

# 切換分支
git checkout name

# 建立+切換分支
git checkout –b name

# 合併某分支到當前分支
git merge name

# 刪除分支
git branch –d name

 

3.7.6 分支衝突

# 新建並切換分支
git checkout –b fenzhi1

# 查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt

# 添加內容後繼續查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt

# 添加到暫存區
git add test_branch_dev.txt

# 提交到本地倉庫
git commit -m "add fenzhi1"

 

 

# 切換到 master 分支
git checkout master

# 查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt

# 添加內容後繼續查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt

# 添加到暫存區
git add test_branch_dev.txt

# 提交到本地倉庫
git commit -m "add master"

 

 

 

# 在 master 分支上合併 branch1
git merge fenzhi1

# 查看狀態
git status

# 查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt

 

 

 

 

 

  Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,其中<<<HEAD是指主分支修改的內容,>>>>>fenzhi1 是指fenzhi1上修改的內容

 

# 解決分支衝突,將文件test_branch_dev.txt的內容修改爲主幹代碼的
# 查看 test_branch_dev.txt 的內容
cat test_branch_dev.txt
 

 

 

# 查看分支合併的狀況
git log

 

 

 

3.7.7 分支管理策略

  一般合併分支時,git 通常使用 `Fast forward` 模式,在這種模式下,刪除分支後,會丟掉分支信息,如今咱們來使用帶參數 `–no-ff` 來禁用 `Fast forward` 模式
  演示以下

 

 

  分支策略:首先 master主分支 應該是很是穩定的,也就是用來發布新版本,通常狀況下不容許在上面幹活,幹活通常狀況下在新建的 dev分支 上幹活,幹完後,好比上要發佈,或者說 dev分支 代碼穩定後能夠合併到 主分支master 上來。

 

3.8 Bug 分支

  在開發中,會常常碰到bug問題,那麼有了bug就須要修復,在Git中,分支是很強大的,每一個bug均可以經過一個臨時分支來修復,修復完成後,合併分支,而後將臨時的分支刪除掉。
  好比我在開發中接到一個404 bug時候,咱們能夠建立一個404分支來修復它,可是,當前的dev分支上的工做尚未提交。好比以下:

 

 

  並非我不想提交,而是工做進行到一半時候,咱們還沒法提交,好比我這個分支bug要2天完成,可是我issue-404 bug須要5個小時內完成。怎麼辦呢?還好,Git還提供了一個stash功能,能夠把當前工做現場 」隱藏起來」,等之後恢復現場後繼續工做。以下:

 

 

  因此如今我能夠經過建立issue-404分支來修復bug了。
  首先咱們要肯定在那個分支上修復bug,好比我如今是在主分支master上來修復的,如今我要在master分支上建立一個臨時分支,演示以下:

 

 

  如今,咱們回到dev分支上幹活了

 

 

  工做區是乾淨的,那麼咱們工做現場去哪裏呢?咱們可使用命令 git stash list來查看下。以下:

 

 

  工做現場還在,Git把stash內容存在某個地方了,可是須要恢復一下,可使用以下2個方法:
  1.git stash apply恢復,恢復後,stash內容並不刪除,你須要使用命令git stash drop來刪除。
  2.另外一種方式是使用git stash pop,恢復的同時把stash內容也刪除了。
  演示以下

 

 

3.9 多人協做

  當你從遠程庫克隆時候,實際上Git自動把本地的master分支和遠程的master分支對應起來了,而且遠程庫的默認名稱是origin。
  要查看遠程庫的信息 使用 git remote
  要查看遠程庫的詳細信息 使用 git remote –v
  以下演示:

 

 

3.9.1 推送分支

  推送分支就是把該分支上全部本地提交到遠程庫中,推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上
# 推送到 master分支
git push origin master

# 推送到 dev分支
git push origin dev

 

  那麼通常狀況下,那些分支要推送呢?
  master分支 是主分支,所以要時刻與遠程同步。
  一些 修復bug分支 不須要推送到遠程去,能夠先合併到主分支上,而後把主分支master推送到遠程去。

 

3.9.2 抓取分支

  多人協做時,你們都會往 master分支 上推送各自的修改。如今咱們能夠模擬另一個同事,能夠在另外一臺電腦上(注意要把SSH key添加到github上)或者同一臺電腦上另一個目錄克隆,新建一個目錄名字叫testgit2
  可是我首先要把dev分支也要推送到遠程去,以下

 

 

  接着進入testgit2目錄,進行克隆遠程的庫到本地來,以下

 

 

  如今目錄下生成有以下所示

 

 

  如今咱們的小夥伴要在 dev分支 上作開發,就必須把遠程的origin的 dev分支 到本地來,因而可使用命令建立本地dev分支: git checkout –b dev origin/dev
  如今小夥伴們就能夠在 dev分支 上作開發了,開發完成後把 dev分支 推送到遠程庫時。
  以下

 

 

  小夥伴們已經向origin/dev分支上推送了提交,而我在個人目錄文件下也對一樣的文件同個地方做了修改,也試圖推送到遠程庫時,以下

 

 

  由上面可知:推送失敗,由於個人小夥伴最新提交的和我試圖推送的有衝突,解決的辦法也很簡單,上面已經提示咱們,先用git pull把最新的提交從origin/dev抓下來,而後在本地合併,解決衝突,再推送。

 

 

  git pull 也失敗了,緣由是沒有指定 本地dev分支 與 遠程origin/dev分支 的連接,根據提示,設置dev和origin/dev的連接:以下

 

 

  這回git pull成功,可是合併有衝突,須要手動解決,解決的方法和分支管理中的 解決衝突徹底同樣。解決後,提交,再push:
  咱們能夠先來看看readme.txt內容了

 

 

  如今手動已經解決完了,我接在須要再提交,再push到遠程庫裏面去。以下所示

 

 

  所以:多人協做工做模式通常是這樣的:
  首先,能夠試圖用 git push origin branch-name 推送本身的修改.
  若是推送失敗,則由於遠程分支比你的本地更新早,須要先用  git pull 試圖合併。
  若是合併有衝突,則須要解決衝突,並在本地提交。再用  git push origin branch-name  推送。

4. 阮老師整理的部分命令

 

4.1 新建代碼庫

# 在當前目錄新建一個Git代碼庫
$ git init

# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]

# 下載一個項目和它的整個代碼歷史
$ git clone [url]

 

4.2 配置

  Git 的設置文件爲   .gitconfig   ,它能夠在用戶主目錄下(全局配置),也能夠在項目目錄下(項目配置)
# 顯示當前的Git配置
$ git config --list

# 編輯Git配置文件
$ git config -e [--global]

# 設置提交代碼時的用戶信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

 

4.3 增長/刪除文件

# 添加指定文件到暫存區
$ git add [file1] [file2] ...

# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]

# 添加當前目錄的全部文件到暫存區
$ git add .

# 添加每一個變化前,都會要求確認
# 對於同一個文件的多處變化,能夠實現分次提交
$ git add -p

# 刪除工做區文件,而且將此次刪除放入暫存區
$ git rm [file1] [file2] ...

# 中止追蹤指定文件,但該文件會保留在工做區
$ git rm --cached [file]

# 更名文件,而且將這個更名放入暫存區
$ git mv [file-original] [file-renamed]

 

4.4 代碼提交

# 提交暫存區到倉庫區
$ git commit -m [message]

# 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]

# 提交工做區自上次commit以後的變化,直接到倉庫區
$ git commit -a

# 提交時顯示全部diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]

# 重作上一次commit,幷包括指定文件的新變化
$ git commit --amend [file1] [file2] ...

 

4.5 分支

 

# 列出全部本地分支
$ git branch

# 列出全部遠程分支
$ git branch -r

# 列出全部本地分支和遠程分支
$ git branch -a

# 新建一個分支,但依然停留在當前分支
$ git branch [branch-name]

# 新建一個分支,並切換到該分支
$ git checkout -b [branch]

# 新建一個分支,指向指定commit
$ git branch [branch] [commit]

# 新建一個分支,與指定的遠程分支創建追蹤關係
$ git branch --track [branch] [remote-branch]

# 切換到指定分支,並更新工做區
$ git checkout [branch-name]

# 切換到上一個分支
$ git checkout -

# 創建追蹤關係,在現有分支與指定的遠程分支之間
$ git branch --set-upstream [branch] [remote-branch]

# 合併指定分支到當前分支
$ git merge [branch]

# 選擇一個commit,合併進當前分支
$ git cherry-pick [commit]

# 刪除分支
$ git branch -d [branch-name]

# 刪除遠程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

 

4.6 標籤

 

# 列出全部tag
$ git tag
 
# 新建一個tag在當前commit
$ git tag [tag]
 
# 新建一個tag在指定commit
$ git tag [tag] [commit]
 
# 刪除本地tag
$ git tag -d [tag]
 
# 刪除遠程tag
$ git push origin :refs/tags/[tagName]
 
# 查看tag信息
$ git show [tag]
 
# 提交指定tag
$ git push [remote] [tag]
 
# 提交全部tag
$ git push [remote] --tags
 
# 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]

 

4.7 查看信息

# 顯示有變動的文件
$ git status
 
# 顯示當前分支的版本歷史
$ git log

# 顯示commit歷史,以及每次commit發生變動的文件
$ git log --stat

# 搜索提交歷史,根據關鍵詞
$ git log -S [keyword]

# 顯示某個commit以後的全部變更,每一個commit佔據一行
$ git log [tag] HEAD --pretty=format:%s

# 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件
$ git log [tag] HEAD --grep feature

# 顯示某個文件的版本歷史,包括文件更名
$ git log --follow [file]
$ git whatchanged [file]

# 顯示指定文件相關的每一次diff
$ git log -p [file]

# 顯示過去5次提交
$ git log -5 --pretty --oneline

# 顯示全部提交過的用戶,按提交次數排序
$ git shortlog -sn

# 顯示指定文件是什麼人在什麼時間修改過
$ git blame [file]

# 顯示暫存區和工做區的差別
$ git diff

# 顯示暫存區和上一個commit的差別
$ git diff --cached [file]

# 顯示工做區與當前分支最新commit之間的差別
$ git diff HEAD

# 顯示兩次提交之間的差別
$ git diff [first-branch]...[second-branch]

# 顯示今天你寫了多少行代碼
$ git diff --shortstat "@{0 day ago}"

# 顯示某次提交的元數據和內容變化
$ git show [commit]

# 顯示某次提交發生變化的文件
$ git show --name-only [commit]

# 顯示某次提交時,某個文件的內容
$ git show [commit]:[filename]

# 顯示當前分支的最近幾回提交
$ git reflog

 

4.8 遠程同步

 

# 下載遠程倉庫的全部變更
$ git fetch [remote]

# 顯示全部遠程倉庫
$ git remote -v

# 顯示某個遠程倉庫的信息
$ git remote show [remote]

# 增長一個新的遠程倉庫,並命名
$ git remote add [shortname] [url]

# 取回遠程倉庫的變化,並與本地分支合併
$ git pull [remote] [branch]

# 上傳本地指定分支到遠程倉庫
$ git push [remote] [branch]

# 強行推送當前分支到遠程倉庫,即便有衝突
$ git push [remote] --force

# 推送全部分支到遠程倉庫
$ git push [remote] --all

 

4.9 撤銷

# 恢復暫存區的指定文件到工做區
$ git checkout [file]

# 恢復某個commit的指定文件到暫存區和工做區
$ git checkout [commit] [file]

# 恢復暫存區的全部文件到工做區
$ git checkout .

# 重置暫存區的指定文件,與上一次commit保持一致,但工做區不變
$ git reset [file]

# 重置暫存區與工做區,與上一次commit保持一致
$ git reset --hard

# 重置當前分支的指針爲指定commit,同時重置暫存區,但工做區不變
$ git reset [commit]

# 重置當前分支的HEAD爲指定commit,同時重置暫存區和工做區,與指定commit一致
$ git reset --hard [commit]

# 重置當前HEAD爲指定commit,但保持暫存區和工做區不變
$ git reset --keep [commit]

# 新建一個commit,用來撤銷指定commit
# 後者的全部變化都將被前者抵消,而且應用到當前分支
$ git revert [commit]

# 暫時將未提交的變化移除,稍後再移入
$ git stash
$ git stash pop
相關文章
相關標籤/搜索