git工具之修訂版本(revision)選擇


(一)通過幾種方法來指明特定的或一定范圍內的提交

指明單次提交:以下四類介紹

1.簡短HASH值指明單個提交:git show 77f237d

    git log --abbrev-commit --pretty=oneline  注:用七個字符來輸出簡短唯一的七字符hash值,然后選擇具體SHA-1值來git show 詳細信息。

2.顯示一個分支的最后一次提交的對象:git show branchname

如果你想顯示某個分支的最后一次提交對象,則可以使用:git show 分支名

3.引用日志里的簡稱指明單個提交:git show HEAD@{n}

在你工作的同時,Git 在后台的工作之一就是保存一份引用日志——一份記錄最近幾個月你的 HEAD 和分支引用的日志。每次你的分支頂端因為某些原因被修改時,Git 就會為你將信息保存在這個臨時歷史記錄里面。你也可以使用這份數據來指明更早的分支。

git reflog查看引用日志:

git log -g master 查看gitlog格式的引用日志信息:

如果你想查看倉庫中 HEAD 在5次前的值,你可以使用引用日志的輸出中的 @{5} 引用:git show HEAD{n}

也可以查看一定時間前分支指向哪里,例如你的master分支某一天指向哪里:

git show master@{日期}

4.祖先引用----指明某次提交的父提交:git show HEAD^ 與git show HEAD~

git show HEAD^ 表示合並是所在分支提交的父提交 ;在合並提交時,因為會有多個父提交,則git show HEAD^2表示第二父提交(第一父提交是你合並時所在分支,而第二父提交是你所合並的分支)。

git show HEAD~ 表示第一父提交,與git show HEAD^等價;但是git show HEAD~2表示第一父提交的第一父提交,即在同一分支上。

注:也可以用git show HEAD~3^2 指明先前引用的第二父提交。

 

指明范圍提交:以下三類介紹

比如:我這個分支上還有哪些分支沒合並到主干上?

1.雙點:找出可從一個分支獲得而不能從另一個分支獲得的提交,如圖你想知道開發分支上哪些還沒合並到主干

git log master..experiment  (這句話的意思是“所有可從experiment分支中獲得而不能從master分支中獲得的提交”。)

    $git log master..experiment

       形象描述,輸出:D C

 git log experiment..master(反過來所有在 master 而不在 experiment 中的分支)

    $git log master..experiment

       形象描述,輸出:E F

注:可以查看你將什么推送到遠程:git log origin/master..HEAD

2.多點:在多個分支篩選提交,在哪些分支不在哪個分支:

       兩個分支的話,如下三種效果一樣:

      git log refA..refB <=>git log  ^refA..refB <=> git log refB  - -not refA

       多分支:

      git log refA refB  ^refC <=> git log refA refB - -not refC

3.三點:在兩個分支中被單個分支包含但又不被同時包含

   git log master...experiment

上例: $git log master...experiment

           形象描述,輸出:E F D C

(二)儲藏(stashing)

描述常見情況:當你正在處理項目中某部分工作,此時的工作區處於比較雜亂的狀態,而你需要轉到其他分支處理一個比較急的情況。那么問題來了,你不想提交進行到一半的工作,但是切到其他分支,你以后又很難回到目前的工作點(包括你修改過的被追蹤文件和暫存的變更),那么可以用git stash命令;此命令可獲取你工作目錄的中間某狀態,將你那些修改的被追蹤文件和暫存的變更保存到一個專門存儲未完結變更的堆棧中,隨時可以重新應用。

1.往堆棧推送一個目前的本地工作區儲藏:git stash

2.你切到另一分支處理需求后,回到先前分支去應用儲藏的狀態:git stash list ;git stash apply stash{0} 

注:如果你想應用更早的儲藏,你可以通過名字指定它,像這樣:git stash apply stash@{2}。如果你不指明,Git 默認使用最近的儲藏並嘗試應用它。

有個問題需要注意:對文件的變更被重新應用,但是被暫存的文件沒有重新被暫存。你需要加上–index選項即可。對比如下圖:

 

git stash apply --index

 3.移除儲藏記錄:可以注意到每次刪除一個后,堆棧里記錄還是從1++的,即stash{2}刪除后,stash{3}就成了stash{2}。

 

延伸:你可以在其中一個分支上保留一份儲藏,隨后切換到另外一個分支,再重新應用這些變更,這是可以的。在工作目錄里包含已修改和未提交的文件時,你也可以應用儲藏,如果有任何變更無法干凈地被應用,此時Git 會給出歸並沖突直到沖突解決。

如下分析一種情況並給出快捷解決途徑:

問題如圖:你儲藏一個狀態,然后接着還在這個分支工作,修改提交了更新。然后你去應用儲藏出現了沖突,你必須解決沖突。

解決:你可以運行 git stash branch BranchName,這會創建一個新的分支,檢出你儲藏工作時所處的提交,重新應用你的工作,如果成功,將會丟棄儲藏。

(三)交互式暫存

描述常見情況:假如你修改了大量文件,想要按邏輯分為各有側重的變更集提交,而不是一個有大又亂的提交,這個工具會很有用。

git add -i  (i是interactive交互式,git會啟動一個交互式的shell模式,顯示如下信息)

1.暫存文件選擇:

可以看到如下file123三個文件未暫存狀態,在what now后輸入2或者u,選擇1、2、3中決定提交的某個或某批文件,回車,退出后去commit,這樣就提交了一筆選中文件的提交。

2.撤回已經暫存的某些文件:選中r或者3,回車,退出去commit

有興趣還可以研究下patch功能:

       交互式工具中的patch選項功能是暫存某個文件的某些部分而忽略其他的:Git會詢問哪些文件你希望部分暫存;然后對於被選中文件的每一節,他會逐個顯示文件的差異區塊並詢問你是否希望暫存他們。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM