'git diff' между удаленным и локальным репозиториями

Я пытаюсь diff сохранить свой локальный файл в репозитории GitHub перед отправкой запроса на перенос, чтобы я мог видеть, что будет отображаться. Есть ли точный способ сделать это?

Я предполагаю, что инструмент сравнения GitHub манипулирует diff Git.


person Terry    schedule 13.08.2012    source источник
comment
Вы можете выполнить git diff без отправки в текстовый файл. Просмотр в консоли, на мой взгляд, в целом работоспособен.   -  person Denys Séguret    schedule 13.08.2012
comment
@dystroy Я знаю, но моя проблема заключалась в том, что Windows vs. Unix LF, поэтому целые файлы отслеживались как различающиеся. Я обнаружил, что консоль неэффективна для такой большой производительности.   -  person Terry    schedule 13.08.2012
comment
Какой инструмент вы используете в Windows? Я думаю, что стандартная параметризация msysgit справляется с этим автоматически.   -  person Denys Séguret    schedule 13.08.2012
comment
Да, и цвет ST2 кодирует вывод, что очень удобно.   -  person Terry    schedule 13.08.2012
comment
Я использовал новый GitHub для Windows для исходной фиксации / push и веб-интерфейс GitHub для исходного запроса на перенос.   -  person Terry    schedule 13.08.2012
comment
Я не буду вдаваться в подробности по этой теме, потому что никогда не использовал этот инструмент, но, вероятно, есть решение для автоматического преобразования конца строк. Я знаю, что у меня нет проблем (с использованием msysgit), даже когда мои коллеги работают в Windows, а я в Linux. Может быть, вы могли бы задать для этого отдельный вопрос, чтобы вам не пришлось сортировать разницу?   -  person Denys Séguret    schedule 13.08.2012
comment
возможный дубликат сравнить локальную ветку git с удаленной веткой?   -  person nawfal    schedule 07.02.2014
comment
Или просто сделайте git diff <local branch> <remote>/<remote branch>   -  person pavanlimo    schedule 24.02.2015
comment
@Terry FYI: есть неплохие документы по работе с окончаниями строк в windows / unix: git-scm.com/book/en/v2/ и help.github.com/articles/dealing-with-line-endings   -  person DylanYoung    schedule 25.10.2018


Ответы (4)


Не делайте pull:

  • выполните fetch (синтаксис такой же, как у git pull, но он не объединяется автоматически)
  • сделайте diff между вашей веткой dest и другой веткой
  • затем сделайте merge, если хотите
person Denys Séguret    schedule 13.08.2012

Чтобы сравнить локальный рабочий каталог с удаленной веткой, например, origin / master:

  1. git fetch origin master
    Это указывает git на выбор ветки с именем master с удаленного устройства origin. git fetch не повлияет на файлы в вашем рабочем каталоге; он не пытается объединить изменения, как это делает git pull.
  2. git diff --summary FETCH_HEAD
    Когда выбрана удаленная ветвь, на нее можно ссылаться локально через FETCH_HEAD. Приведенная выше команда сообщает git о необходимости сравнения файлов рабочего каталога с HEAD FETCHed ветки и отчета о результатах в итоговом формате. Формат сводки дает обзор изменений, обычно это хороший способ начать. Если вам нужна дополнительная информация, используйте --stat вместо --summary.
  3. git diff FETCH_HEAD -- mydir/myfile.js
    Если вы хотите увидеть изменения в определенном файле, например myfile.js, пропустите параметр --summary и укажите нужный файл (или дерево).

Как уже отмечалось, origin ссылается на удаленный репозиторий, а master ссылается на ветку в этом репозитории. По умолчанию git использует имя origin для удаленного, поэтому, если вы сделаете git clone <url>, он по умолчанию вызовет этот удаленный origin. Используйте git remote -v, чтобы увидеть, на что указывает origin.

У вас может быть несколько пультов. Например, если вы «разветвляете» проект на GitHub, вам обычно требуется удаленная ссылка на исходный проект, а также на вашу собственную вилку. Допустим, вы создали https://github.com/yourusername/someproject как форк https://github.com/theoriginal/someproject. По соглашению вы назвали бы пульт ДУ исходному репо upstream, в то время как ваш собственный форк будет origin. Если вы вносите изменения в свою вилку на GitHub и хотите получить эти изменения локально, вы должны использовать git fetch origin master. Если upstream внес изменения, которые необходимо синхронизировать локально, прежде чем вносить другие изменения, вы должны использовать git fetch upstream master.

person HieroB    schedule 22.10.2015
comment
Голосование за поддержку, поскольку оно дает больше подробностей, чем другие ответы. - person paxdiablo; 22.01.2016
comment
Проголосовали за детали и объяснения контекста. Если кто-то задает этот вопрос, он, вероятно, начинает с git. Контекст и четкие объяснения важны, когда вы пытаетесь осмыслить новую технологию, и это, конечно, никогда не повредит. - person Michael Harris; 04.03.2016
comment
Я бы добавил: 2b. git diff --stat FETCH_HEAD, чтобы предоставить немного дополнительной информации, если --summary было недостаточно. - person Randall; 31.03.2016
comment
Если я хочу избежать конфликтов слияния, прежде чем отправлять свои изменения. Лучше всего выполнить выборку, а затем выполнить сравнение моего локального рабочего каталога с помощью FETCH_HEAD, а затем выполнить push, если все в порядке? - person Nuetrino; 04.01.2018
comment
Что, если после сравнения я решу, что не хочу объединять локальную ветвь с удаленной; есть ли способ получить удаленную ветку? - person Pedro García Medina; 22.01.2021
comment
Педро: Fetch записывает в файл .git / FETCH_HEAD, а вы ссылаетесь на содержимое через FETCH_HEAD. Если вы не объедините их, они не изменят вашу локальную ветку. Содержимое .git / FETCH_HEAD перезаписывается при следующей выборке, поэтому обычно вы можете просто оставить его. Я не знаю команды git для явной очистки FETCH_HEAD. - person HieroB; 24.01.2021

Согласно комментарию OP, частью его проблемы было Windows против Unix LFs, это должно помочь:

Вы можете использовать следующую команду конфигурации, чтобы указать git-diff игнорировать разницу в коде EOL.

git config --global core.whitespace cr-at-eol
person gzh    schedule 14.11.2013
comment
core.autocrlf - еще один полезный параметр для передачи системных различий новой строки - person DylanYoung; 25.10.2018

Вы можете использовать: git diff remote/my_topic_branch my_topic_branch

Где my_topic_branch - ваша тематическая ветка.

person Elisha Senoo    schedule 22.11.2018