【问题标题】:How do I get all the commit SHA ID from a branch locally and on remote?如何从本地和远程分支获取所有提交 SHA ID?
【发布时间】:2018-11-22 20:54:37
【问题描述】:

我正在尝试获取特定分支的所有提交 ID 的列表,

我只知道git ls-remote <git-repo-url> | awk '{print $1}' 提供了所有分支/头的最新提交 sha。

我的目标是查找我从git rev-parse <branch_name> 获得的本地最新提交是否存在于从远程检索到的所有提交的列表中。如果是这样,我需要重新设置基准,如果远程上的最新提交 SHA 存在于本地提交 sha 列表中,那么但不是我的最新版本,这意味着我的本地分支已经向前推进,我不需要重新设置基准,只需推送。

【问题讨论】:

  • "而且我不需要做变基,只需推送即可。" -- 如果<branch1> 是当前分支的祖先,git rebase <branch1> 没有任何作用.您始终可以在远程分支之上重新调整本地更改。
  • 您可以使用git merge-base --is-ancestor <branch1> <branch2>。如果<branch1><branch2> 的祖先,它会以代码0 退出,并且比您当前的方法快得多。

标签: git git-commit git-log


【解决方案1】:

如果您要做的是确定您的本地分支是否与远程分支分歧,我认为git-logtriple-dot notation 为您提供更好的服务。例如:

git log <local-branch>...<remote-branch> --oneline

将为您提供local-branchremote-branch 中的提交列表,但不是两者

如果您还添加--left-right,您将获得提交在哪一侧的指示:

git log <local-branch>...<remote-branch> --oneline --left-right

其中&lt; 表示提交在左侧但不在右侧,而&gt; 表示在右侧但不在左侧。 p>

编辑: 除非您正在编写脚本,在这种情况下,git-merge-base@axiaccomment 中建议的--is-ancestor 选项是更好的选择,因为您可以只需检查退出代码。

【讨论】:

  • 利益相关者不想使用合并策略,并且这个逻辑实现是另一个脚本的一部分,我想避免在我们不需要的时候运行 rebase 命令所以只是强制推送在开发分支上。但是对于git log &lt;local-branch&gt;...&lt;remote-branch&gt; --oneline,必须事先执行git fetch
  • git-merge-base 用于在两个或多个提交之间找到共同的父级,这也是 git-rebase 所做的。至于您的第二条评论,如果您要将本地分支与远程分支进行比较,则无论如何都必须运行git-fetch
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2022-11-05
相关资源
最近更新 更多