Git-如何找到特定分支的第一次提交

在下面的示例树中:

A-B-C-D-E (master branch)
\
F-G-H (xxx branch)

我正在寻找 F-第一次提交在 xxx 分支。我认为这是可能的:

git log xxx --not master

最后列出的提交应该是 F。这是正确的解决方案吗? 或者它有一些缺点?

我知道关于堆栈溢出也有类似的问题,但是没有人提出这样的解决方案,我不确定我是否做对了。

78099 次浏览

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1

git log master..branch --oneline | tail -1

其中“分支”是您特定的分支名称。Dot-dot 提供了所有的提交,这些提交是分支拥有的,而主服务器没有。tail -1返回上一个输出的最后一行。

你应该使用 merge-base的功能,这个功能就是为了解决这个问题而设计的:

git merge-base remotes/origin/<branch> develop

如果您的分支(旧的分支)再次合并回 master 并没有给出预期的结果。

Git rev-list ——第一父变更集

在看到合并提交时,first-father 只跟随第一个父提交。

从上面的命令迭代变更集,直到找到父分支。

def status_check(exec_command, exec_dir=None, background=False):
if exec_dir:
os.chdir(exec_dir)
res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if not background:
result = res.communicate()
return result






def findNewBranchCommits(changeset=None):
cmd = "git rev-list --first-parent "+ changeset
rev_list = status_check(cmd,self.module_dir)
rev_list = str(rev_list[0]).split('\n')
rev_list = list(filter(None, rev_list))
for x in rev_list:                      # Iterate until branch base point
rev_cmd = "git branch --contains " + x
rev_cmd = status_check(rev_cmd,self.module_dir)
rev_cmd = str(rev_cmd[0]).split('\n')
if(len(rev_cmd) > 2):
print "First Commit in xxx branch",x
break


findNewBranchCommits(changeset)
git cherry master -v | tail -1

但是,这只会给出不在 master 中的分支 xxx 上的第一次提交,而不会给出分支 xxx 上的第一次提交。如果删除了 xxx 分支并且/或者重新创建了一次或多次,那么后者将很困难。如果是这样的话,你可以试试下面的方法:

git reflog | grep checkout | grep xxx | tail -1
git cherry master -v | head -n 1

cherry-显示当前分支上不存在的提交(医生)。逆流而上(本例中为 master)是当前分支的派生点。

-v-显示提交名称(而不仅仅是 SHA 的名称)-冗长。

Unix 命令,从文本中打印出 n行数

我试了下这个命令,它奏效了:

git log <source_branch> <feature_branch> --oneline | tail -1

您还可以使用它直接获取特性分支中第一次提交的散列值:

git log <source_branch>..<feature_branch> --pretty=format:%h