2015-04-22 3 views
15

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

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

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

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

... если только не существует способа сделать это. У кого-нибудь есть ответ?

+1

вы хотите отличить от своей mergebase восходящего потока, используйте синтаксис @ {u} и тройной точки. Попробуйте 'git diff @ {u} ... HEAD' –

+0

http://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git, lindes answer. вам могут быть интересны и другие ответы. –

ответ

13

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

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

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

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

+1

@ {u} является восходящим. Однако у меня не всегда есть восходящий поток ... – user776686

+0

@ нутон хорошо, он работает с любыми двумя коммитами ... – o11c

+0

@ o11c где указать название ветки с вашим решением? – jangorecki

14

Вы можете найти ответвление с использованием 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 documentation.

4

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

git diff (start point)... 

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

Например, если вы работаете на художественном отделении разветвленного от develop, вы можете использовать:

git diff develop... 

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

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

0

Для отличий вы хотите трехточечную нотацию. Если ветвь называется 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 

является вся история отрасли минус за всю историю мастера. Другими словами, просто ветка.

Смежные вопросы