繁体   English   中英

如何查看一个分支中的哪些提交不在另一个分支中?

[英]How to see which commits in one branch aren't in the other?

我有两个分支develnext 在开发中,我或多或少有大量的提交。 一些提交是在next挑选出来的。 我还向 next 添加了一些提交,这些提交已合并到devel

现在,我想看看什么是缺少next ,这样我就可以把他们之前测试的详细变化next 我现在的问题是,我怎样才能看到哪些提交在devel而不是在下一个?

很少使用的命令git cherry向您显示尚未被挑选出来的提交。 git cherry的文档在这里,但简而言之,你应该能够做到:

git checkout devel
git cherry next

...并看到输出有点像这样:

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

+开头的提交将是您尚未挑选到next的提交。 在这种情况下,到目前为止我只挑选了一个提交。 您可能希望将-v参数添加到git cherry命令,以便它还输出每个提交的主题行。

此外,您可以使用

git log --left-right --graph --cherry-pick --oneline devel...next

获得一个很好的列表,列出了分支之间未共享的实际不同提交。

操作词是--cherry-pick

--cherry-pick

当提交集受限于对称差异时,省略任何引入与“另一侧”的另一个提交相同的更改的提交。 例如,如果您有两个分支,A 和 B,通常只列出其中一侧的所有提交的方法是使用 --left-right,就​​像上面该选项描述中的示例一样。 然而,它显示了从另一个分支中挑选出来的提交(例如,“b 上的第三个”可能是从分支 A 中挑选出来的)。 使用此选项,此类提交对将从输出中排除。

更新正如评论中提到的,最近版本的 git 添加了--cherry-mark

--cherry-mark

像--cherry-pick(见下文),但用= 标记等效提交而不是省略它们,用+ 标记不等效的提交。

你可以尝试做 git log 子集:

git log --oneline devel ^next

怎么样

git log next..devel

结果类似于 Byran 的答案(不同的提交顺序),但我们的两个答案都会产生分支之间不同的提交,而只是显示一个分支中的内容而不是另一个分支中的内容。

要获取未集成到发布分支中的提交列表(下一个),您可以使用:

git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt

检查git-rev-list以获取更多信息。

@Mark Longair 在他的回答中指出了这一点,但我想补充一些额外的见解。

相关,并回答有关如何分解大型拉取请求 (PR) 的问题,尤其是当由于一个或多个 master 合并到您的 feature_branch 而压缩您的提交是不切实际的时

我的情况:
我做了一个包含 30 次提交的大型feature_branch并在 GitHub 上打开了一个 Pull Request (PR) 以将其合并到master Branch master在我下面改变了很多,并收到了 200 个我的feature_branch没有的提交。 为了解决冲突,我做了git checkout feature_branchgit merge mastermaster的更改合并到我的feature_branch 我选择merge而不是rebase到最新的 master,所以我只需要解决一次冲突而不是 30 次(每次提交一次)。 我不想先将我的 30 次提交压缩为 1 次,然后再重新调整到最新的master因为这可能会清除 PR 中的 GitHub 评论评论历史。 因此,我将 master 合并到我的功能分支并解决了 1 次冲突。 一切都好。 然而,我的 PR 太大了,我的同事无法审查。 我需要把它分开。 我去压缩我的 30 个提交,哦不! 他们在哪? 它们现在都与master的 200 次最近提交混合在一起,因为我将master合并到我的feature_branch 我该怎么办?

如果您想尝试git cherry-pick个人提交,请使用git cherry用法:

git cherry来救援(有点)!

要查看feature_branch但不在master所有提交,我可以执行以下操作:

git checkout feature_branch
git cherry master

或者,我可以通过执行git cherry [upstream_branch] [feature_branch]来检查来自任何分支的提交,而无需确保我首先在feature_branch git cherry [upstream_branch] [feature_branch] ,就像这样。 同样,这会检查哪些提交在feature_branchfeature_branch upstream_branch (在这种情况下为master ):

git cherry master feature_branch

添加-v还会显示提交消息主题行:

git cherry -v master

管道到“字数”“-lines”( wc -l )计算有多少提交:

git cherry master | wc -l

您可以将此计数与 GithHub PR 中显示的提交数量进行比较,以便更好地了解git cherry确实在工作。 您还可以一一比较 git 哈希,看看它们在git cherry和 GitHub 之间是否匹配。 请注意, git cherry不会计算您将master合并到feature_branch任何合并提交,但 GitHub 会。 因此,如果您发现计数存在小差异,请在 GitHub PR 提交页面中搜索“合并”一词,您可能会发现这是git cherry没有出现的罪魁祸首。 例如:标题为“Merge branch ‘master’ into feature_branch”的提交将显示在 GitHub PR 中,但不会在您运行git cherry master feature_branch 这很好,也符合预期。

所以,现在我有办法找出哪些差异我可能想要挑选到一个新的功能分支上来拆分这个差异:我可以在本地使用git cherry master feature_branch ,或者查看 GitHub PR 中的提交。

挤压有什么帮助——如果我们能挤压:

然而,另一种拆分我的大差异的方法是将我的所有 30 个提交压缩为一个,将其修补到一个新的功能分支上,软重置补丁提交,然后使用git gui逐个文件,逐块地添加块,或逐行。 一旦我获得一个子功能,我就可以提交我添加的内容,然后检查一个新分支,添加更多,提交,检查一个新分支等,直到我将我的大功能分解为几个子功能. 问题是,由于我的git merge master到我的feature_branch ,我的 30 个提交与其他人的其他 200 个提交混合在一起,因此变基是不切实际的,因为我必须筛选 230 个提交以重新排序和压缩我的30 次提交。

如何使用补丁文件来更轻松地替代压缩:

一种解决方法是简单地获取一个补丁文件,其中包含我所有 30 个提交的“壁球等效”,将其修补到master的新分支(一个新的子功能分支),然后从那里开始工作,如下所示:

git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master 
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch

现在我的 30-commit 补丁全部应用在本地,但未暂存和未提交。

现在使用git gui添加文件、块和/或行并分解你的大 PR 或“差异”:

请注意,如果您没有git gui ,则可以使用sudo apt install git-gui在 Ubuntu 中轻松安装它。

我现在可以运行git gui并开始添加文件、块和/或行(通过在 git GUI 程序中右键单击),并将 30 个提交功能分支分解为如上所述的子分支,重复添加、提交、然后分叉一个新的功能分支并重复这个循环,直到所有更改都添加到子功能分支并且我的 30-commit 功能成功分解为 3 或 4 个子功能。 我现在可以为这些子功能中的每一个打开一个单独的 PR,我的团队可以更轻松地查看它们。

参考:

  1. 从 git 存储库创建补丁或差异文件并将其应用到另一个不同的 git 存储库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM