2011-10-23 30 views
3

我想查看只有兩個提交的差異。審查由一組提交造成的差異

例如

$ git log --oneline 
0ff4567 fix bug #1, now really really really 
1ff4567 fix bug #1 really 
2ff4567 fix bug #2 
3ff4567 fix bug #3 
4234567 refactor code 
5ff4567 fix bug #1 
6234567 fix bug #4 

我只需要查看相關的bug#1,即提交,提交0ff45671ff45675ff4567

我不在乎其他提交的差異。

有沒有簡單的方法來做到這一點?

更新:我知道相關提交列表。鑑於這個列表,我想獲得一個差異,這是更容易審查。

+0

對提交進行重新排序是否可以接受?如果他們是你的,而你還沒有推他們,你甚至可以壓扁他們。見http://stackoverflow.com/questions/2740537/reordering-of-commits – Johnsyweb

+0

不,不。他們已經推了。否則我不會有問題。 –

+0

然後,我會'git clone repo temp_repo'並在臨時副本中播放。 – Johnsyweb

回答

2

您可以使用--grep選項git log,該選項僅輸出提交符合特定正則表達式的日誌消息。你的情況,你可以這樣做:

git log --oneline --grep='bug #1' 

...如果你想看到每個這些提交的推出了補丁,當然,你應該做的:

git log -p --grep='bug #1' 

在下面的評論,你解釋說你確實需要一個補丁作爲輸出,這代表這三個提交引入的補丁的累積效果。在這種情況下,您可以嘗試以下方法之一:

  • 使用patchutils中的combinediff工具組合差異。 (這可能不起作用,具體取決於中間提交發生了什麼變化。)
  • 創建一個臨時新分支,並使用交互式分配(可能在GIT_EDITOR環境變量中使用巧妙構建的命令)重新排序並壓縮提交。

爲了擴大對後者的選擇了一下,這個腳本是基於("super-kludgy") example通過Jefromi

#!/bin/sh 

set -e 

if [ $# -ne 2 ] 
then 
    echo "Usage: $0 REGEX TEMPORARY_BRANCH_NAME" 
    exit 1 
fi 

REGEX="$1" 
BRANCH_NAME="$2" 

git checkout -b "$BRANCH_NAME" 

FIRST_COMMIT=$(git log --grep="$REGEX" --pretty=format:%H | tail -1) 
if [ -z "$FIRST_COMMIT" ] 
then 
    echo "No commits matched '$REGEX'" 
    exit 2 
fi 

export GIT_EDITOR="f() { if [ \"\$(basename \$1)\" = \"git-rebase-todo\" ]; then sed -i -n '/${REGEX}/p' \$1 && sed -i '2,\$s/pick/squash/' \$1; else vim $1; fi }; f" 
git rebase -i ${FIRST_COMMIT}^ 

...你還不如調用:

squash-matching-commits 'bug #1' tmp-branch 

...然後將創建分支tmp-branch,重新綁定到匹配的第一個提交的父項210,只挑選匹配bug #1並且除第一個之外都擠壓的提交。 (您可能需要解決一些衝突,併爲壓扁提交提供一個提交信息)。如果成功,那麼你可以這樣做:

git show 

...看到合併補丁。我不認真地推薦任何人使用這個腳本,但它是一個有趣而且很冒險的做你想做的事情的方式,我認爲:)

+1

我不想看到補丁列表。我想看到一個補丁。 –

+0

我忘了'-p'選項。 +1 – VonC

+0

噢,我添加了兩個其他可能的選項。我認爲downvote特別苛刻,因爲這個問題沒有說明OP甚至知道'--grep'選項。 –

1

你可以使用git log --grep=fix1(如Git reference所示)來隔離相關的提交,然後爲每個提交執行git show <commit>

參見「Shorthand for diff of git commit with its parent?」。

將這些色塊組合爲單個差異並不重要,因爲Jefromi在「git diff with author filter」中進行了說明。

這裏的問題是,你不能在一般情況下這樣做。
假設Alice更改一個特定的文件,然後Bob更改它 - 包括Alice更改的部分 - 最後Alice再次更改它。
你如何將愛麗絲的兩個差異組合成一個差異?
如果你把它們作爲兩個補丁,第二個簡單地不適用,沒有鮑勃的補丁首先被應用!
但是,你也不能簡單地將最終狀態與原始狀態進行比較,因爲這將包括Bob的更改。

在你的情況,可能的(很麻煩)解決方案應該是類似「Extract relevant changes for code review」:

退房的修訂工作副本只是第一個變化之前。然後將所有相關的提交合併到您的工作副本中。
現在你有一個工作副本,它的基礎只是通過相關更改而有所不同。您可以直接查看,或從中創建一個補丁以供審閱。

因此:專用的fix1_review分支是可能的,但這仍然是一個半自動化的設置(因爲您必須解決可能的衝突)。

+0

@Elazar已經確定了提交。這是一個需要的組合差異/補丁。 – Johnsyweb

+0

@Johnsyweb:我剛剛在最近編輯的答案中提到了這一點。 – VonC

+0

我在編輯之後閱讀了你的答案,而且看起來還是錯誤的。我需要用'meld'來檢查所有的東西,並考慮是否有問題。 grep是無關緊要的。我有我感興趣的提交的確切列表。 –