Je cherchais la même chose, et j'ai trouvé cette question. Merci pour la poser!
Cependant, j'ai trouvé que les réponses que je vois ici ne semblent pas tout à fait donner la réponse que vous avez demandé (ou que je cherchais) -- ils semblent donner de l' G
s'engager, au lieu de l' A
commettre.
Donc, j'ai créé l'arbre suivant (lettres attribuées dans l'ordre chronologique), j'ai donc pu tester des choses:
A - B - D - F - G <- "master" branch (at G)
\ \ /
C - E --' <- "topic" branch (still at E)
Cela ressemble un peu différente de la vôtre, car je voulais m'assurer que j'ai eu (en se référant à ce graphique, pas le vôtre) B, mais pas Un (et non pas D ou E). Voici les lettres attachées à SHA, des préfixes et des messages de commit (mon repo peut être cloné à partir d' ici, si c'est intéressant pour quelqu'un):
G: a9546a2 merge from topic back to master
F: e7c863d commit on master after master was merged to topic
E: 648ca35 merging master onto topic
D: 37ad159 post-branch commit on master
C: 132ee2a first commit on topic branch
B: 6aafd7f second commit on master before branching
A: 4112403 initial commit on master
Donc, le but: trouver B. Voici trois façons que j'ai trouvé, après un peu de bricolage:
1. visuellement, avec gitk:
Vous devriez voir une arborescence comme ceci (vu de master):
ou ici (vu de sujet):
dans les deux cas, j'ai choisi la livraison c'est - B
sur mon graphique. Une fois que vous cliquez sur elle, de son plein SHA est présenté dans un champ de saisie de texte juste en dessous du graphique.
2. visuellement, mais à partir du terminal:
git log --graph --oneline --all
ce qui montre (en supposant git config --global color.ui auto
):
Ou, dans le texte de droite:
* a9546a2 de fusion de sujet de retour à la maîtrise de
|\
| * 648ca35 la fusion de master sur le sujet
| |\
| * | 132ee2a premier commit sur le sujet de la branche
* | | e7c863d s'engager sur le master après master a été fusionnée à la rubrique
| |/
|/|
* | 37ad159 post-direction de s'engager sur le maître
|/
* 6aafd7f deuxième s'engager sur le maître, avant de s'orienter
* 4112403 initiale s'engager sur le maître
dans les deux cas, nous voyons la 6aafd7f commettre le plus bas point commun, c'est à dire B
sur mon graphique, ou A
dans le vôtre.
3. Avec la coque de la magie:
Vous ne précisez pas dans votre question si vous vouliez quelque chose comme ci-dessus, ou d'une seule commande que vais juste vous obtenir une révision, et rien d'autre. Eh bien, voici la dernière:
diff -u <(git rev-list --first-parent topic) \
<(git rev-list --first-parent master) | \
sed -ne 's/^ //p' | head -1
6aafd7ff98017c816033df18395c5c1e7829960d
Qui vous pouvez aussi mettre dans votre ~/.gitconfig comme (note: les dash est important; merci Brian pour attirer l'attention):
[alias]
oldest-ancestor = !zsh -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' -
Ce qui pourrait être fait par la suite (alambiquée citations) de ligne de commande:
git config --global alias.oldest-ancestor '!zsh -c '\''diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne "s/^ //p" | head -1'\'' -'
Remarque: zsh
pourrait tout aussi bien avoir été bash
, mais sh
aura pas de travail -- <()
syntaxe n'existe pas dans la vanille sh
. (Merci encore, @conny, pour me mettre au courant de il dans un commentaire sur une autre réponse sur cette page!)
Remarque: version Alternative de la ci-dessus:
Grâce à liori pour souligner que le ci-dessus pourrait tomber lors de la comparaison des branches identiques, et à venir avec une autre diff forme qui supprime le sed forme à partir de la combinaison, et fait de ce "plus sûr" (c'est à dire qu'il renvoie un résultat (à savoir, les plus récentes s'engager), même lorsque vous comparez maître de master):
Comme une .git-config ligne:
[alias]
oldest-ancestor = !zsh -c 'diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1' -
À partir du shell:
git config --global alias.oldest-ancestor '!zsh -c '\''diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1'\'' -'
Donc, dans mon test de l'arbre (qui a été indisponible pendant un certain temps, désolé; il est de retour), qui travaille maintenant à la fois le maître et le sujet (donner commet G et B, respectivement). Merci encore, liori, pour l'autre forme.
Donc, c'est ce que j' [et liori] est venu avec. Il semble fonctionner pour moi. Il permet également un supplément de couple d'alias qui peut s'avérer pratique:
git config --global alias.branchdiff '!sh -c "git diff `git oldest-ancestor`.."'
git config --global alias.branchlog '!sh -c "git log `git oldest-ancestor`.."'
Heureux git-ing!