Як отримати історію фіксації лише для однієї галузі?


128

Скажімо, я створив нову філію my_experimentз masterі зробив кілька комісій для my_experiment. Якщо я виконую цей git logчас my_experiment, я бачу комісії, зроблені для цієї гілки, але також і зобов’язання, зроблені до masterстворення my_experimentsфілії.

Я вважаю дуже корисним бачити історію всіх фільмів для my_experimentsфілії, поки вона не вплине на створення цієї гілки - фактично справжню історію саме цієї гілки. Інакше, коли я переглядаю журнал, не зрозуміло, чи були комісії на my_experimentsгілці чи ні.

Чи є спосіб це зробити з Git?

Відповіді:


139

Для цього можна використовувати діапазон .

git log master..

Якщо ви перевірили своє my_experimentвідділення. Це дозволить порівняти, де masterзнаходиться на HEAD(вістря my_experiment).


3
Ок говорив занадто рано. Це було зроблено для мого простого прикладу. Але тепер я дивлюся на чужу реальну репо і мені здається, що для правильного використання цієї команди мені потрібно знати, з якої гілки створена моя поточна гілка. Можливо, я мав би змогу сказати це з gitk, але мені це не очевидно. Будь-які думки?
Marplesoft

@Marplesoft Визначити це може бути складно. Дивіться це питання .
alex

Не могли б ви пояснити коротко, як це працює? Що git log master..говорить Git?
tonix

2
@tonix Перейдіть за посиланням у відповіді, щоб отримати докладнішу інформацію про те, як працює діапазон ( master..частина).
алекс

7

git merge-baseКоманда може бути використана для пошуку спільного предка. Отже, якщо мій_експеримент ще не був об’єднаний у головний, а мій_експеримент був створений з майстра, ви могли:

git log --oneline `git merge-base my_experiment master`..my_experiment

Якщо ви хочете включити батьків свого першого зобов’язання, додайте ^ та - перший батько : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Ерік Лавоє

7

Примітка. Якщо ви обмежите цей журнал останньою n коміттю (наприклад, останні 3 коміти, наприклад, git log -3), обов'язково поставте пробіл між 'n' та вашою гілкою:

git log -3 master..

Перед Git 2.1 (серпень 2014 року) ця помилка: git log -3master..насправді показала б вам останні 3 коміти поточної гілки (тут my_experiment), ігноруючи masterліміт (тобто якщо my_experimentміститься лише одна фіксація, 3 все ще будуть перелічені, 2 з них master)

Див фіксації e3fa568 з допомогою Junio C Hamano ( gitster) :

редакція: git log -<count>більш уважно розбирати " "

Цей неправильно введений командний рядок просто ігнорує " master" і в кінцевому підсумку показує два коміти з поточного HEAD:

$ git log -2master

тому що ми подаємо " 2master", atoi()не переконуючись, що весь рядок розбирається як ціле число.

Використовуйте strtol_i()замість нього функцію помічника.


1

Можна використовувати тільки git log --oneline


Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
DebanjanB

1

Я думаю, що варіант для ваших цілей є git log --online --decorate. Це дає вам змогу дізнатись про перевірену фіксацію, а верхнє зобов’язання - для кожної гілки, яка є у вашому сюжетному рядку. Роблячи це, ви маєте прекрасний погляд на структуру репортажу та комісії, пов'язані з певною галуззю. Я думаю, читання цього може допомогти.


0

Я знаю, що для цього дуже пізно ... Але ось (не настільки просто) oneliner, щоб отримати те, що ви шукали:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Ми перераховуємо комісії з назвою філії та відносними позиціями до фактичних станів філії git show-branch(надсилаючи попередження /dev/null)
  • Тоді ми залишаємо лише тих, хто назва нашої гілки всередині дужки grep -E "\[$BRANCH_NAME".
  • Там, де фактично $BRANCH_NAMEвиходить з git branch | grep -E '^\*' | awk '{ printf $2 }'(гілка зіркою, відлунюється без тієї зірки).
  • З наших результатів ми видаляємо зайвий рядок на початку з tail -n+2.
  • І потім, ми fianlly очистити вихід, видаляючи весь попередній [$BRANCH_NAME]з sed -E "s/^[^\[]*?\[/[/".
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.