在以下示例树中:
A-B-C-D-E (master branch) \ F-G-H (xxx branch)
我正在寻找F -xxx分支中的第一个提交。我认为这是可能的:
git log xxx --not master
最后列出的提交应该是F。这是正确的解决方案还是可能有一些缺点?我知道在stackoverflow上也有类似的问题,但是没有人提出这样的解决方案,我也不确定我是否做对了。
pdkcd3nj1#
git log master..branch --oneline | tail -1
其中“分支”是你指定的分支名称。点-点给出了该分支拥有而master没有的所有提交。tail -1返回上一个输出的最后一行。
tail -1
yptwkmov2#
git cherry master -v | head -n 1
cherry-显示当前分支上不存在于上游分支(docs)上的提交。upstream(本例中为master)是当前分支的派生点。-v-显示提交名称(而不仅仅是SHA)- verbose。head- Unix命令,用于从文本中打印n行数
cherry
-v
head
n
soat7uwm3#
您应该使用merge-base功能,该功能旨在解决以下问题:
merge-base
git merge-base remotes/origin/<branch> develop
7ajki6be4#
如果你的分支(旧的)再次合并回主不给予预期的结果。我已经使用Python脚本找到初始分支提交Id。
git修订列表--第一个父变更集
从上述命令迭代变更集,直到找到父分支为止
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)
col17t5w5#
git cherry master -v | tail -1
然而,这只会给予你第一次提交在分支xxx上,它不在master中,而不是第一次提交在分支xxx上。如果分支xxx已被删除和/或重新创建一次或多次,后者将是困难的。在这种情况下,你可以尝试以下操作:
git reflog | grep checkout | grep xxx | tail -1
neekobn86#
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
umuewwlo7#
您也可以使用它来直接获取特性分支中第一次提交的哈希值:
git log <source_branch>..<feature_branch> --pretty=format:%h
ykejflvf8#
我尝试了以下命令,它成功了:
git log <source_branch> <feature_branch> --oneline | tail -1
8条答案
按热度按时间pdkcd3nj1#
其中“分支”是你指定的分支名称。点-点给出了该分支拥有而master没有的所有提交。
tail -1
返回上一个输出的最后一行。yptwkmov2#
cherry
-显示当前分支上不存在于上游分支(docs)上的提交。upstream(本例中为master)是当前分支的派生点。-v
-显示提交名称(而不仅仅是SHA)- verbose。head
- Unix命令,用于从文本中打印n
行数soat7uwm3#
您应该使用
merge-base
功能,该功能旨在解决以下问题:7ajki6be4#
如果你的分支(旧的)再次合并回主不给予预期的结果。我已经使用Python脚本找到初始分支提交Id。
git修订列表--第一个父变更集
从上述命令迭代变更集,直到找到父分支为止
col17t5w5#
然而,这只会给予你第一次提交在分支xxx上,它不在master中,而不是第一次提交在分支xxx上。如果分支xxx已被删除和/或重新创建一次或多次,后者将是困难的。在这种情况下,你可以尝试以下操作:
neekobn86#
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
umuewwlo7#
您也可以使用它来直接获取特性分支中第一次提交的哈希值:
ykejflvf8#
我尝试了以下命令,它成功了: