如何查看Git上的特定提交

时间:2013-11-04 13:42:31

标签: git gerrit git-commit git-review

我使用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 < / strong>“属于新分支(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 ”提交,而不是其他提交。

4 个答案:

答案 0 :(得分:9)

在新分支中创建B提交。

在此分支上时,使用git review,它只会将此分支的内容推送到Gerrit。

这样,Gerrit不会认为你的提交B需要你的提交A,如果你愿意,你可以在提交A之前将你的提交B合并到工作分支

如果你的历史是这样的:

...-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 :(得分:4)

分支机构就是答案:

如果您尚未提交提交A,那么在提交A make a分支A之前,请将您的代码提交到该分支并提交以供审核 然后,返回到master并创建分支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 master 675c7d创建分支,然后将您的提交3挑选到新分支,然后您可以删除旧分支delete_role

答案 2 :(得分:1)

我看到它的方式你在你工作的地方有分支,然后你有提交A而下一个提交B也在同一个分支中。从逻辑上讲,他们并不依赖于彼此,但对于历史而言,这些变化是依赖的。因此,在第二个B可以合并之前,首先提交A将需要审核并合并到工作分支。

现在,当您推送评论参考时,Gerrit已经通过更改ID知道您推送的内容以供审核。如果你推动分支审查只会发送新的提交,或者更新或重新设置的提交。

长话短说。 Gerrit知道什么是新的以及已经在审查的内容。

答案 3 :(得分:1)

按下提交'A'后,您可以重置本地分支并开始提交'B'。因为每次提交/更改都可以在Gerrit推送到审核分支后检出。您可以在每个补丁集下载面板上从Gerrit审查板获取命令。一个例子:

git fetch https://android.googlesource.com/kernel/tegra refs/changes/43/69243/2 && git checkout FETCH_HEAD

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