Як порівняти локальну гітку git із віддаленою гілкою?


1049

Як я бачу diffміж місцевою філією та віддаленою гілкою?


5
Ці питання були задані знову пізніше. Вона має хорошу відповідь: stackoverflow.com/questions/11935633 / ...
rustybeanstalk

3
приклад: git diff master origin / master (де master - місцева головна гілка master, а origin / master - віддалена головна гілка).
Гній

@klyngbaek, зокрема, ця відповідь ;-)

Я спочатку намагався, git diff HEAD origin/HEADщо, схоже, вказує на іншу віддалену гілку, ніж ту, яку я мав намір. Використання повної назви філії працює як очікувалося.
Діана

Відповіді:


591

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

git diff <masterbranch_path> <remotebranch_path>

Ви можете git branch -aперелічити всі гілки (локальні та віддалені), а потім вибрати ім'я гілки зі списку (просто видаліть remotes/із назви віддаленої гілки.

Приклад: git diff master origin/master(де "master" - це локальна головна гілка, а "origin / master" - це віддалений, а саме походження та головна гілка.)


23
Йому, можливо, знадобиться збір до ( git fetch)
Houssem Badri

Це просто показує проникнення змін у bash, чи є спосіб відкрити всі зміни в IDE, як код VS?
Суворий Фодждар

@Harsh Phoujdar Додайте код нижче у свій .git / .gitconfig файл. [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseПереконайтесь, що ваш шлях до файлу code.exe правильний.
Аман

1307
git diff <local branch> <remote>/<remote branch>

Наприклад git diff master origin/master, абоgit diff featureA origin/next

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


98
якщо бути точнішим: git diff <local branch> <remote> / <віддалений відділення>
nalply

38
Я зазвичай git diff <remote>/<remote branch> <local branch>бачу, що мій поштовх зробить віддаленому репо.
Michał Tatarynowicz

76
Ще коротший git diff originє достатнім, якщо ви просто порівнюєте його з верхнім відділенням.
Люддер

12
додайте, будь ласка, git fetchна початку, це спричинить неприємності для новачків, як я
Сайф,

1
Гей, чи не повинно бути git diff <remote>/<remote branch> <local branch>? В іншому випадку я перемикаю додавання та видалення на своєму комп’ютері (версія git 2.7.0.Windows.2)
Martín Coll

183

Перший тип

git branch -a

щоб отримати список доступних філій. На виході ви можете побачити щось подібне

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Потім покажіть різницю

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

1
чи не має бути, ...а не ..?
Еліран Малька

9
Я б точно визначив це як відповідь. Дотримуючись ваших вказівок, я зміг переглянути відмінності між місцевою гілкою та віддаленою гілкою. Дякую!
Тасс

1
Як правило, я вважаю, git log origin/my_branch..що це буде HEADмісцевим відкликом, що здебільшого ви маєте на увазі.
Руді

4
+1 за найкращу відповідь на мою скромну думку. Було б гідно +2, якби ви згадали "Вибір" для синхронізації "віддаленого" зображення клонованого джерела. Крок огляду стану / кольорів особливо корисний.
bvj

3
Дякую за одну відповідь, яка нарешті розробилася із семи-восьми "відповідей", які призвели до трохи більше ніж fatal: bad revisionабо fatal: ambiguous argument. Все, що я хотів, - це побачити відмінності в тому ж файлі з іншої гілки, це було занадто багато запитати? Так, так було. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>чудово працює на git 1.8.3.1
Стів Бондс

143

Якщо ви перебуваєте на даній гілці, і ви хочете порівняти її з гілкою вище за потоком, яку ви відстежуєте, використовуйте

git diff @{upstream}

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

git diff @{push}

За допомогою цієї відповіді , документація git для уточнення змін є:

<branchname>@{upstream}, наприклад master@{upstream}, @{u}
суфікс @{upstream}до назви гілки (коротка форма <branchname>@{u}) відноситься до гілки, для якої вказана гілка встановлюється branchnameзверху (налаштована з branch.<name>.remoteта branch.<name>.merge). Пропущені branchnameза замовчуванням поточні.


10
Дуже гарна відповідь, просто пропустіть невелику частину. Змініть рядок на git diff @ @{upstream}. Додатковим @є те HEAD, де ви зараз перебуваєте, тому ви порівнюєте HEADз вище за течією, яку відслідковує ваша філія. Ви можете використовувати @{push}замість вище за течією, щоб отримати різницю між гілкою, на яку ви налаштовані,
Arijoon

3
найкраща відповідь, не вимагає отримання пульта. потрібно більше оновлень!
jcomeau_ictx

3
У молюсках я отримав результат: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Довелося використовувати git diff @\{upstream\}замість цього. 😥
Ландон Кун

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

Крім того, оскільки відповідь як подана включає будь-які місцеві зміни. іноді цього бажано, в інших випадках - ні.
Діана

44

Я набагато краще розумію результат:

git diff <remote-tracking branch> <local branch>

це показує мені, що буде видалено і що буде додано, якщо я натисну локальну гілку. Звичайно, це те саме, просто зворотне, але для мене легше читати і мені зручніше дивитись на те, що буде.


Я отримую точно такий же результат, як: git diff <local branch> <віддалене відстеження гілки> або git diff <відділення дистанційного відстеження> <local branch>
користувач2928048

32

Простий спосіб:

git fetch
git log -p HEAD..FETCH_HEAD

Це спочатку отримає зміни з вашого віддаленого за замовчуванням (походження). Це буде створено автоматично, коли ви клонуєте РЕПО. Ви також можете бути явним: git fetch origin master.

Потім використовується журнал git для порівняння вашої поточної гілки з щойно отриманою. (Параметр -p(генерувати патч) - це те, що показує відмінності .)


14

Ось як я це роблю.

#To update your local.
git fetch --all

це вибере все з віддаленого, тож коли ви перевірите різницю, він порівнятиме різницю з віддаленою гілкою.

#to list all branches
git branch -a

вищевказана команда відобразить усі гілки.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Тепер ви можете перевірити різницю наступним чином.

git diff origin/<branch_name>

це порівняє вашу локальну гілку з віддаленою гілкою


2
git fetch - всі отримають все з ВСІХ віддалених. git fetch має бути достатнім, якщо ви використовуєте дистанційне походження за замовчуванням.
Крістоф Келлер

Дивно, що через 8 років ми отримуємо повну відповідь, яка правильно пояснює кроки. Ми можемо зробити - допомогти, щоб отримати команди. ТАК про розуміння їх.
gdbj

11

Нехай ваша працююча галузь є розвитком і хоче розмежовувати місцеву галузь розвитку та гілку віддаленого розвитку. У цьому випадку синтаксис повинен бути схожим git diff remotes/origin/development..development
або

git fetch origin git diff origin/development


11

tl; dr :git diff <local branch> <remote branch>

Використовуючи git на шкаралупі, я люблю спочатку зорієнтуватися, оглядаючи. Ось команда показати всі гілки

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Тут у мене дві локальні гілки ( my-branchі master) і 4 (віддалені some-branch, some-other-branch, master, і my-branch).

Також зірочка поруч my-branchсигналізує про те, що я зараз перебуваю у цій гілці (ви також це знатимете, використовуючи команду, git statusяка виводить:) On branch my-branch..

Примітка: віддалені гілки в оболонці git bash відображаються червоним кольором, а місцеві - зеленим.

Якщо ви просто хочете показати віддалені гілки :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Щоб показати лише локальні гілки, ви можете спокуситись використовувати, git branch -lале це зовсім інша команда. Щоб показати місцеві гілки, використовуйте git branchбез опцій

$ git branch
* my-branch 
  master

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

$ git branch --list 'my*'
* my-branch

Ви можете також комбінувати --listз параметрами -aі , -rале переконайтеся , що адаптувати шаблон відповідним чином ( пам'ятаєте: віддалені гілки починаються з «пультами» ). Приклад:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Документи: https://git-scm.com/docs/git-branch

Тепер ви можете порівняти будь-які дві гілки з усіх доступних (ви також можете порівняти два місцевих або два віддалені).

Тут я порівнюю локальний з віддаленим my-branch, вони синхронізовані, тому я не отримую жодного результату:

$ git diff my-branch remotes/origin/my-branch

Примітка: ви повинні вказати повні назви гілок без лапок.

Я також можу порівняти місцевий my-branchз віддаленим master. Тут я отримую деякий вихід, оскільки пульт my-branchне був об'єднаний у головну гілку.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]

11

Якщо ви хочете , щоб побачити різницю , як тільки імена файлів змінилися потім використовувати:

git diff --name-status <remote-branch> <local-branch>,

інакше це було б показати все відмінності між двома гілками:

git diff <remote-branch> <local-branch>


9

Ось скорочена відповідь, якщо ви порівнюєте свою поточну галузь і те, що ви хочете git pull.

git fetch
git diff FETCH_HEAD

Перша команда визначить, яка віддалена гілка відповідає вашій поточній гілці. Артефакт цього розрахунку у FETCH_HEADдовідці. Тоді друга команда використовує це посилання порівняння та порівняння з вашою поточною гілкою.


6

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

У моєму випадку у мене є другий пульт називається herokuце НЕorigin і тому, що не в синхронізації я отримав цю помилку при спробі запуску git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

або це при спробі іншого підходу git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

У рішенні явно згадувалося про віддалене ім'я git fetchперед запуском git diff, в моєму випадку:

$ git fetch heroku
$ git diff master heroku/master

Сподіваюся, що допоможе іншим у цьому ж питанні.


4
git difftool <commit> .

Це дозволить порівняти потрібну фіксацію з вашими локальними файлами. Не забудьте крапку в кінці (для місцевих).

Наприклад, для порівняння локальних файлів з деякими фіксаціями:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(і вам не потрібен git fetch, якщо не потрібно порівнювати нові коміти)


Я думаю, що це цікаво тим, що це порівняння, яке я можу зробити перед тим, як здійснити чи натиснути. На жаль, у Windows vimdiff для показу некрасиво; чи є можливість скористатися чим-небудь кращим, як-от блокнот ++?
Стефано Скарпанті

3

Приклад

git diff 'master' 'testlocalBranch'

Якщо ви використовуєте такий редактор, як веб-шторм, ви можете натиснути правою кнопкою миші на вибір файла порівняти з гілкою та ввести / вибрати свою гілку.

введіть тут опис зображення

введіть тут опис зображення


2
Що це додає до прийнятої відповіді 7,5-річного віку з 170+ оновленнями?
Марк Ротвевель

Це для mrblah користувача або для подібних користувачів, які додали коментар до прийнятої відповіді. Синтаксис відрізняється від прикладу, і приклад допомагає більше з точки зору початківців.
Куркула

2
У цьому випадку слід відповісти на цю відповідь.
rachit

1

У VS 2019 просто робіть FETCH Не тягніть код.

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

File location: C:\Users\[username]\.gitconfig

Додано нижче

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Відкрийте командний рядок та перейдіть до робочого каталогу. Я дав нижче для порівняння місцевої гілки DEV з віддаленою гілкою DEV

git difftool dev origin/dev --dir-diff

Це відкриє «Більше порівняння» та відкриє каталоги, у яких файли відрізняються. Якщо ніяких змін за межами Порівняння не буде запущено.


0

Цікаво, чи є в моїй головній галузі будь-які зміни ...

  1. По-перше, вам потрібно змінити своє відділення (якщо ви вже під цим відділенням, вам цього не потрібно!)

git checkout master

  1. Ви можете побачити, який файл був модифікований у вашій головній гілці за допомогою цієї команди

git статус

  1. Перерахуйте гілки

git гілка -а

  • master
    Remotes / походження / майстер
  1. Знайдіть відмінності

git diff походження / майстер


0

Налаштування

git config alias.udiff 'diff @{u}'

Відмінність голови з головою @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Відмінність від довільної віддаленої гілки

Це відповідає на питання у вашій рубриці ("її віддалений"); якщо ви хочете відрізнятись від "віддаленого" (який не налаштований як висхідний потік для гілки), вам потрібно націлити його безпосередньо. Ви можете бачити всі віддалені відділення з наступним:

git branch -r

Ви можете переглянути всі налаштовані віддалені пристрої із наступним:

git remote show

Ви можете бачити конфігурацію гілки / відстеження для одного віддаленого (наприклад, походження) наступним чином:

git remote show origin

Як тільки ви визначите відповідну галузь походження, просто зробіть нормальну диференцію :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


0

Це досить просто. Ви можете використовувати:git diff remote/my_topic_branch my_topic_branch

Де my_topic_branchваша галузь теми.


0

Скажімо, ви вже створили своє originвіддалене сховище. Тоді,

git diff <local branch> <origin>/<remote branch name>


0

спробуйте:

git diff origin HEAD

Припускаючи, що ви хочете відрізняти поточну локальну філію HEADвід походження. І якщо припустити, що ви на місцевому відділенні. :)


-3

Якщо ви використовуєте TortoiseGit (він надає графічний інтерфейс для Git), ви можете клацнути правою кнопкою миші папку Git repo, а потім клацніть Git Sync.

Ви можете вибрати свої гілки для порівняння, якщо вони не вибрані. Чим ви можете бачити різниці, які здійснюють. Ви також можете клацнути правою кнопкою миші будь-яку комісію, а потім Compare with previous revisionпереглянути відмінності поруч.черепаха git sync для порівняння віддаленої та локальної гілки

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