Support I create multiple branches (aaa, bbb, ccc) from a commit. Then, I create a new branch (ffffd) from one of the branch (bbb) and a make a commit on it.
Then I p
It is indeed impossible in general. Git records only1 the single commit-ID (SHA-1) to which a reference name (such as a branch or tag) points. The history of that commit is determined solely by that commit's parent IDs, which do not record branch-names. When you push to a remote, your "push" operation sends the SHA-1 of the commit you're pushing (plus more SHA-1s for any other linked objects—trees and files, parent commits, etc—plus the contents of all those objects, as needed based on what's missing on the remote), and asks the remote to set its branch to point to the new SHA-1.
In other words, you tell the remote: "here, have commit 1234567, and set branch label ffffd
= 1234567". It may tell you "to do that I need five other commits", one of which you have labeled as bbb
, but if you don't tell the remote "oh by the way set label bbb
to this other commit too" then it won't have that information anywhere.
1This is a bit of an overstatement: git also records, in the reflog, each SHA-1 that is stored in a label, including branch labels. It is therefore possible to walk back through the label's history to "figure out where it started". There are two limits on this though: reflogs are purely local, never transmitted by fetch or push; and reflogs expire, generally after 90 days in these cases (although this is configurable and there are additional complexities). So as long as we say there's a push step, or allow more than 3 months to pass, there's no way to tell.
Branches are nothing more than pointers to a specific commit. You can only see from which commit ffffd
was branched from, not which branch.
add those two functions to your .bashrc:
function newbranch() {
history_file=".git/branching_history"
from=`git rev-parse --abbrev-ref HEAD`
to=$1
git checkout -b $1 > /dev/null 2>&1
DATE=`date '+%Y-%m-%d %H:%M:%S'`
echo "$DATE: from $from created branch $1" >> $history_file
}
function branchinghistory() {
cat .git/branching_history
}
then when you create a new branch, don't run git checkout -b mybranch
but do:
newbranch mybranch
this will store your branching log in .git/branching_history
file. You can check the log with:
branchinghistory
the output should be:
2020-04-22 23:59:06: from master created branch mybranch
Branches are simply pointers to commits. Because of this, it is not possible to see where a branch originated from, other than observing that two branches have an identical history up to some point.
For someone upstream, it is not relevant where a branch originated from, only that it contains a certain commit (or sequence of commits). This determines how/if git is able to fast-forward or merge branches together.