Git版本管理原理簡析及使用方法速成

最近在系統地學習使用Git,並瞭解Git進行版本控制的原理,以更好地學以至用。html

如下是學習過程當中整理的知識點總結。linux

1 安裝及配置(windows)

1. 官網下載安裝Gitgit

  1. 開始菜單找到git → git bash(或者在某個文件夾下面 右鍵 -> git bash here)github

  2. 配置/修改用戶信息 $ git config --global user.name "Your Name"  // --global參數表示全局配置,也能夠針對不一樣倉庫配置不一樣用戶名和email $ git config --global user.email "email@example.com" 查看用戶信息: $ git config --global user.name $ git config --global user.emailvim

2 建立一個Git倉庫

$ mkdir learngit  // 新建一個文件 $ cd learngit  // 進入文件 $ git init  // 把文件目錄變成git倉庫windows

在learngit下新建文件readme.txt $ git add readme.txt  // 將文件添加到倉庫 $ git commit -m "add readme file"  // 提交文件bash

3 版本管理

3.1 提交文件

修改readme.txt文件 $ git status  // 查看當前狀態 $ git diff  // 查看修改的內容 $ git add filename $ git commit -m "some describe for this commit"app

3.2 版本回退

$ git log  // 查看日誌 $ git log --pretty=oneline  // 一條記錄顯示在一行 $ git reset --hard HEAD^  // 回到上一個提交,HEAD^^回到上上個提交, $ git reset --hard HEAD^^  // 回到上上個提交 $ git reset --hard 8adc  // 回到commit id開頭爲8adc的版本 $ git reflog  // 查看操做記錄ssh

4 工做原理

一個git目錄能夠分爲兩個部分:編輯器

  • 工做區:能看到的文件
  • 版本庫:.git文件裏,不可見

版本庫包含暫存區stage、master分支(包含一個HEAD指針)。 提交文件必須先提交到stage再提交到分支上。 $ git add filename  // 將工做區的文件提交到stage $ git commit -m "..."  // 將stage區的文件提交到分支上 $ git diff HEAD -- filename  // 查看工做區和分支上代碼的區別

圖片.png

5 撤銷修改

  • 工做區:git checkout -- filename  // 清理工做區(距離上次add或commit後所作的修改)

  • stage: 1. git reset HEAD filename  // stage → 工做區(把上次add但未提交的stage中的內容打回工做區) 2. 清理工做區

  • 分支: git reset --soft HEAD^  // HEAD^表示上一個版本,也能夠寫做HEAD~1;soft表示不刪除工做區改動代碼,撤銷commit,不撤銷git add .;harg表示刪除工做區改動代碼,撤銷commit,撤銷git add . git commit --amend  // 只修改註釋,進入vim編輯器,修改完註釋後保存便可

6 刪除文件

新建一個文件test → add → commit 此時git分支保存了新文件test,刪除文件的幾種方式以下:

  • $ rm test.txt → add → commit
  • 或者在文件夾手動刪除test.txt → add / (git rm filename) → commit
  • $ git rm test.txt → commit

恢復文件的方法同【撤銷修改】

7 遠程倉庫

7.1 添加遠程庫

添加遠程倉庫須要兩步操做:本地生成SSH Key添加到遠程倉庫、本地倉庫與遠程倉庫關聯。

1.建立SSH Key $ ssh-keygen -t rsa -C "your@email.com"  // 生成一個公鑰id_rsa.pub和一個私鑰id_rsa $ cd ~  // 進入用戶主目錄 $ cd .ssh $ ls  // 列出全部文件 $ cat id_rsa.pub  // 查看文件內容 複製內容到 git/github -> Account Setting -> SSH -> 粘貼

2.關聯遠程倉庫 git/github建立倉庫 $ git remote add origin github.com/example/lea…  // 本地倉庫關聯遠程倉庫 $ git push -u origin master  // 推送本地倉庫到遠程倉庫master分支 -u表示第一次推送 $ git push origin master  // 後續推送到遠程分支

以上失敗時: $ git remote rename oroigin old-origin $ git remote add origin git @.../project-name.git $ git push -u origin --all

7.2 克隆遠程倉庫

git/github新建倉庫 → Clone or download →  複製連接(HTTPS or SSH) $ git clone git@github.com:example/gitskills.git $ cd gitskills

克隆到本地後的倉庫只有master分支,須要新建dev分支並和遠程分支關聯 $ git checkout -b dev origin/dev $ git branch --set-upstream-to=origin/dev dev

Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議 使用https速度慢,每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh協議而只能用https

若是在git上新建了一個分支,只需在本地運行: $ git fetch $ git checkout branchName

8 分支管理

8.1 建立與合併分支

查看分支:git branch 建立分支:git branch 切換分支:git checkout 建立+切換分支:git checkout -b 合併某分支到當前分支:git merge 刪除分支:git branch -d 強行刪除:git branch -D

分支開發策略:master用來發布新版本 dev用來開發 在dev上新建分支開發,完成後合併到dev分支,再新開分支

8.2 解決衝突

8.2.1 merge衝突

若是兩個分支同時修改了一個文件,merge的時候會衝突 $ git merge feature1 在IDE裏解決完衝突 → add → commit (此時master就是修改後的,feature1是修改前的) $ git checkout feature1 $ git merge master  // feature1和master同步了,此時不會衝突

合併分支策略 $ git merge dev  // Fast forward模式,將master指針指向dev的最新一次commit,此時master和dev的commit id相同 $ git merge --no--ff -m "提交信息" dev  // 禁用Fast foward模式,merge時會生成一個新的commit

8.2.2 push衝突

當同時修改了同一個文件時會致使git push失敗,必須先git pull → 解決衝突 →  git push git pull若是提示no tracking information說明沒有建立本地分支與遠程對應分支的連接關係,經過如下方式設置: $ git branch --set-upstream-to=origin/dev dev  // 本地分支dev關聯遠程分支origin/dev 再git pull

8.3 stash

git stash用於將「修改過的被追蹤的文件和暫存的變動」及stage和工做區的修改暫存起來。

stash的範圍: Changes to be committed(stage) Changes no staged for commit(工做區)

$ git stash  // 存檔當前的改動並清理工做區和stage $ git stash list  // 羅列全部的存檔 $ git stash apply  // 讀取最近的一次存檔 $ git stash apply stash@{0}  // 指定讀取某次存檔 $ git stash drop  // 刪除存檔 $ git stash pop  // 讀取並刪除最近一次存檔

8.4 rebase

這部份內容的參考教程: gitbook.liuhui998.com/4_2.html git-scm.com/book/zh/v1/…

步驟 圖示
假設有兩個分支:master、experiment
切換到experiment分支執行rebase
$ git checkout experiment
$ git rebase master
取出experiment分支上的提交C4接到master分支上的最新提交C3後面,將experiment指向C4'。此時experiment分支的進度是最新的,而master分支無變化。
rebase時若是出現了衝突:
打開IDE解決衝突
$ git add .
$ git rebase --continue
若是要終止rebase:
$ git rebase --abort
切換到master分支執行merge $ git checkout master $ git merge experiment
此時master將指向最新的commit

9 標籤管理

能夠給每次commit打一個標籤來增長辨識度。

$ git tag v1.0  // 給當前分支的最新提交打標籤 $ git tag v0.9 commitid  // 給某次commit打標籤 $ git tag -a v0.1 -m "version 0.1 released" commitid  // 給某次提交建立帶有說明的標籤 -a指定標籤名 -m指定說明文字 $ git tag  // 查看全部標籤 $ git show v0.9  // 查看某個標籤的詳細信息 $ git push origin v1.0  // 將某個標籤推送到遠程 $ git push origin --tags  // 將所有本地標籤推送到遠程 $ git pull origin --tags  // 拉取遠程標籤 $ git tag -d v0.1  // 刪除本地某個標籤 刪除遠程標籤: $ git tag -d v0.9 $ git push origin :refs/tags/v0.9

10 其餘經常使用命令

$ git log --graph --pretty=oneline --abbrev-commit  // git log --graph查看分支合併圖 $ git remote  // 查看遠程命名 $ git remote -v  // 查看遠程庫信息 $ pwd  // 顯示當前文件路徑 $ ls  // 查看該目錄下的全部文件 $ cat filename  // 查看文件內容 $ vi filename  // 進入文件編輯模式

Reference

學習參考教程:www.liaoxuefeng.com/wiki/001373…

Linux命令大全:www.runoob.com/linux/linux…

相關文章
相關標籤/搜索