Git:基礎教程

簡介
  1. Git:分佈式版本控制系統(不需要聯網,本地電腦擁有完整的代碼版本)
  2. SVN:集中式版本系統(必須聯網,中央服務器擁有完整的代碼版本)
  3. Github:遠程代碼存儲 和 版本控制等。
1、Git 安裝
  1. 官網下載:https://git-scm.com/downloads
  2. 配置用戶名和 Email 地址,也可以對某個倉庫指定不同的用戶名和 Email 地址。
$ git config --global user.name "Your Name"		// 全局用戶名
$ git config --global user.email "[email protected]"	// 全局 Email
2、創建版本庫
$ mkdir learngit   // 創建目錄
$ cd learngit	  // 進入目錄
$ pwd                // 顯示當前目錄
$ git add readme.txt   /   git add *         // 添加文件到本地倉庫暫存區
$ git commit -m "wrote a readme file"  // 把文件提交到本地倉庫
$ git status         // 倉庫當前修改的狀態
$ git diff            // 查看修改內容
3、查看歷史記錄
$ git log            // 歷史記錄
$ git log --pretty=oneline    // 歷史記錄 commit id 
$ git log --pretty=oneline --abbrev-commit
$ git reflog               // 記錄你的每一次命令-歷史記錄
4、版本回退
$ git reset --hard HEAD^^  // 回退上上版本    HEAD 指向的版本就是當前版本
$ git reset --hard HEAD~1  // 回退上1個版本
$ git reset --hard ce2ffe5e61cc1024ddd91cd502dd9e19056e9996   // 回退到指定 id 版本
5、工作區和暫存區

工作區:在電腦裏能看到的目錄。
版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
暫存區:Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫 index)的暫存區。

  1. 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
  2. 第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
6、管理修改
  1. 管理修改:Git 每次修改,如果不用git add到暫存區,那就不會加入到commit中。
7、撤銷修改
$ git checkout -- readme.txt  // 讓這個文件回到最近一次 git commit 或 git add 時的狀態。
$ git checkout -- *
  1. 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令 $ git checkout - - file / git checkout - - *
  2. 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD ,就回到了場景1,第二步按場景1操作。/ $ git reset --hard HEAD
  3. 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
8、刪除文件
$ rm readme.txt  // 刪除工作區文件
$ git checkout -- readme.txt    // 用版本庫裏的版本替換工作區的版本
$ git rm file	// 刪除工作區文件並添加到了暫存區
  1. 如果你用的rm刪除文件,那就相當於只刪除了工作區的文件,如果想要恢復,直接用git checkout – 就可以。
  2. 如果你用的是git rm刪除文件,那就相當於不僅刪除了工作區文件,而且還添加到了暫存區,如果想要恢復,需要先git reset HEAD ,然後再git checkout – 。
  3. 如果你想徹底把版本庫的刪除掉,先git rm,再git commit。
9、遠程倉庫
  1. 添加遠程庫
    1、注意:$ ssh-keygen -t rsa -C “[email protected]” // 創建SSH Key 默認:C:\用戶\用戶名.ssh 文件夾,用於添加到遠程賬戶
1 、git init -> git add .  -> git commit -m "first commit" 創建提交到本地倉庫
2、$ git remote add origin https://github.com/strugglelin/gitlearning.git   / $ git remote add origin [email protected]:strugglelin/gitlearning.git   // 本地倉庫與遠程倉庫關聯
3、$ git push -u origin master        // Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,(https 需要用戶名、密碼認證)
  1. 從遠程庫克隆
    1、原生git協議速度最快,確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes回車即可,https除了速度慢,每次推送都必須輸入口令。默認的git://使用ssh協議 / https:// 使用https協議。
$ git clone [email protected]:strugglelin/gitlearning.git  / $ git clone https://github.com/strugglelin/gitlearning.git
10、分支管理
  1. 創建與合併分支
    1、注意:HEAD嚴格來說不是指向提交,而是指向master,master纔是指向提交的,所以,HEAD指向的就是當前分支。當我們創建新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
  1. 解決衝突
    1、解決衝突就是把Git合併失敗的文件手動編輯爲我們希望的內容,再提交。
    2、用 git log --graph 命令可以看到分支合併圖。
git log --graph --pretty=oneline --abbrev-commit      // 查看分支的合併情況
  1. 分支管理策略
    注意:實際開發中,應該按照幾個基本原則進行分支管理
    1、master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
    2、幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本。
$ git merge --no-ff -m "merge with no-ff" dev  // 合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
  1. Bug分支
    1、修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
    2、當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
$ git stash		// 工作現場“儲藏”起來
  1. Feature 分支
    1、開發一個新feature,最好新建一個分支。
    2、如果要丟棄一個沒有被合併過的分支,可以通過 git branch -D 強行刪除。
  2. 多人協作
    1、推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上。
    master 分支是主分支,因此要時刻與遠程同步;
    dev 分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
    bug 分支只用於在本地修復bug,就沒必要推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
    feature 分支是否推到遠程,取決於你是否和你的小夥伴合作在上面開發。
$ git push origin master     /    $ git push origin dev // 推送分支到遠程倉庫
$ git pull 	// 拉取遠程分支代碼
// 抓取分支
01  $ git clone [email protected]:strugglelin/gitlearning.git	// 克隆遠程倉庫
02  $ git checkout -b dev origin/dev     //  你的小夥伴要在dev分支上開發,就必須創建遠程origin的dev分支到本地
$ git branch --set-upstream-to=origin/dev dev    // 創建本地分支和遠程分支的鏈接關係

多人協作的工作模式:
首先,可以試圖用git push origin 推送自己的修改;如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖合併;
如果合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用git push origin 推送就能成功!
如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令[git branch --set-upstream-to origin/。]$ git branch --set-upstream-to=origin/dev dev
$ git branch --set-upstream-to=origin/dev dev // 創建本地分支和遠程分支的鏈接關係

  1. Rebase
    rebase操作的特點:把分叉的提交歷史“整理”成一條直線,看上去更直觀。缺點是本地的分叉提交已經被修改過了。
    rebase操作可以把本地未push的分叉提交歷史整理成直線;
    rebase的目的是使得我們在查看歷史提交的變化時更容易,因爲分叉的提交需要三方對比。
11、標籤管理

Git有commit,爲什麼還要引入tag?
“請把上週一的那個版本打包發佈,commit號是6a5819e…”
“一串亂七八糟的數字不好找!”
如果換一個辦法:
“請把上週一的那個版本打包發佈,版本號是v1.2”
“好的,按照tag v1.2查找commit就行!”
所以,tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。

  1. 創建標籤
$ git log --pretty=oneline --abbrev-commit   // 查看所有commit id
命令git tag <tagname>用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;
命令git tag -a <tagname> -m "blablabla..."  可以指定標籤信息; $ git tag -a v0.1 -m "version 0.1 released" 1094adb
命令git show <tagname>可以看到說明文字
命令git tag可以查看所有標籤。
注意:標籤總是和某個commit掛鉤。如果這個commit既出現在master分支,又出現在dev分支,那麼在這兩個分支上都可以看到這個標籤。
  1. 操作標籤
$ git tag -d v0.1  // 刪除本地標籤
$ git push origin <tagname>  // 推送某個標籤到遠程  $ git push origin --tags  // 一次性推送全部尚未推送到遠程的本地標籤
標籤已經推送到遠程,要刪除遠程標籤
先從本地刪除:$ git tag -d v0.9    在從遠程刪除:$ git push origin :refs/tags/v0.9
12、自定義Git
  1. 忽略特殊文件 :https://github.com/github/gitignore
  2. .gitignore文件本身要放到版本庫裏,並且可以對.gitignore做版本管理!
  3. 配置別名:$ git config --global alias.st status
  4. 搭建Git 服務器。
13、遠程倉庫
  1. 使用GitHub :在GitHub上,可以任意Fork開源倉庫;自己擁有Fork後的倉庫的讀寫權限;可以推送pull request給官方倉庫來貢獻代碼
  2. 遠程倉庫平臺:GitHub、碼雲、GitLab等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章