Есть ли быстрый способ "git diff" от источника точки или ветки?

Я рассмотрел различные ответы SO при использовании git diff и git ревизий (HEAD, ORIG_HEAD, FETCH_HEAD и т.д.), и я до сих пор не нашел простого способа перечислить изменения, которые были сделаны с самого начала локального ветки или с момента последней перезагрузки.

Легко я подразумеваю, что вам не нужно искать и вставлять фиксацию SHA или подсчитывать, сколько коммитов я хочу оглянуться назад.

git diff origin/master близок, но он относится к удаленному, который, возможно, расходился с тех пор, как я проверил от него новую ветку.

Я ожидаю, что будет доступно что-то вроде git diff BASE_HEAD.

... если уже нет способа сделать это. Кто-нибудь имеет ответ?

Ответы

Ответ 1

Используйте git diff @{u}...HEAD с тремя точками.

С двумя точками или с HEAD пропущено, он будет показывать различия от изменений с обеих сторон.

С тремя точками он будет показывать только различия с изменениями на вашей стороне.

Изменить: для людей с немного разными потребностями вы можете быть заинтересованы в git merge-base (обратите внимание, что у него есть больше возможностей, чем использует другой ответ).

Ответ 2

Вы можете найти точку перехода с помощью git merge-base. Рассмотрим master основную строку и dev ветвь, история которой вам интересна. Чтобы найти точку, в которой dev была разветвлена ​​от master, запустите:

git merge-base --fork-point master dev

Теперь мы можем дифференцировать dev на этот базис:

git diff $(git merge-base --fork-point master dev)..dev

Если dev - текущая ветвь, это упрощает:

git diff $(git merge-base --fork-point master)

Для получения дополнительной информации см. документацию git-merge-base.

Ответ 3

Вы можете разделить текущую ветку с начальной точкой ветки, используя:

git diff (start point)...

Где (начальная точка) - имя ветки, идентификатор фиксации или тег.

Например, если вы работаете с ветвью функций, разветвленной с develop, вы можете использовать:

git diff develop...

для всех изменений в текущей ветке с точки ветвления.

Это уже упоминалось в комментарии, но я думаю, что он заслуживает статуса ответа. Я не знаю, что он будет делать после последней перезагрузки.

Ответ 4

Для diffs вам нужна трехточечная нотация. Если ваша ветка называется dev и она разветвлена от master:

% git diff master...dev

Для журнала требуется двухточечная запись:

% git log master..dev

Синтаксис ревизии r1..r2 (с двумя точками) означает "все доступное из r2 (включительно), но недоступное от r1 (включительно)". Обычный способ использовать это - думать о r1 и r2 как о задании диапазона в последовательности коммитов (r1 exclusive, r2 включительно), поэтому, если у вас есть 10 версий, 3..7 покажут вам изменения 4, 5, 6, и 7. Это {1, 2, 3, 4, 5, 6, 7} минус {1, 2, 3}. Но r1 не обязательно должен быть предком r2. Подумайте об этом скорее как операция набора, где r1 представляет всю родословную от r1 назад, а r2 представляет всю родословную от r2 назад, и вы вычитаете первый набор из второго набора.

Итак, тогда:

git log master..dev

это вся история отрасли за вычетом всей истории мастера. Другими словами, просто ветка.

Ответ 5

В Visual Studio 2017 есть удобный способ показать diffs:

  1. В Team Explorer → Ветки щелкните правой кнопкой мыши ветку и выберите " Просмотр истории"

View History

  1. В элементе управления " История - ветка" выберите коммиты, которые вы хотите установить, и выберите " Сравнить коммиты"

Compare Commits

Вы получаете хороший обзор diff, и вы можете открывать файлы в режиме сравнения.