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


152

Ось два різні питання, але я думаю, що вони пов'язані.

  1. Як користуватися Git, як я можу знайти, які зміни я здійснив локально, але ще не перейшов до віддаленої гілки? Я шукаю щось подібне до команди Меркуріалу hg outgoing.

  2. Як користуватися Git, як я можу дізнатися, які зміни має віддалена гілка перед тим, як здійснити тягнення? Я шукаю щось подібне до команди Меркуріалу hg incoming.

По-друге: чи є спосіб побачити наявне, а потім виберіть зміни, які я хочу здійснити?


11
Дивлячись на відповіді, схоже, існує деяка плутанина щодо того, що hg incomingі hg outgoingнасправді робити. Найближчий еквівалент Git - це --dry-runваріант. Просто git pull --dry-runви побачите список усіх речей, які мають відбутися.
Роман Старков

Відповіді:


97

Git не може надсилати таку інформацію через мережу, як Hg. Але ти можеш бігати git fetch(що більше схоже на hg pullніжhg fetch ) , щоб отримувати нові коммітов з віддалених серверів.

Отже, якщо у вас є гілка, яка називається, masterі віддалена origin, після запуску git fetch, ви також повинні мати гілку, яка називається origin/master. Тоді ви можете отримати git logвсі ці зобов'язанняmaster повинні бути суперсети origin/master, виконуючи ці дії git log master..origin/master. Переверніть ці два, щоб отримати протилежне.

Мій друг Девід Доллар створив пару скриптів git shell для імітації hg incoming/outgoing. Ви можете знайти їх на веб- сайті http://github.com/ddollar/git-utils .


113

Починаючи з Git 1.7.0, існує спеціальний синтаксис, який дозволяє генерувати посилання на верхню гілку: @{u}або@{upstream} .

Для імітації hg incoming:

git log ..@{u}

Для імітації hg outgoing:

git log @{u}..

Я використовую наступне incomingі outgoingпсевдоніми , щоб зробити більш простіше у використанні:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u} дає мені ці помилки. (У мене в конфігурації git є і походження, і сховище вище за течією). помилка: для "" помилки: для ".. помилки: не знайдено гілки вгору за течією: помилки: Не знайдено гілки вище за течією для" .. "фатально: неоднозначний аргумент" @ @ u u ' робоче дерево. Використовуйте "-", щоб відокремити шляхи від модифікацій
Генрік

6
Ви отримаєте ці помилки, якщо ваша локальна філія не налаштована з висхідним потоком. Щоб виправити, запустіть git branch --set-upstream foo origin/foo.
Річард Хансен

git log @{u}..перераховує кожну зміну репо для мене. Немає способів, поки вони ще не існують.
Роман Старков

@romkyns: Можливо, ваша локальна гілка має неправильну віддалену гілку, налаштовану як висхідна. Переконайтеся, що git rev-parse --symbolic-full-name @{u}друкує відповідне віддалене посилання. Також git log @{u}..показує комітети, недоступні гілкою вище за потоком, які можуть включати коміти, які вже є у віддаленому сховищі (якщо вони доступні за іншою посиланням). Це станеться відразу після того, як ви об’єднаєтесь у вже натиснуту гілку.
Річард Хансен

@ RichardHansen Я боюся, що я занадто нуб, щоб знати, що було б підходящим для віддаленої посилання, однак це було свіжо клоноване репо, на якому я робив лише checkout <somebranch>а merge <otherbranch>. У цей момент я зробив це log @{u}..і побачив усі перелічені зміни.
Роман Старков

42

Не повна відповідь, але git fetch потягне віддалене репо і не зробить злиття. Потім ви можете зробити

git diff master origin / master


1
Працював для мене (але навпаки) -git diff origin/master master
Нік Грілі

34
  1. Використовуйте "походження журналу git..HEAD"

  2. Використовуйте "git fetch", а потім "git log HEAD..origin". Ви можете вибирати окремі комісії, використовуючи перелічені ідентифікатори комісій.

Вищенаведене передбачає, звичайно, що "походження" - це назва вашої віддаленої гілки відстеження (що це, якщо ви використовували клон із параметрами за замовчуванням).


3
(А якщо ви не відстежуєте віддалену гілку, це "git log origin / master..HEAD".)
plindberg

4
"походження" - це не назва гілки віддаленого відстеження, це назва віддаленого. І лише вказати віддалене ім’я не працює, ви повинні вказати гілку віддаленого відстеження, яка була б походженням / головним.
Робінст

22

Існує також це, для порівняння всіх галузей:

git log --branches --not --remotes=origin

Про це говорить сторінка man git log:

Показує всі комітети, які є в будь-якій з місцевих гілок, але не в будь-якій з віддалених гілок відстеження за походженням (те, що у вас є, воно не має).

Сказане для outgoing. Бо incomingпросто поміняйте місцями:

git log --remotes=origin --not --branches

8

Я б робив

$ git fetch --dry-run

за hg incomingі

$ git push --dry-run

для hg outgoing.


Вибачте, я не помітив, що це вже було сказано як коментар до ОП.
chris

1

git-out - це сценарій, який імітується hg outgoingдосить точно. Він аналізує вихід "push -n", тому він дає точний вихід, якщо вам потрібно вказати додаткові аргументи для натискання.


0

git вхідний

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git outgoing

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

Коли відповіді "журналу git" та @ {u} спочатку дали мені помилки "невідомої редакції", я випробував пропозицію Кріса / Ромкінса про git push --dry-run .

Ви отримаєте висновок типу "5905..4878 master-> master". 5905 - остання комісія, яку віддалений та здійснює через (включаючи) 4878 буде застосована до віддаленого.

Потім ви можете використовувати 5905..4878 як аргументи для кількох інших команд git, щоб отримати детальну інформацію:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

Коли ви робите git fetch, весь вміст, включаючи гілки, теги (refs), тимчасово зберігається у .git / FETCH_HEAD, вміст якого можна переглядати за допомогою команди: git log FETCH_HEAD Якщо ви не використовуєте суфікс -a з git fetch, то за замовчуванням , Вміст FETCH_HEAD буде замінено новим вмістом. З цього вмісту ви можете переглядати та вирішувати, до якої гілки ви хочете їх об'єднати, якщо ви це робите, чи ви можете просто вибирати вишню, якщо ви хочете лише кілька комісій з того, що було принесено результатом.

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