在以下示例树中:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
我正在寻找 F - xxx 分支中的第一个提交。我认为有可能:
git log xxx --not master
最后列出的提交应该是 F。它是正确的解决方案还是它有一些缺点?
我知道在stackoverflow上有类似的问题,但没有人提出这样的解决方案,我不确定我是否做得对。
在以下示例树中:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
我正在寻找 F - xxx 分支中的第一个提交。我认为有可能:
git log xxx --not master
最后列出的提交应该是 F。它是正确的解决方案还是它有一些缺点?
我知道在stackoverflow上有类似的问题,但没有人提出这样的解决方案,我不确定我是否做得对。
git log master..branch --oneline | tail -1
其中“分支”是您的特定分支名称。dot-dot 为您提供了分支拥有而 master 没有的所有提交。tail -1
返回上一个输出的最后一行。
您应该使用merge-base
旨在解决此问题的功能:
git merge-base remotes/origin/<branch> develop
如果您的分支(旧分支)再次合并回 master 并没有给出预期的结果。我使用 python 脚本来查找初始分支提交 ID。
git rev-list --first-parent 变更集
--first-parent在看到合并提交时仅关注第一个父提交。
从上面的命令迭代变更集,直到找到父分支。
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 rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
我尝试了这个命令并且它有效:
git log <source_branch> <feature_branch> --oneline | tail -1
你可以在当前分支上 git first commit
git log --oneline |tail -1
如果你想 git 首先提交另一个分支
git log branch_name --oneline |tail -1