Як попередньо переглянути git-pull, не роблячи отримання?


204

Чи можливо це навіть?

В основному, є віддалене сховище, з якого я просто використовую:

git pull

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


4
Ваша редакція дивна. Здійснення "git fetch" жодним чином не змінює ваше робоче дерево, тому не має значення, чи є у вас незаперечні локальні зміни. І незрозуміло, яку частину збірки ви хочете скасувати, оскільки вона не стосується вашого робочого дерева.
dkagedal

Дякую dkagedal, я написав це ще до того, як повністю зрозумів, як працює Git. Я видалив цю редакцію.
Мілан Бабушків

Відповіді:


233

Після цього git fetchвиконайте git log HEAD..origin/masterкоманду a, щоб показати записи журналу між останньою спільною командою та основною гілкою походження. Щоб показати відмінності, використовуйте або git log -p HEAD..origin/masterдля показу кожного виправлення, або git diff HEAD...origin/master(три крапки не дві), щоб показати єдину диференцію.

Звичайно не потрібно скасовувати дію, тому що виконуючи завантаження, оновлюються лише віддалені гілки та жодна з ваших гілок. Якщо ви не готові виконувати тягнення та злиття у всіх віддалених комісіях, ви можете git cherry-pickприймати лише певні віддалені зобов’язання. Пізніше, коли ви будете готові отримати все, git pullдо решти комісій об’єднається заповіт.

Оновлення: Я не зовсім впевнений, чому ви хочете уникати використання git fetch. Все, що потрібно отримати, - це оновити локальну копію віддалених гілок. Ця локальна копія не має нічого спільного з будь-якою з ваших гілок, і вона не має нічого спільного з непосланими локальними змінами. Я чув про людей, які керують git fetch на роботі з кроном, бо це так безпечно. (Я б звичайно не рекомендував цього робити.)


Я думаю, я пропустив цю частину "нічого спільного з моїми гілками", читаючи документи. Дякую.
Мілан Бабушків

1
Чомусь це не працює для мене. Я спробував git diff HEAD ... origin / master, і він не перераховував жодних змін, коли я роблю 'master master origin', він отримує і об'єднує зміни. Це тому, що я налаштовував віддалений сховище за допомогою git remote add?
screenm0nkey

@ screenm0nkey: Я не знаю (не знаючи більше інформації). Рекомендую відкрити нове питання, щоб задати це питання, якщо ви все ще не впевнені.
Грег Хьюгілл

1
Що для мене працює (після отримання git fetch): git log origin / master
slaman

2
git diff ...@{u}це те саме, що git diff HEAD...origin/masterякщо походження / господар є гілкою вгору за течією
камбунфекційний

47

Я думаю, що git fetch - це те, що ти шукаєш.

Він буде тягнути зміни та об'єкти, не привласнюючи їх до індексу місцевого репо.

Пізніше вони можуть бути об'єднані з git merge .

Сторінка людини

Редагувати: Подальше пояснення

Прямо від посилання на курс Git-SVN Crash

Тепер, як отримати нові зміни з віддаленого сховища? Ви отримуєте їх:

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

На даний момент вони знаходяться у вашому сховищі, і ви можете вивчити їх за допомогою:

git log origin 

Ви також можете відрізняти зміни. Ви також можете скористатися журналом git HEAD..origin, щоб побачити лише ті зміни, які у вашій філії немає. Тоді, якщо хочете їх об’єднати - просто зробіть:

git merge origin

Зауважте, що якщо ви не вказали гілку для отримання, вона зручно за замовчуванням для дистанційного відстеження.

Читання чоловічої сторінки справді допоможе вам найкраще зрозуміти варіанти та способи її використання.

Я просто намагаюся це зробити на прикладах і пам’яті, в даний час у мене немає вікна, на якому можна перевірити. Ви повинні подивитися:

git log -p //log with diff

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


Якщо ви поясните дві речі, це може бути добре: 1. як я скасую git-fetch? 2. Як я бачу різницю?
Мілан Бабушков

1
1) скасування git-fetch? 2) git diff HEAD..origin
Chris Vest

Різниця робиться, як сказав Крістіан, витяг можна скасувати за допомогою скидання git - твердо, однак усі непослані зміни на вашому дереві будуть втрачені, а також зміни, які ви отримали.
Брайан Джанфоркаро

Шукаєте git reset --softчи --mixed? Перевірте сторінку сторінки.
Арістотель Пагальціс

1
Якщо я правильно розумію, не потрібно скасовувати "git fetch", оскільки він не торкається вашої робочої копії, а також не вашого сховища. "git fetch" зберігає об'єкти та посилання у .git / FETCH_HEAD
Thorsten Niehues

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.


ти БОГ. це повинно входити всередині самого git
Z. Khullah

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

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

Порівнюючи два коміти за допомогою git diff друкує всі оновлені файли зі зміненими рядками, але за допомогою grep він шукає і отримує лише рядки, що містять diff --git від виводу.


3

Я можу запізнитися на вечірку, але це те, що занадто довго турбує мене. На моєму досвіді я хотів би побачити, які зміни очікують, а не оновлювати свою робочу копію та мати справу з цими змінами.

Це йде у ~/.gitconfigфайлі:

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

Він отримує поточну гілку, а потім робить різницю між робочою копією та цією вилученою гілкою. Тож ви повинні бачити лише ті зміни, які були б принесені git pull.


1
Чи можете ви замінити рядок ref HEAD..@{u}? Це простіше і не вимагає, щоб пульт називався "походженням" або щоб ваша гілка була названа так само, як на пульті.
Майкл - Де Глина

Це добре зроблений псевдонім, але я не впевнений, чому б ви хотіли це зробити в першу чергу. Вам доведеться колись стикатися зі змінами, правда? Ви повинні мати можливість перервати частину злиття, git pullякщо вам не подобається, що вона робить ... тож я не впевнений, у чому полягає справа використання.
Marnen Laibow-Koser

Я знаю, що мені доводиться стикатися зі змінами в якийсь момент, але, як я писав, іноді цього не хочу. Мені просто хочеться знати, чи щось щось зламається, і мені доведеться зарезервувати ще трохи часу для цього - чи я можу просто зробити це 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)

'gtp' потрібно виконати в корені локального репо, де знаходиться .git.
AX Labs

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