Как я вижу различия коммитов между ветками в git?


341

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

git checkout master
git log

а затем

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даст вам аналогичный вывод в более короткой / более читаемой команде
Пабло Фернандес heelhook

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

722

Вы можете легко сделать это с

git log master..branch-X

Это покажет вам коммиты, которые есть у Branch-X, а у мастера нет.


9
Есть ли вариант, если обе ветви содержат коммиты, которых нет в другой? Прямо сейчас вам нужно перебросить аргументы и запустить их в обоих направлениях, чтобы увидеть коммиты, которые не содержит другая ветка.
Эллиотт Слотер

38
Если вы уже переключились на, branch-Xвы можете использоватьgit log master..
Dave

8
@ElliottSlaughter: Если вы хотите найти коммит, который находится либо в master, либо в branch-X, но не в обоих, вы можете использовать git log master...branch-X(три точки вместо двух). Смотрите man gitrevisionsдля получения дополнительной информации.
Ксавье Т.

3
Это действительно только половина ответа. Любые коммиты в master, которые приводят к расхождению ветвей, не будут отображаться
jterm

9
Если коммиты были отобраны из ветки X для мастеринга, это не отфильтровывает их. Они по-прежнему будут в списке коммитов "В ветке-X, но не в мастере", даже если они фактически есть в обоих ..
Tuffwer

88

Я думаю, что это вопрос выбора и контекста. Я предпочитаю использовать

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

Он покажет коммиты в разработке, которые не находятся в основной ветке.

Если вы хотите увидеть, какие файлы действительно изменены, используйте

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

Если вы не укажете аргументы, он будет отображать полную разницу. Если вы хотите увидеть визуальные различия, установите их meldна Linux или WinMergeWindows. Убедитесь, что они являются difftools по умолчанию. Затем используйте что-то вроде

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

В случае, если вы хотите сравнить его с текущей веткой. Удобнее использовать HEAD вместо имени ветки, как use:

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

Он покажет вам все коммиты, которые собираются объединить


1
Если вы сравните ветку релиза, у которой могут быть слияния. Вы можете удалить коммиты слияния (которые не добавляют никакой ценности) с помощью параметра, --no-mergesнапример:git log origin/master..HEAD --oneline --no-merges
claudiu.f.marginean

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» умный: он переводит из «коммитов» в «патчи / различия» и может избежать сообщения о «патче», который есть на обеих ветвях, но применяется в другом порядке.
Ммаруска

8

если вы хотите использовать gitk:

gitk master..branch-X

у этого есть хороший старый школьный графический интерфейс


4

Не идеальный ответ, но лучше работает для людей, использующих Github:

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

Перейти к вашему репо: Insights -> Network


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

OMG Я хочу обнять тебя.
Esseara

@esseara Я тоже большой любитель :)) Добро пожаловать: D
11

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 в конце командой, чтобы запустить визуальный инструмент сравнения.


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.