Есть ли быстрый способ "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:
- В Team Explorer → Ветки щелкните правой кнопкой мыши ветку и выберите " Просмотр истории"
![View History]()
- В элементе управления " История - ветка" выберите коммиты, которые вы хотите установить, и выберите " Сравнить коммиты"
![Compare Commits]()
Вы получаете хороший обзор diff, и вы можете открывать файлы в режиме сравнения.