Чи є в Git опція “git pull --dry-run”?


76

Чи існує таке поняття як git pull --dry-run щоб побачити, як речі будуть об’єднані, перш ніж вони зіпсують моє робоче дерево?

Зараз я роблю:

git fetch origin && git merge --no-commit --no-ff

Я не побачив нічого на сторінці довідки для "git-pull", пов'язаного з нею.

Для уточнення, мені просто потрібно це в сценарії Ant для розгортання, щоб побачити, чи не виникають конфлікти при цьому git pull, а потім відключити вихід із збірки, не вдатися до розгортання і залишити це дерево каталогів таким же, яким було раніше git pull.


1
Чому виникають конфлікти? Ваш сценарій розгортання робить локальні коміти, і якщо так, то чому?
CB Bailey

Розглядаючи ці відповіді, я думаю, ми пропустили істотну різницю в тому, що розподілене керування джерелом - витягнення / вилучення захопить ціле сховище, а не лише одну гілку. Ви повинні вказати окремі гілки, як показано в парі відповідей нижче.
буде

@CBBailey ... Коли багато людей працюють над багатьма гілками (наприклад, різними версіями та функціями), часто буває перекриття. Перевірка перед рукою полегшує планування вашого злиття та подальшого витягування запиту. Еквівалентна команда з SVN є: svn -q -u.
буде

Відповіді:


67

Я завжди покладався на властиві Git можливості повернути мене, якщо злиття не вдається.

Щоб оцінити, як може відбутися злиття, можна розпочати, як і з:

$ git fetch origin branch  # Fetch changes, but don't merge
$ git diff HEAD..origin/branch # Diff your current head to the fetched commit

... personal judgement of potential merge conflicts ...

$ git merge origin/branch # merge with the fetched commit

Якщо все пішло не так, як планувалося, перегляньте свій reflogі поверніться до бажаного стану:

$ git reflog
...
abc987  HEAD@{0}: merge activity
b58aae8 HEAD@{1}: fetch origin/branch
8f3a362 HEAD@{2}: activity before the fetch
...
$ git reset --hard HEAD{2}

Ви також можете спробувати це, оскільки витягування якось схоже на об’єднання http://stackoverflow.com/questions/501407/is-there-a-git-merge-dry-run-option
scireon

fatal: ambiguous argument 'HEAD..origin/branch': unknown revision or path not in the working tree.
Зелений

@Green try git reset --hard HEAD @ {2}
Алекс Шенфілд,

34

Спочатку потрібно буде отримати, щоб оновити місцеве походження / майстер

git fetch origin

Тоді ви можете зробити:

git diff --name-only origin/master

Перерахує файли, які змінилися.

git diff origin/master directory_foo/file_bar.m

Буде перелічено рядок за рядком різниці файлу directory_foo / file_bar.m.


1
Дякую за підказку з прапором --name-only
cw24

20

Ви можете отримати бажаний ефект, створивши нову гілку, що викидається, з вашої поточної та зробивши її git pullтам. Якщо ви незадоволені результатами, оригінальна гілка ціла.


ви маєте на увазі git stash?
WesternGun

4
Ні, git stash - це зовсім інше. Це ставить ваші місцеві зміни в інше місце.
RichieHH

11
# fetch new commits from origin
$ git fetch

# check what are the differences and judge if safe to apply
$ git diff origin/master

# actually merge the fetched commits 
$ git pull

5
Чому голос проти? Я зробив, git diff this-answer/top-answerі значної помилки не знайдено. Будь ласка , зверніть увагу , залишивши коментар , коли ви робите downvote: git commit -m "why would you downvote, blah blah blah".
WesternGun

3

Оскільки витягування передбачає об’єднання, я б продовжив роботу, git merge --abortякщо ваш скрипт виявить, що виникли конфлікти, і об’єднання не вдалося.


Якби ви робили це проти віддаленої гілки (йдучи git fetch origin branchпершою), це було б git merge --abort origin/branchправильно?
Нік Деверо

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