Як я бачу різницю між філіями в git?


341

Я перебуваю на гілці X і додав ще пару комітетів. Я хочу побачити всі відмінності між MASTER та галуззю, на якій я перебуваю, з точки зору комітетів. Я міг би просто зробити

git checkout master
git log

а потім a

git checkout branch-X
git log

і це візуально відрізняється, але я сподіваюся на простіший, менш схильний до помилок метод.


Відповіді:


324

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

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X

13
Це не покаже вам відмінності між гілками, хоча саме про це запитують.
Пабло Фернандес на підборах

48
git log --oneline --graph --all --decorate --abbrev-commitдасть вам аналогічний вихід у коротшій / більш
читаній

4
Мені подобається це:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery

6
Надзвичайно складний.
Шон Еркхарт

12
git log --oneline --graph --all --decorateвистачає, --abbrev-commitне потрібно, --onelineє коротким--pretty=oneline --abbrev-commit
avmohan

721

Ви можете легко зробити це за допомогою

git log master..branch-X

Це покаже вам, що ви зобов’язуєтесь мати гілку-X, але master цього не робить.


9
Чи є варіант, якщо обидві гілки містять коміти, які інша ні? Зараз ви повинні перевернути аргументи і запустити його обома способами, щоб побачити, чи є комітети, які інша гілка не містить.
Забій Елліотта

38
Якщо ви вже перейшли на доступ branch-X, можете скористатисяgit log master..
Дейв,

8
@ElliottSlaughter: Якщо ви хочете знайти коміти, які знаходяться або в master або гілка-X, але не обидва, ви можете використовувати git log master...branch-X(три крапки замість двох). Див. Для man gitrevisionsотримання додаткової інформації.
Xavier T.

3
Це дійсно лише половина відповіді. Будь-які зобов’язання у господаря, які спричиняють розбіжність гілок, не з’являться
jterm

9
Якщо комірки були вибрані з вишні з гілки-X для керування, це не відфільтрує їх. Вони все ще будуть у списку комітетів "У відділенні-X, але не в master", хоча вони насправді є обома ..
Tuffwer

88

Я думаю, що це питання вибору та контексту. Я вважаю за краще використовувати

git log origin/master..origin/develop --oneline --no-merges

Він відображатиме коміти в розробці, які не знаходяться в головній галузі.

Якщо ви хочете побачити, які файли фактично модифіковані

git diff --stat origin/master..origin/develop --no-merges

Якщо не вказати аргументи, він відобразить повну різницю. Якщо ви хочете бачити візуальну різницю, встановіть meldна linux чи WinMergeна windows. Переконайтеся, що вони є дифтоулами за замовчуванням. Потім використовуйте щось на кшталт

git difftool -y origin/master..origin/develop --no-merges

Якщо ви хочете порівняти його з поточною галуззю. Зручніше використовувати HEAD замість назви гілки, як use:

git fetch
git log origin/master..HEAD --oneline --no-merges

Він покаже вам усі зобов'язання, які збираються об'єднати


1
Якщо ви порівняєте гілку випуску, яка може мати злиття. Можливо, ви хочете видалити --no-mergesgit log origin/master..HEAD --oneline --no-merges
комірки

15

Якщо ви працюєте в Linux, gitgце зробити так, щоб зробити це дуже швидко і графічно.

Якщо ви наполягаєте на командному рядку, ви можете використовувати:

git log --oneline --decorate

Щоб зробити git logприємніше за замовчуванням, я зазвичай встановлюю ці глобальні налаштування:

git config --global log.decorate true
git config --global log.abbrevCommit true

14

Я пропоную наступне, щоб побачити різницю "в комісіях". Для симетричної різниці повторіть команду із перевернутими аргументами:

git cherry -v master [your branch, or HEAD as default]

Чи відрізняється це від git master..branch-X?
ilmirons

2
Звичайно, "git cherry" розумний: він перекладається з "фіксує" на "патчі / розріз" і може уникнути повідомлення про "патч", який є на обох гілках, але застосовується в різному порядку.
mmaruska


4

Не ідеальна відповідь, але краще працює для людей, які використовують Github:

введіть тут опис зображення

Перейдіть до вашого репо: Insights -> Network


Крім того, створення запиту на виклик також покаже відмінності гілок.
pkamb

OMG Я хочу тебе обійняти.
esseara

@esseara Я теж великий прогрес :)) Ласкаво просимо: D
AIon

2

Якщо ви хочете порівняти на основі повідомлень про фіксацію, ви можете зробити наступне:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)

1
Замість використання --onelineта трубопроводів cutви можете використовуватиgit log --format='%s'
opticyclic

0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

Це сприяє тому, що воно дозволяє візуально відрізняти журнали a і b, якщо у вас є візуальний інструмент різниці. Замініть команду diff в кінці командою, щоб запустити візуальний інструмент diff.


0

Я використав деякі відповіді і знайшов одну, що відповідає моєму випадку (переконайтеся, що всі завдання знаходяться у відділенні випуску).

Інші методи також працюють, але я виявив, що вони можуть додавати рядки, які мені не потрібні, як об'єднання об'єднань, які не додають значення.

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

або ви можете порівняти свій поточний з головним

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch є, щоб переконатися, що ви використовуєте оновлену інформацію.

Таким чином, кожна фіксація буде в рядку, і ви можете скопіювати / вставити її в текстовий редактор і почати порівнювати завдання з комісіями, які будуть об'єднані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.