如何在Git上查看特定提交记录

7

我使用git review命令将一次提交(名为“ A commit”)发送到评审(Gerrit)。

现在,我创建了一个新的提交(名为“ B commit”),并希望将其发送到评审,但我不想重新发送“ A commit”。它们之间没有依赖关系。

如何针对特定提交将评审发送到Gerrit?

更新:

$ git add --all


$ git status

# On branch delete_role
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   path/to/file.ext


$ git status

# On branch delete_role
nothing to commit (working directory clean)


$ git branch

*delete_role
 master


$ git log --graph --decorate --oneline -n13

* 531bd84 (HEAD, delete_role) commit 3
* df68f1a (master) commit 2
* 4ce2d8d commit 1
*   6751c7d (origin/master, origin/HEAD, gerrit/master)

提交记录 "df68f1a" 和 "4ce2d8d" 相互依赖,并且它们已经在之前的 git review 命令中被发送,但是提交记录 "531bd84" 属于一个新分支 (delete_role),因为它是一个新的问题。

$ git review

You have more than one commit that you are about to submit.
The outstanding commits are:

531bd84 (HEAD, delete_role) commit 3
df68f1a (master) commit 2
4ce2d8d commit 1

我希望只将“531bd84”提交发送到Gerrit,而不是其他提交。
4个回答

9
在新分支创建B提交。在该分支上,使用“git review”,它只会将该分支的内容推送到Gerrit。这样,Gerrit就不会认为您的提交B需要提交A,如果您想要的话,可以将提交B合并到工作分支中,然后再提交A。如果您的历史记录如下:
...-old(merged)-A(waiting for review)

你想要做的是:

您想要做的是:

...-old(merged)-A(waiting for review) <-master branch
       \B(new commit)                 <-new branch

如果你正在分支B上,并使用git review,它将不会推送除提交B之外的任何内容。

如果你处于这种情况:

...-old(merged)-A(waiting for review)-B

要达到我们想要的配置,您需要做的是:

git log (Note the SHA1 of your B commit)
git reset HEAD^^^ (you go back in detched state three commits before, before the two you don't want to send)
git checkout -b Breview (you create a new branch there)
git cherry-pick +the SHA1 you noted (you copy your B commit on your new branch)
git checkout master (you return on your branch with the two commit)
git reset HEAD^--hard (you delete the B commit from this branch where you don't need it)

现在,您已经完成了所需的配置,要推送您的B提交,只需要执行以下操作:
git checkout Breview
git review

只有提交你的B提交才会生效


1
是的,在基于远程分支的分支上创建提交B(因此没有提交A)。最好为您想要推送进行审查的每个提交创建一个分支(除非某些提交彼此依赖)。 - StephenKing
@Lobo 我更新了我的回答。你的新分支是基于一个提交还是已经合并的提交? - Rudy Bunel
@Lobo,你的新分支需要基于 Gerrit 中最后合并的提交。否则,Git 也会提交提交 A。 - Rudy Bunel
@RudyBunel 好的,我会尝试使用 "git rebase" 命令,但我不想再次将提交 A 发送到 Gerrit。如果我执行 "git rebase",我需要重新发送提交 A 到 Gerrit 吗? - Lobo
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/40805/discussion-between-rudy-bunel-and-lobo - Rudy Bunel
显示剩余3条评论

4

分支是解决方案:

如果您尚未进行A提交,请在进行A提交之前创建A分支,然后将您的代码提交到该分支并请求评审。接下来,返回主分支并创建B分支,在B分支中提交并请求评审。

这样做可以确保没有依赖关系。

现在,假设您已经像这样在主分支中提交了所有内容:

M----A----B

这是你的日志:
commit b58fff12319d7ad1b1bc6ebcf4395d986a8ffac3
Author: 
Date:   Fri Nov 8 09:48:23 2013 +0800

    Change B

commit 99f249cdf2352ace3ca9ee8bf7a8a732f27b31eb
Author: 
Date:   Fri Nov 8 09:47:56 2013 +0800

    Change A

commit f091b7a4cc5c0532973c5bd401d2171f6fb735ec
Author: 
Date:   Fri Nov 8 09:47:30 2013 +0800

    Initial commit

我们需要的是这个:
    A
  / 
 /
M 
 \
  \
   B

为了得到这个,执行以下命令:
# Create two new branches from the point where the current Gerrit repo master is now
git branch A f091b7a4cc5c0532973c5bd401d2171f6fb735ec
git branch B f091b7a4cc5c0532973c5bd401d2171f6fb735ec
git checkout A # Create a branch to hold change A
git merge 99f249cdf2352ace3ca9ee8bf7a8a732f27b31eb
git log
commit 99f249cdf2352ace3ca9ee8bf7a8a732f27b31eb
Author: 
Date:   Fri Nov 8 09:47:56 2013 +0800

    Change A

commit f091b7a4cc5c0532973c5bd401d2171f6fb735ec
Author: 
Date:   Fri Nov 8 09:47:30 2013 +0800

    Initial commit
git checkout B 
git cherry-pick b58fff12319d7ad1b1bc6ebcf4395d986a8ffac3
git log
# Note the new sha1 hash as this is change could not be fast forwarded
commit d3aa1acc2b208115c7de78d5c9c4f6a906ece84a
Author: 
Date:   Fri Nov 8 09:48:23 2013 +0800

    Change B

commit f091b7a4cc5c0532973c5bd401d2171f6fb735ec
Author: 
Date:   Fri Nov 8 09:47:30 2013 +0800

    Initial commit

现在你有两个分支,每个分支都有一个变更。将这些变更之一推送到Gerrit,只会推送一个变更。
然后,您可能希望通过删除其中的提交来清理您的主分支:
git checkout master
git reset --hard HEAD~2

关于更新问题的特别说明:

git branch B 6751c7d 
git checkout B
git cherry-pick 531bd84 

您应该从gerrit主干675c7d创建分支,然后将您的提交3 cherry-pick到新分支中,然后您可以删除旧分支delete_role


我原本预计只有一个提交需要发送进行审查。 - Lobo
1
你已经从Gerrit的主分支上创建了新分支吗?你应该从当前Gerrit主分支所在的位置开始创建新分支。 - uncletall
1
git branch B 6751c7d git checkout B git cherry-pick 531bd84 你应该从 gerrit 主干 675c7d 创建分支,然后将你的提交3 cherry-pick 到新分支中,接着可以删除旧分支 delete_role。 - uncletall
谢谢,我刚刚按照你在最后一条评论中描述的方式解决了我的问题。 - Lobo
不同的时区 ;) - uncletall
显示剩余4条评论

1
在提交'A'后,您可以重置本地分支并开始处理提交'B'。由于一旦提交到审核分支后,每个提交/更改都可以从Gerrit检出,因此您可以在每个补丁集下载面板的Gerrit审查面板中获取该命令。例如:
git fetch https://android.googlesource.com/kernel/tegra refs/changes/43/69243/2 && git checkout FETCH_HEAD

检查过更改后,可以将其修改并再次推送为新的补丁集。因此,您不必为每个提交使用本地分支。

1
我认为你在工作时有一个分支,然后你提交了A,接下来提交B也在同一个分支中。因此从逻辑上讲,它们彼此不依赖,但对于历史记录来说,这些更改是相互依赖的。因此,在第二个B合并之前,必须先审核并合并第一个提交A到工作分支。
现在当您推送引用进行审核时,Gerrit已根据更改ID知道您为审核推送了什么。如果您只推送要审核的分支,则只会发送新的提交或已更新或重新基础化的提交。
长话短说,Gerrit知道什么是新的,什么已经在审核中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接