149 votes

Git - comment trouver le premier commit d'une branche spécifique

Dans l'exemple suivant, l'arbre :

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

Je cherche F - le premier commit de la branche xxx. Je pense que c'est possible avec :

git log xxx --not master

et le dernier commit listé devrait être F. Est-ce une solution correcte ou y a-t-il des inconvénients ?

Je sais qu'il y avait des questions similaires sur stackoverflow, mais personne n'a proposé une telle solution, et je ne suis pas sûr de le faire correctement.

172voto

Chase T. Points 915
git log master..branch --oneline | tail -1

Où "branch" est le nom de votre branche spécifique. Le point vous donne tous les commits que la branche a et que master n'a pas. tail -1 retourne la dernière ligne de la sortie précédente.

25voto

Nelu Malancea Points 388
git cherry master -v | head -n 1

cherry - Affiche les commits sur votre branche actuelle qui ne sont pas présents sur une branche en amont ( docs ). Un site en amont (master dans ce cas) est un point à partir duquel votre branche actuelle dérive.

-v - Affiche les noms de commit (au lieu de juste les SHA) - verbeux.

head - Commande Unix qui imprime n nombre de lignes d'un texte

14voto

Fabrizio Stellato Points 565

Vous devez utiliser le merge-base qui est conçue pour résoudre exactement ce problème :

git merge-base remotes/origin/<branch> develop

2voto

Nayagam Points 712

Si votre branche (ancienne) une fois de plus fusionnée vers master ne donne pas le résultat attendu, j'ai utilisé python script pour trouver l'Id de commit de la branche initiale.

git rev-list --first-parent changeset

-premier parent ne suit que le premier commit parent lorsqu'il voit un commit de fusion.

Itérer les changeset de la commande ci-dessus jusqu'à ce que la branche parent soit trouvée.

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)

1voto

Doc Unid Points 11
git cherry master -v | tail -1   

Cependant, cela ne vous donnera que le premier commit sur la branche xxx qui n'est pas dans master, et non le premier commit sur la branche xxx. Ce dernier sera difficile si la branche xxx a été supprimée et/ou recréée une ou plusieurs fois. dans ce cas, vous pouvez essayer ce qui suit :

git reflog | grep checkout | grep xxx | tail -1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X