Як я бачу, що я збираюся натиснути з 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.