1. 程式人生 > >Git 學習進階篇

Git 學習進階篇

Git brach 分支

Git可以建立多個分支,用於對不同版本程式碼分別進行維護操作。

Git對每個分支預設讀取最新commit索引

branch操作常用命令:

命令 描述 例項
git branch xx 建立分支 git branch test,建立test分支
git checkout xx 切換分支 git checkout test,切換到分支test
Administrator@Just-pc MINGW32 /g/git_test/git_repo (master)
$ git branch test               //建立test分支
$ ls //檢視master分支下檔案,只有master.d master.d $ git checkout test //切換到 test分支 Switched to branch 'test'
[email protected] MINGW32 /g/git_test/git_repo (test)
$ vim test.d                    //新增檔案 test.d
$ git add .
$ git commit -m 'first commit on branch test'
[test be2635d] first commit on
branch test 1 file changed, 1 insertion(+) create mode 100644 test.d
$ git checkout master           //切換為maste分支
Switched to branch 'master'

Administrator@Just-pc MINGW32 /g/git_test/git_repo (master)
$ ls                            //maser分支顯示的是之前的最新的commit提交引用
master.d

如何讓引用指向某一固定提交呢?如指向某些釋出的版本, tag!

Git tag

分類:
- 輕量級,本地的引用;
- 帶註解的,就是之前儲存在g**it物件中的Git tag物件**。

相關命令:

命令 描述 例項
git tag 建立本地tag git tag “V0” SHI-ID
git tag -a 建立註解tag
git show 檢視tag內容 git show V0
git checkout 切換到tag git checkout V0

首先,檢視當前的歷史記錄

$ git config --global alias.lol  "log --oneline --all --decorate --graph"  //定義別名
$ git lol   // 顯示所有提交資訊

* be2635d (test) first commit on branch test
* 629aa7f (HEAD -> master) second commit on master
* 5154992 master.d first time commit

create tag

[email protected]-pc MINGW32 /g/git_test/git_repo (master)
$ git tag "V0" 5154992              //本地
$ git tag -a "MASTER_FIRST" 5154992 //註解

再次檢視歷史

[email protected] MINGW32 /g/git_test/git_repo (master)
$ git lol                           // 在索引 5154992中以包含建立的兩個tag
* be2635d (test) first commit on branch test
* 629aa7f (HEAD -> master) second commit on master
* 5154992 (tag: V0, tag: MASTER_FIRST) master.d first time commit

檢視建立的tag內容

其中,看兩者不同之處,註解方式的MASTER_FIRST tag,是一個tag物件

$ git show V0
commit 51549925f380bd46c291f02d8988d368c28ecaab
Author: xx
Date:   Sun Nov 13 13:01:12 2016 +0800
[email protected]-pc MINGW32 /g/git_test/git_repo (master)
$ git show MASTER_FIRST
tag MASTER_FIRST
Tagger: xx
Date:   Sun Nov 13 13:30:00 2016 +0800
MASTER_COMMIT

checkout tag

在建立tag時,已經可以看到tag也是指向某一個commit引用,所以可以使用checkout命令,切換到tag

checkout tag V0:

[email protected] MINGW32 /g/git_test/git_repo (master)
$ git checkout V0
Note: checking out 'V0'.

You are in 'detached HEAD' state. You can look around, make experimental
...
you may do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 5154992... master.d first time commit

根據提示資訊,此時處於 ‘detached HEAD’ 狀態,表示當前HEAD指向commit,而不是某個分支;我們在 ‘detached HEAD’狀態下的操作不會被儲存,除非我們使用 ‘git checkout -b ’ 命令,依據當前HEAD索引,建立新的分支,並切換到新的分支上。

為了儲存操作資訊,建立按照提示,建立新的分支 branch_V0

[email protected]-pc MINGW32 /g/git_test/git_repo ((MASTER_FIRST))
$ git checkout -b branch_V0
Switched to a new branch 'branch_V0'

對branch_V0分支進行操作,如果對資料進行了修改,則必須進行 commit或者 stash 否則無法checkout其他分支

[email protected] MINGW32 /g/git_test/git_repo (branch_V0)
$ ls                                  //檢視檔案
master.d 
$ vim master.d                        //修改master.d檔案
$ git add .                           //新增到暫存區

[email protected] MINGW32 /g/git_test/git_repo (branch_V0)
$ git checkout master  //嘗試切換到master分支,發現遇到error
error: Your local changes to the following files would be overwritten by checkout:
        master.d
Please, commit your changes or stash them before you can switch branches.

git stash

可以想到,在開發過程中,當前修改還沒有完成,又不得不去操作其他分支,如master分支,這時候使用stash比較合適

相關命令:

命令 描述
git stash 切換分支前,儲存沒有提交的修改
git stash save -a 儲存當前操作記錄
git stash list 檢視儲存的stash 記錄
git stash pop 還原所有stash儲存時的操作(如之前我們操作matser.d檔案,還未提交)
git stash pop –index [email protected]{n} 還原某個stash
git stash apply –index [email protected]{n} 還原某個stash 但不會刪除 stash
git stash drop [email protected]{n} 刪除某個stash,如果不加 stash則刪除所有

git stash pop 與 git stash apply 區別在於前者會刪除stash ,而 apply則不會刪除 stash

[email protected] MINGW32 /g/git_test/git_repo (branch_V0)
$ git stash save -a 'stash_on_bracnV0' //儲存 stash
Saved working directory and index state On branch_V0: stash_on_bracnV0
HEAD is now at 5154992 master.d first time commit
$ ls  //上面提示資訊,表示已恢復到為修改之前,即tag V0所指向索引的內容
master.d

[email protected] MINGW32 /g/git_test/git_repo (branch_V0)
$ cat master.d //檢視內容,這裡看到和 master第一次提交內容相同
111111111

當完成master分支後,返回branch_V0分支,繼續之前的修改,這時候需要檢視stash中都有哪些內容。

$ git stash list  //看到[email protected]{0} 引用指向我們建立的 stash_on_branchV0
[email protected]{0}: On branch_V0: stash_on_bracnV0

還原 stash儲存的內容,執行pop操作後,會同步刪除還原的stash

$ git stash pop --index [email protected]{0}  //還原stash
$ cat master.d
111111111                          //master分支儲存的索引內容

modify on branch_V0                //這裡是在brachV0上儲存的索引內容

$ git stash list                   // 檢視stash 發現 stash_on_branchV0已經不存在了
[email protected]-pc MINGW32 /g/git_test/git_repo (branch_V0)
$

驗證git stash apply操作,重新儲存一次 stash

[email protected]-pc MINGW32 /g/git_test/git_repo (branch_V0)
$  git stash save -a 'stash_second_on_branchV0' //儲存stash
$ cat master.d                        // 檢視檔案內容
111111111 
$ git stash list                      // 還原前檢視stash list
[email protected]{0}: On branch_V0: stash_onsecond_on_branchV0

$ git stash apply --index [email protected]{0}   //還原 stash
On branch branch_V0
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   master.d

$ cat master.d                       //檢視檔案內容
111111111
modify on branch_V0
$git stash list                      //apply後檢視stash仍然存在    
[email protected]{0}: On branch_V0: stash_onsecond_on_branchV0

Git merge 合併

Git merge命令用來合併分支上的操作

相關命令:

命令 描述 示例
git merge 當前分支合併某一分支中檔案 git merge test(分支名)
git merge –abord 放棄合併操作 git merge –abord test

分支準備:
- master分支

[email protected]-pc MINGW32 /g/git_test/git_repo (master)
$ cat master.d                  
111111111
222222222

$ git checkout -b branch_merge //建立分支 branch_merge,(是master最新索引)
Switched to a new branch 'branch_merge'
  • branch_merge分支
Administrator@Just-pc MINGW32 /g/git_test/git_repo (branch_merge)
$ vim master.d 
$ git add .
$ git commit -m 'commit on branch_merge' master.d
$ cat master.d  //branch_merge 分支內容
111111111
222222222
modify on branch branch_marge
  • branch_V0 分支
[email protected] MINGW32 /g/git_test/git_repo (branch_merge)
$ git checkout branch_V0  
$ cat master.d   // branch_V0 分支內容
111111111
modify on branch_V0

現將 branch_V0分支 和 branch_merge分支內容合併到 master上

區別:barch_V0分支對master.d檔案的修改,是基於某一索引,從之前可以知道,是基於mastr的第一次索引;而 branch_merge分支是基於master的最新索引,也就相當於在master基礎上修改

先檢視下log

[email protected] MINGW32 /g/git_test/git_repo (master)
$ git lol
* 872942d (branch_merge) commit on branch_merge
| * 3b9ceaa (branch_V0) commit on branch_V0
| | * be2635d (test) first commit on branch test
| |/
|/|
* | 629aa7f (HEAD -> master) second commit on master
|/
* 5154992 (tag: V0, tag: MASTER_FIRST) master.d first time commit

合併branch_merge

[email protected] MINGW32 /g/git_test/git_repo (master)
$ git merge branch_merge
Updating 629aa7f..872942d
Fast-forward
 master.d | 1 +
 1 file changed, 1 insertion(+)

$ git status                    //很乾淨,沒有需要提交的檔案
On branch master
nothing to commit, working directory clean

從上面可以看到狀態 ‘Fast-forward’ 表示不需要進行提交等操作,和之前說的分支區別表示的意義相同。

檢視master.d內容和日誌

[email protected] MINGW32 /g/git_test/git_repo (master)
$ cat master.d
111111111
222222222
modify on branch branch_marge   //分支內容已合併到master

[email protected] MINGW32 /g/git_test/git_repo (master)
$ git lol
* 872942d (HEAD -> master, branch_merge) commit on branch_merge
| * 3b9ceaa (branch_V0) commit on branch_V0
| | * be2635d (test) first commit on branch test
| |/
|/|
* | 629aa7f second commit on master
|/
* 5154992 (tag: V0, tag: MASTER_FIRST) master.d first time commit

合併 branch_V0

[email protected] MINGW32 /g/git_test/git_repo (master)
$ git merge branch_V0
Auto-merging master.d
CONFLICT (content): Merge conflict in master.d
Automatic merge failed; fix conflicts and then commit the result.

提示狀態:Auto-mergign failed,需要修復衝突,然後提交,於是需要編輯 master.d檔案

[email protected] MINGW32 /g/git_test/git_repo (master|MERGING)
$ vim master.d

//以下是master.d檔案中的內容

111111111
<<<<<<< HEAD
222222222
modify on branch branch_marge
=======

modify on branch_V0
>>>>>>> branch_V0
~

其中,”<<<<<<< HEAD” 與 “=======” 之間表示mastet上分支內容; “=======” 與 “>>>>>>> branch_V0”之間表示branch_V0分支上內容;根據需要進行修改(刪除分支標識)後,將檔案新增進暫存區,然後提交。

[email protected] MINGW32 /g/git_test/git_repo (master|MERGING)
$ git add master.d

[email protected] MINGW32 /g/git_test/git_repo (master|MERGING)
$ git commit -m 'merge branch_V0' master.d  
fatal: cannot do a partial commit during a merge.

[email protected] MINGW32 /g/git_test/git_repo (master|MERGING)
$ git commit  //在 MERGIGN狀態下,提交直接使用git commit
[master d8e6e7d] Merge branch 'branch_V0'

END

  • Git對分支的操作,會在分支上產生不同的引用;
  • checkout切換分支,則是將HEAD切換到不用的引用上。
  • tag可以指定某一索引的引用
  • stash可以儲存在某一分支上未完成的修改,實際上是對工作區、暫存區內容的還原
  • marge對分支內容進行合併。

more

相關推薦

Git 學習

Git brach 分支 Git可以建立多個分支,用於對不同版本程式碼分別進行維護操作。 Git對每個分支預設讀取最新commit索引。 branch操作常用命令: 命令 描述 例項 git branch xx 建

Git 學習 -歷史檢視

Git歷史記錄的檢視與對比 主要涉及到三個命令:git log 、git diff 、git show git log 命令使用 在專案提交了若干記錄,==git log== 命令可以檢視提交歷史: $ git log commit d8e6e7

剖析 git

假設現在你正在一個目錄中開發一個剛起步的專案,忙活了一天,自己不小心按下了強制刪除的快捷鍵,或者是哪個和你關係不太好的同事刪除掉了你的專案,這個時候如果你沒有初始化(git init)過一個git倉庫,並且git add過,那對不起,從頭再來吧。但如果你已經有了一個git倉庫,並且使用過git add命令

SODBASE CEP學習(二)續:日誌採集-Logstash、Kafka和CEP整合

相比Flume,筆者更推薦使用Logstash做日誌採集,見SODBASE CEP學習進階篇(二)續:日誌採集-Logstash、Kafka和CEP整合。如果之前專案中已經選型使用Flume,則本文供參考。 1. 啟動CEP模型 啟動CEP Server ./catalina

SODBASE CEP學習(七)續:SODBASE CEP與Spark streaming整合-低延遲規則管理 與分散式快取整合

在實際大資料工作中,常常有實時監測資料庫變化或實時同步資料到大資料儲存,解決大資料實時分析的需求。同時,增量同步資料庫資料相比全量查詢也減少了網路頻寬消耗。本文以Mysql的bin-log到Kafka為例,使用Canal Server,通過SODBASE引擎不用寫程式就可以設定資料同步規則。

SODBASE CEP學習(二):日誌採集-Flume

在IT系統運維和效能監控中,常常需要對日誌進行分析,得到系統的故障點或效能瓶頸。採用現成的日誌分析軟體,通常著重於監測節點和網路狀態,幾乎都難以滿足大型應用系統對故障點或效能瓶頸分析的要求。 舉幾個例子: (1)找出故障的上下層呼叫的關係,定位應用層故障對應的底層介面 (

SODBASE CEP學習(六):實現反壓和流限速

前面文章介紹過流資料輸入速率要和處理能力相匹配,短時資料爆發由內部緩衝佇列來緩衝。如果確實存在某個時間點持續資料爆發,可以考慮採取反壓限流的方法。 1. 示例操作步驟 (1)下載SODBASE Studio2.0.22(sp1)以上版本,解壓,開啟configuration

SODBASE CEP學習(七)續:SODBASE CEP與Spark streaming整合-低延遲規則管理

許多大資料平臺專案採用流式計算來處理實時資料,會涉及到一個環節:處理規則管理。因為使用者經常有自己配置資料處理規則或策略的需求。同時,維護人員來也有也有將規則提取出來的需求,方便變更和維護的需求。我們知道Spark streaming作為資料歸檔備份時吞吐量高,與Hadoo

Vue學習筆記——多元素及多組件過渡

之前 bsp lan ssa 當前 好的 can cancel 簽名 本文為轉載,原文:Vue學習筆記進階篇——多元素及多組件過渡 多元素的過渡 對於原生標簽可以使用 v-if/v-else.但是有一點需要註意: 當有相同標簽名的元素切換時,需要通過 key 特性設置唯一

Vue學習筆記——Render函數

resp targe 無效 數據 iso 簡潔 如果 som cimage 本文為轉載,原文:Vue學習筆記進階篇——Render函數 基礎 Vue 推薦在絕大多數情況下使用 template 來創建你的 HTML。然而在一些場景中,你真的需要 JavaScript 的完全

Vue學習筆記——過渡狀態

節點 val start 學習筆記 update 設置 hub reat res 本文為轉載,原文:Vue學習筆記進階篇——過渡狀態Vue 的過渡系統提供了非常多簡單的方法設置進入、離開和列表的動效。那麽對於數據元素本身的動效呢,比如: 數字和運算 顏色的顯示 SVG 節

Vue學習筆記——列表過渡及其他

absolut compute top sla 做的 有一個 .cn -s cas 本文為轉載,原文:Vue學習筆記進階篇——列表過渡及其他本文將介紹Vue中的列表過渡,動態過渡, 以及可復用過渡是實現。 列表過渡 目前為止,關於過渡我們已經講到: 單個節點 同一時間渲染

React學習筆記之react(1)

ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state   state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示

React學習筆記之react(2)

-s state ops category strong tro 服務 ive 周期 2.組件與服務器通信   組件的生命周期分為三個階段:掛載階段->更新階段->卸載階段,本文主要集中講述掛載和更新階段組件如何和服務器進行通信。 1.組件掛載階段通信  

Oracle RMAN 學習:演練

  Oracle RMAN 學習:演練進階篇 5 Rman備份演練進階篇 5.1 是否選擇增量備份  Backup命令生成的備份集中只備份了那些使用了的資料塊,備份集實際大小已經較目標資料庫的資料檔案小了很多 備份時只備份那些修改過的資料,  如果資料庫在非歸檔模式下

php程式設計師的學習路線,以及

# PHP interview best practices in China 如果你現在處於以下幾種狀態,本資料非常適合你: * 準備換工作,不知道從哪開始準備 * 技術遇到瓶頸,不知道該學什麼 * 準備學 PHP,但不知道領域有多深 ## 基礎篇 * 瞭解大部分陣列處理函式 * 字串處

Vue學習筆記——vue-resource安裝及使用

簡介 vue-resource是Vue.js的一款外掛,它可以通過XMLHttpRequest或JSONP發起請求並處理響應。也就是說,$.ajax能做的事情,vue-resource外掛一樣也能做到,而且vue-resource的API更為簡潔。 本文是基於之前的文章(Vue學習筆記進

(3)PHP 學習筆記 from imooc

可以使用下面程式碼實現: $fruit = array("蘋果","香蕉","菠蘿"); 注意陣列的鍵是從0開始的。可以使用print_r($fruit);語句輸出陣列鍵及對應的值。 <?php   //建立一個索引陣列,索引陣列的鍵是“0”,值是“蘋果” $

從頭學習爬蟲(三十六)----Selenium高階

引自:自上世紀末Kent Beck提出TDD(Test-Driven Development)開發理念以來,開發和測試的邊界變的越來越模糊,從原本上下游的依賴關係,逐步演變成你中有我、我中有你的互賴關係,甚至很多公司設立了新的QE(Quality Engineer)職位。和

Vue學習筆記——vue-router安裝及使用

介紹 vue-router是Vue.js官方的路由外掛,它和vue.js是深度整合的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和元件的,路由用於設定訪問路徑,並將路徑和元件對映起來。傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。在vue-ro