可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
In following example tree:
A-B-C-D-E (master branch) \ F-G-H (xxx branch)
I'm looking for F - the first commit in xxx branch. I think that it is possible with:
git log xxx --not master
and the last listed commit should be F. Is it correct solution or maybe there are some disadvantages of it?
I know that there were similar questions on stackoverflow, but nobody proposed such solution, and I'm not sure if I do it right.
回答1:
git log master..branch --oneline | tail -1
dot-dot gives you all of the commits that the branch has that master doesn't have. tail -1 returns the last line from the previous output.
回答2:
You should use the merge-base functionality which is designed to solve exactly this:
git merge-base remotes/origin/ develop
回答3:
If your branch (old one) once again merged back to master doesn't give expected result.I have using python script to find initial branch commit Id.
git rev-list --first-parent changeset
--first-parent follow only the first parent commit upon seeing a merge commit.
Iterate changeset's from above command until parent branch found.
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)
回答4:
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1