Как просмотреть git-pull без выполнения fetch?

204

Это вообще возможно?

По сути, есть удаленный репозиторий, из которого я извлекаю, используя просто:

git pull

Теперь я хотел бы просмотреть, что изменится эта тяга (разница), не касаясь чего-либо на моей стороне. Причина в том, что та вещь, которую я вытаскиваю, может не быть «хорошей», и я хочу, чтобы кто-то еще исправил ее, прежде чем сделать мой репозиторий «грязным».

Милан Бабушков
источник
4
Ваше редактирование странно. Выполнение «git fetch» ​​никоим образом не изменит ваше рабочее дерево, поэтому не имеет значения, если у вас есть незафиксированные локальные изменения. И неясно, какую часть выборки вы хотите отменить, поскольку она не касается вашего рабочего дерева.
dkagedal
Спасибо dkagedal, я написал это до того, как полностью понял, как работает Git. Я удалил это редактирование.
Милан Бабушков

Ответы:

234

Сделав a git fetch, выполните a, git log HEAD..origin/masterчтобы показать записи журнала между вашей последней общей фиксацией и главной веткой источника. Чтобы показать различия, используйте либо, git log -p HEAD..origin/masterчтобы показать каждый патч, или git diff HEAD...origin/master(три точки, а не две), чтобы показать один дифференциал.

Обычно нет необходимости отменять выборку, потому что выполнение выборки обновляет только удаленные ветви и ни одну из ваших ветвей. Если вы не готовы выполнить извлечение и объединение всех удаленных коммитов, вы можете использовать их git cherry-pickдля принятия только тех удаленных коммитов, которые вы хотите. Позже, когда вы будете готовы получить все, git pullв остальных коммитах слиться будет.

Обновление: я не совсем уверен, почему вы хотите избежать использования git fetch. Все, что делает git fetch - это обновляет вашу локальную копию удаленных веток. Эта локальная копия не имеет ничего общего ни с одной из ваших веток, и она не имеет ничего общего с незафиксированными локальными изменениями. Я слышал о людях, которые запускают git fetch на работе cron, потому что это так безопасно. (Я обычно не рекомендую делать это, хотя.)

Грег Хьюгилл
источник
Я предполагаю, что пропустил эту часть «ничего общего с МОИМИ ветвями», когда читал документы. Спасибо.
Милан Бабушков
1
По какой-то причине это не работает для меня. Я попробовал git diff HEAD ... origin / master, и он еще не перечислил никаких изменений, когда я делаю 'pull origin master', он выбирает и объединяет изменения. Это потому, что я настроил удаленный репозиторий с помощью git remote add?
screenm0nkey
@ screenm0nkey: я не знаю (не зная больше информации). Я рекомендую открыть новый вопрос, чтобы спросить об этом, если вы все еще не уверены.
Грег Хьюгилл
1
Что работает для меня (после git fetch): git log origin / master
slaman
2
git diff ...@{u}так же, как git diff HEAD...origin/masterесли бы origin / master был веткой вверх по течению
cambuncsive
47

Я думаю, что git fetch - это то, что вы ищете.

Он извлечет изменения и объекты, не фиксируя их в индексе вашего локального репо.

Позже их можно объединить с помощью git merge .

Man Page

Изменить: дальнейшее объяснение

Прямо из Git-SVN Crash Course ссылка

Теперь, как вы получаете новые изменения из удаленного хранилища? Вы получаете их:

git fetch http://host.xz/path/to/repo.git/ 

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

git log origin 

Вы также можете изменить изменения. Вы также можете использовать git log HEAD..origin, чтобы увидеть изменения, которых у вас нет в вашей ветке. Тогда, если вы хотите объединить их - просто выполните:

git merge origin

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

Чтение справочной страницы честно даст вам лучшее понимание вариантов и того, как их использовать.

Я просто пытаюсь сделать это с помощью примеров и памяти, в настоящее время у меня нет коробки для тестирования. Вы должны посмотреть на:

git log -p //log with diff

Выборка может быть отменена с помощью git reset --hard ( ссылка ), однако все незафиксированные изменения в вашем дереве будут потеряны, а также изменения, которые вы получили.

Брайан Джанфоркаро
источник
Если вы объясните две вещи, это может быть хорошо: 1. как мне отменить git-fetch? 2. Как я вижу разницу?
Милан Бабушков
1
1) удаление мерзавца? 2) git diff HEAD..origin
Крис Вест
Различия сделаны, как сказал Кристиан, выборка может быть отменена с помощью git reset --hard, однако все незафиксированные изменения в вашем дереве будут потеряны, а также изменения, которые вы получили.
Брайан Джанфоркаро
Вы ищете git reset --softили --mixed? Проверьте справочную страницу.
Аристотель Пагальцис
1
Если я правильно понял, тогда нет необходимости отменять «git fetch», потому что он не касается вашей рабочей копии, а также не вашего репозитория. "git fetch" хранит объекты и ссылки в .git / FETCH_HEAD
Торстен Ниехес
21

Вы можете извлечь из удаленного репо, увидеть различия, а затем вытащить или объединить.

Это пример для удаленного репо originи ветки, которая называется masterотслеживанием удаленного филиала origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
Антонио Бардацци
источник
8

Я создал собственный псевдоним git, чтобы сделать это для меня:

alias.changes=!git log --name-status HEAD..

с этим вы можете сделать это:

$git fetch
$git changes origin

Это даст вам хороший и простой способ предварительного просмотра изменений перед выполнением merge.

Матиас
источник
ты Бог. это должно происходить внутри самого
мерзавца
3

Я использую эти две команды и вижу файлы для изменения.

  1. Сначала выполняя git fetch , он выдает следующий результат (часть вывода):

    ...
    72f8433..c8af041 развивать -> происхождение / развитие
    ...

Эта операция дает нам два идентификатора фиксации, первый - старый, а второй - новый.

  1. Затем сравните эти два коммита, используя git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Эта команда выведет список файлов, которые будут обновлены:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Например, app / controller / xxxx.php и app / view / yyyy.php будут обновлены.

Сравнение двух коммитов с использованием git diff печатает все обновленные файлы с измененными строками, но с помощью grep он ищет и получает только строки, содержащие diff --git из вывода.

cowboycb
источник
3

Возможно, я опаздываю на вечеринку, но это то, что беспокоило меня слишком долго. По своему опыту я бы предпочел увидеть, какие изменения ожидают рассмотрения, чем обновить мою рабочую копию и разобраться с этими изменениями.

Это идет в ~/.gitconfigфайле:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Он выбирает текущую ветвь, затем выполняет различие между рабочей копией и этой извлеченной ветвью. Таким образом, вы должны видеть только изменения, которые придут с git pull.

Энди П
источник
1
Не могли бы вы поменять строку ref для HEAD..@{u}? Это проще, и не требует, чтобы удаленное имя называлось «origin» или чтобы ваша ветвь называлась так же, как и на удаленном.
Майкл - Где Клей Ширки
Это хорошо сделанный псевдоним, но я не уверен, почему вы хотите сделать это в первую очередь. Вам когда-нибудь придется иметь дело с изменениями, верно? Вы должны быть в состоянии отменить часть слияния, git pullесли вам не нравится то, что он делает ... поэтому я не уверен, каков вариант использования для этого.
Марнен Лайбоу-Козер
Я знаю, что в какой-то момент мне приходится иметь дело с изменениями, но, как я уже писал, иногда я не хочу. Я просто хочу знать, собирается ли что-то сломаться, и я должен зарезервировать еще немного времени для этого - или я могу просто сделать git pullпотом. Кроме того, я думаю, о чем был вопрос опа.
Энди П
-1

Если вы не хотите, чтобы git-fetch обновлял ваш локальный .git, просто скопируйте ваше локальное хранилище в временный каталог и сделайте там попытку. Вот короткая рука:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Напр .:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
AX Labs
источник
'gtp' должен быть выполнен в корне локального репозитория, где находится .git.
AX Labs
-2

Как насчет клонирования репозитория в другом месте и выполнения git log как на реальной кассе, так и на свежем клоне, чтобы увидеть, получили ли вы то же самое?

Эд Гринберг
источник
Локальная копия лучше отражает состояние, чем другой клон. Смотрите мой главный пост для деталей .
AX Labs