Как я могу увидеть, что я собираюсь нажать с Git?

588

Есть ли способ увидеть, что будет выдвинуто, если я сделаю git pushкоманду?

То, что я представляю, - это что-то вроде вкладки «Измененные файлы» в функции GitHub «запрос на извлечение». Когда я отправляю запрос на удаление, я могу посмотреть, что будет выполнено, если они примут мой запрос на удаление:Github пример совокупных изменений

Командная строка в порядке, но я бы предпочел некоторый графический интерфейс (как на скриншоте выше).

cmcculloh
источник
Связанный: stackoverflow.com/questions/3080509/...
н.у.к.
Многие связанные вопросы / ответы; вот еще: stackoverflow.com/questions/2176278/preview-a-git-push/…
Майкл

Ответы:

665

Чтобы получить список файлов, которые нужно отправить, запустите:

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' с помощью программы визуального сравнения? ,

Ionuț G. Stan
источник
8
Оба варианта git diff -cached без данных коммитов будут отображать только различия в отношении HEAD. Я думаю, что вы имели в виду git diff [--stat] --cached origin / master, предполагая, что основной веткой источника является master
mfontani
52
Это не совсем то, что вы хотите. Вы должны различать HEAD, а не индекс, против origin ( git diff origin/master HEAD). Отклонение индекса даст те же результаты, если и только если у вас нет изменений, внесенных для фиксации. Если у вас есть подготовленные изменения, они будут включены в diff, но явно не будут отправлены, так как они еще не были зафиксированы.
Каскабель
5
Этот ответ необходимо отредактировать так, чтобы информация в комментарии @Jefromi содержала git diff --stat origin/master HEADправильный ответ.
Тони Топпер
2
У @mfontani есть правильный ответ для меня. Я хочу проверить, что будет выталкиваться из того, что я уже совершил, а не то, что будет совершено, если я передам все, что я изменил. git diff --cached [remote/branch]делает
свое дело
2
вместо того, чтобы вводить origin / master, вы можете использовать @ {u}, например, git diff @ {u} или git diff HEAD @ {u}. Обратите внимание, что это работает только в том случае, если у вас уже создана и связана ветка отслеживания в восходящем направлении. Я нахожу это полезным, когда у меня много веток и пультов, так что мне не нужно думать о том, что и где связано.
Дэмиен Сойер
192

Всегда есть всухую:

git push --dry-run

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

Если вы хотите более графическое представление, у вас есть куча вариантов.

Tig и gitk-скрипт, поставляемые с git, отображают текущую ветвь вашей локальной копии и ветку удаленного или источника.

альтернативный текст

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

Откройте gitk из оболочки, находясь в ветке, которую вы хотите нажать, набрав gitk&, затем, чтобы увидеть разницу между тем, что находится на пульте, и тем, что вы собираетесь отправить на удаленный, выберите локальный unpressed коммит и щелкните правой кнопкой мыши на пульте и выберите «Diff this -> selected»: альтернативный текст

Брайан Джанфоркаро
источник
18
git push --dry-run не показывает мне ничего похожего на то, что я надеюсь увидеть. Гитк ближе, но он не показывает мне общую сумму всех изменений, которые будут сдвинуты. Поэтому, если я отправляю 6 коммитов на удаленный сервер, я хочу увидеть общую сумму того, что будет отправлено. Мне все равно, что каждый коммит имеет отдельно, потому что один коммит может быть полностью отменен следующим.
cmcculloh
1
Если вам нужна разница в том, что будет выдвинуто, сделайте git diff --stat HEAD origin/masterили git diff HEAD origin/master. Важным является ГОЛОВКА , в противном случае вы включите в свой дифференциал незатронутые изменения
Даниэль Алдер
Есть ли какая-то причина, по которой 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если вы храните свой код более чем в одном пульте.
Фагиани
Какая лучшая дополнительная команда, которая позволяет нам действительно сопоставлять различия, содержащиеся в этих коммитах?
Хасан Бэйг
Эта команда хороша, но я хотел бы более подробно, например, имена файлов, которые будут изменены во время push.
LS
21

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

Скотт Чакон
источник
2
git difftool -d origin/masterЯ установил свой difftool в meld, так что он прекрасно работает, спасибо!
Водолей Сила
git difftool -dнамного лучше, спасибо Водолею. Единственная проблема заключается в том, что он не обнаруживает перемещенные файлы и показывает их как удаленные и добавленные.
EM0
8

Один из способов сравнить вашу локальную версию, прежде чем отправлять ее на удаленный репозиторий (в режиме пробного запуска):

Используйте TortoiseGit:
щелкните правой кнопкой мыши проект корневой папки> TortoiseGit> Различаться с предыдущей версией>
для Версии 2 выберитеrefs/remotes/origin/master

user1921207
источник
8

Попробуйте git diff origin/master..master(предполагая, что origin/masterэто ваш апстрим). В отличие от git push --dry-runэтого, это все еще работает, даже если у вас нет разрешения на запись в апстрим.

Эд Авис
источник
5

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

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

FUZ
источник
1
Я не вижу места в git gui, которое бы показывало все, что было совершено, но не было отправлено.
cmcculloh
В git gui вы можете видеть, что изменено, но не зафиксировано. В gik (Via gitk --allвы получите полный список всех комментариев. Теперь вы можете сравнить фактическое состояние вашей dev-ветви с вашим пультом, который нужно нажать.
fuz
4

Чтобы увидеть, какие файлы изменены, и просмотреть реальные изменения кода по сравнению с masterветкой, которую вы можете использовать:

git diff --stat --patch origin master

ПРИМЕЧАНИЕ . Если вам довелось использовать любую из IDE Intellij, вы можете щелкнуть правой кнопкой мыши свой проект верхнего уровня, выбрать Git > Сравнить с веткой > и выбрать нужный источник, например origin/master. В появившемся дереве файлов вы можете дважды щелкнуть файлы, чтобы увидеть визуальную разницу. В отличие от опции командной строки выше, вы можете редактировать свои локальные версии из окна diff.

ccpizza
источник
3

Вы можете перечислить коммиты по:

git cherry -v

А затем сравните со следующей командой, где число ^ равно числу коммитов (в примере это 2 коммита):

git diff HEAD^^
Давидс
источник
Это просто хорошо, чтобы увидеть список последних коммитов. Это не даст имя файла (ов). Следовательно, когда кто-то ответил, лучше использовать варианты пробного запуска и патча. git diff --stat --patch origin master git push --dry-run
Шри Рама
2

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

И нет, я не связан с ними, я просто использую их программное обеспечение и он мне действительно нравится.

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

kakubei
источник
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
VKG
источник
0

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

git diff origin/{your_branch_name} commit hash

например: git diff origin/master c0e06d2

Chandra
источник
Спасибо за ответ, но я думаю, что эти усилия не были необходимы, так как вопрос довольно старый и высоко оценен. Вам лучше тратить усилия на разные вопросы.
Pbd