Як я бачу, що я збираюся натиснути з git?


587

Чи є спосіб побачити, що було б натиснуто, якби я виконував git pushкоманду?

Я маю на увазі щось подібне до вкладки "Файли змінені" у функції "запиту на запит" Github. Коли я надсилаю запит на витяг, я можу подивитися і побачити, що буде зроблено, якщо вони приймуть мою запит на тягу:Приклад сукупності змін

Командний рядок у порядку, але я вважаю за краще GUI (як на скріншоті вище).



Багато пов'язаних питань / відповідей; ось ще: stackoverflow.com/questions/2176278/preview-a-git-push/…
michael

Відповіді:


664

Для списку файлів, які потрібно натиснути, запустіть:

git diff --stat --cached [remote/branch]

приклад:

git diff --stat --cached origin/master

Для кодового відмінності файлів, які потрібно натиснути, запустіть:

git diff [remote repo/branch]

Щоб побачити повний шлях до файлів, які змінюватимуться, запустіть:

git diff --numstat [remote repo/branch]

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


8
Обидві різновиди git, що відрізняються від кеш-пам’яті без даної комісії, відображатимуть лише відмінності щодо HEAD. Я думаю, ви мали на увазі git diff [--stat] - кешоване походження / master, припускаючи, що головна гілка походження є master
mfontani

52
Це не зовсім те, що ви хочете. Ви повинні відрізнятись HEAD, а не індекс, від походження ( git diff origin/master HEAD). Відмінність індексу дасть ті самі результати, якщо і лише у тому випадку, якщо у вас немає змін, поетапних для здійснення комісій. Якщо у вас є поетапні зміни, вони будуть включені в розріз, але явно не будуть натиснуті, оскільки вони ще не здійснені.
Каскабель

5
Цю відповідь потрібно відредагувати, щоб включити інформацію в коментарі від @Jefromi git diff --stat origin/master HEAD- це правильна відповідь.
Тоні Топпер

2
@mfontani має правильну відповідь для мене. Я хочу перевірити, що буде відштовхуватися від того, що я вже здійснив, а не від того, що я буду вчиняти, якщо я зроблю все, що я змінив. git diff --cached [remote/branch]робить фокус :)
poshaughnessy

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

192

Завжди є сухий хід:

git push --dry-run

Він зробить усе, крім фактично надсилання даних.

Якщо ви хочете отримати більш графічний вигляд, у вас є маса варіантів.

Tig та скрипт gitk, що постачаються з git, відображають поточну гілку локальної копії та гілку віддаленого або джерела.

alt текст

Отже, будь-які зобов'язання, які ви зробите після походження, - це зобов'язання, які будуть висунуті.

Відкрийте gitk з оболонки, перебуваючи у гілці, яку ви хочете натиснути, ввівши gitk&, а потім, щоб побачити різницю між тим, що знаходиться на пульті, і тим, що ви збираєтеся натиснути на пульт, виберіть локальну незахищену фіксацію та клацніть правою кнопкою миші на пульті та виберіть "Розмістити це -> вибрано": alt текст


18
git push - сухий запуск не показує мені нічого подібного до того, що я сподіваюся побачити. gitk ближче, але він не показує мені сукупну кількість всіх змін, які будуть натиснуті. Тож якщо я натискаю на 6 віддалених передач, я хочу бачити загальну суму того, що буде натиснуто. Мені не байдуже, що має кожне вчинення окремо, тому що одне зобов'язання може бути повністю заперечене наступним.
cmcculloh

1
Якщо вам потрібна різниця того, що буде натиснуто, зробіть git diff --stat HEAD origin/masterабо git diff HEAD origin/master. Важливе значення має HEAD , інакше ви включаєте несприятливі зміни у різниці
Daniel Alder

Чи є якась причина, що git автоматично не виконує сухий запуск, перш ніж він намагається перенести дані на пульт? Якщо ви натискаєте велику кількість даних, він завантажує всі дані і після цього показує помилки. Ви тільки що витратили час і пропускну здатність для завантаження даних, які вам доведеться повторно завантажувати. Це здається дивним поведінкою.
zeusstl

1
Проблема git push --dry-runполягає в тому, що він все ще вимагає дозволу на запис на віддаленому сервері. Тож якщо у вас є клон без дозволу наштовхуватися вгору за течією, але ви хочете побачити, які ваші локальні незапущені зміни, --dry-runцього не робитимуть.
Ед Авіс

Це хороше рішення, але слід зазначити, що для нього потрібне підключення до віддаленого (включаючи введення ключа SSH, якщо це можливо). Якщо ви просто хочете побачити різницю між branchі origin/branch, я б пішов з відповіддю Ionuț G. Stan, оскільки він насправді не вимагає підключення до віддаленого репо. Це може бути добре чи погано, залежно від того, що вам потрібно.
Шон Бін

169

Щоб просто перерахувати комітети, які очікують на натискання: ( це саме ви запам’ятаєте )

git cherry -v

Показуйте предмети фіксації поруч із SHA1.


5
Цікавим є те, що ви можете вказати пульт для порівняння на зразок: git cherry -v heroku/remoteу випадку, якщо ви зберігаєте свій код на більш ніж одному пульті.
fagiani

Яка найкраща додаткова команда, яка дозволяє нам фактично співвідносити відмінності, які містяться в цих комісіях?
Хассан Байг

Ця команда є приємною, але мені хотілося б детальніше, як імена файлів, які слід змінювати під час натискання.
LS

21

Ви, мабуть, хочете бігти git difftool origin/master.... це повинно показати уніфіковану різницю того, що є у вашій поточній гілці, яка ще не є гілкою origin / master та відобразити її у графічному інструменті diff за вашим вибором. Щоб бути найсучаснішим, запустіть git fetchспочатку.


2
git difftool -d origin/master, У мене встановлений диффузол, щоб він міг платити, тому він чудово працює, THX!
Сила Водолія

git difftool -dнабагато краще, завдяки Водолію Потужність. Єдина проблема полягає в тому, що він не виявляє переміщені файли, а показує їх як видалені та замість них.
EM0

8

Один із способів порівняти локальну версію, перш ніж натиснути її на віддалений репо (вид натискання на сухий хід):

Використовуйте TortoiseGit:
Клацніть правою кнопкою миші проект кореневої папки> TortoiseGit> Diff з попередньою версією>
для версії 2 виберітьrefs/remotes/origin/master


8

Спробуйте git diff origin/master..master(якщо припустити, що origin/masterце ваше вище за течією). На відміну від git push --dry-runцього, це все ще працює, навіть якщо у вас немає дозволу на запис у висхідний потік.


5

Використовуйте git gui, там ви можете побачити список того, що змінилося у вашому фактичному виконанні. Ви також можете використовувати, gitkщо забезпечує простий інтерфейс для відходів. Просто порівняйте між собою remotes/...і masterподивіться, на що буде натиснуто. Він надає інтерфейс, подібний до вашого скріншоту.

Обидві програми включені в git.


1
Я не бачу жодного місця в git gui, яке б показувало все, що було зроблено, але не підштовхується.
cmcculloh

У git gui ви можете побачити, що є модифікованим, але не зафіксованим. У gik (Через gitk --allви отримуєте повний перелік усіх коментарів. Тепер ви можете порівняти фактичний стан вашої відділення розробки з вашим дистанційним.
fuz

4

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

git diff --stat --patch origin master

ПРИМІТКА . Якщо ви випадково використовуєте будь-який з IDE Intellij, ви можете клацнути правою кнопкою миші проект верхнього рівня, виберіть Git > Порівняти з гілкою > та вибрати джерело, яке ви хочете, наприклад origin/master. У дереві файлів, що з’явиться, ви можете двічі клацнути по файлах, щоб побачити візуальну різницю. На відміну від вищенаведеного параметра командного рядка, ви можете редагувати локальні версії у вікні diff.


3

Ви можете перерахувати комітети за:

git cherry -v

А потім порівняйте із наступною командою, де число ^ дорівнює кількості комітів (у прикладі 2 коміти):

git diff HEAD^^

Просто добре побачити список останніх комітетів. Це не дасть ім'я файлів (ив). Отже, як хтось відповів, використовуючи параметри сухого запуску та варіанти виправлення, краще. git diff --stat - patch origin master git push - сушитися
Sree Rama

2

Якщо ви використовуєте Mac OS X, я б рекомендував вам придбати Tower, це чудова програма, яка зробила справу з Git для мене задоволенням. Тепер мені більше не потрібно пам’ятати термінальні команди, і він пропонує чудовий графічний інтерфейс для перегляду, відстеження та вирішення відмінностей у файлах.

І ні, я не пов'язаний з ними, я просто користуюся їх програмним забезпеченням і мені дуже подобається.

http://www.git-tower.com/


2
Я використовую Tower, але як ви можете бачити файли, які були зроблені, але не натиснуті?
Майкл Ірі

Це не відповідає на запитання.
reinierpost

1

Тільки щоб додати свої два центи ... Я хотів реалізувати це під час виконання завдань у трубопроводі gitlab на бігуні gitlab. Найкращим способом зробити це було використання цього сценарію:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Також у моєму випадку я хотів фільтрувати файли за розширенням, щоб досягти цього, я використав:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Після цього ви можете, наприклад, переслати цей список кудись інше, можливо, вкладиш;)

Сподіваюся, що це комусь допоможе.


1
  1. Якщо у вас є дозволи на запис на віддалений
git push --dry-run
  1. Якщо у вас немає дозволу на запис на дистанційному
git diff --stat HEAD remote/branch

0

Після цього git commit -m "{your commit message}"ви отримаєте хеш на фіксацію перед натисканням. Таким чином, ви можете побачити, що ви збираєтеся натиснути, gitвиконавши таку команду:

git diff origin/{your_branch_name} commit hash

наприклад: git diff origin/master c0e06d2


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