在下面的树形示例中:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
我正在寻找 xxx 分支中的第一次提交 F。我认为可以通过以下方式实现:
git log xxx --not master
最后列出的提交应该是F。这是正确的解决方案吗,还是存在一些缺点?
我知道在stackoverflow上有类似的问题,但没有人提出这样的解决方案,我也不确定我是否做对了。
在下面的树形示例中:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
我正在寻找 xxx 分支中的第一次提交 F。我认为可以通过以下方式实现:
git log xxx --not master
最后列出的提交应该是F。这是正确的解决方案吗,还是存在一些缺点?
我知道在stackoverflow上有类似的问题,但没有人提出这样的解决方案,我也不确定我是否做对了。
git log master..branch --oneline | tail -1
"branch"是你特定的分支名称。点点给出了该分支具有而主分支没有的所有提交记录。tail -1
从先前输出结果中返回最后一行。
branch
已删除,那么这只有在分支存在的情况下才有效。你应该如何操作? - oz123master
,只要你的分支没有被删除,git log <sha>..branch --oneline | tail -1
仍然可以给你想要的结果。 - ND Geek--reverse
参数来倒序阅读日志,并带有颜色等特性。 - Dominik你应该使用merge-base
功能,它专门设计用于解决这个问题:
git merge-base remotes/origin/<branch> develop
如果您的旧分支再次合并回主分支时没有得到预期的结果。我使用python脚本查找初始分支提交ID。
git rev-list --first-parent changeset
--first-parent仅在看到合并提交时跟随第一个父提交。
从上述命令迭代changeset,直到找到父分支。
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
git reflog | grep checkout | grep xxx | tail -1
head -n 1
而不是 tail -1
吗?tail -1
返回的是最新的提交而不是第一个。 - Nelu非常简单:您可以使用此方法直接获取功能分支中第一次提交的哈希值:
git log <source_branch>..<feature_branch> --pretty=format:%h
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
我尝试了这个命令,它有效:
git log <source_branch> <feature_branch> --oneline | tail -1