git: відрізняється між файлами в локальному репо-файлі та походженням


189

Я хочу знайти відмінності між файлом, який я маю в моєму локальному репо-сервері, і тим, що є в origin master.

Я знаю, що є git diff, однак я просто хочу виділити його в цей конкретний файл.

Для простоти скажемо, що файл названий file1.txtі він має локальний шлях до файлу =, [local_path]а в початковому файлі - filepath = [remote-path].

Якою була б команда git, яку мені потрібно набрати?

EDIT: Дякую всім за ваш внесок, він був дуже проникливий. Для тих, хто використовує Eclipse (про що я є, і я повинен був заявити раніше), я щойно з’ясував, що ви можете просто клацнути правою кнопкою миші -> Порівняти з -> Відділення, тег або довідку -> вибрати відповідну версію, і ви йдете.


Чи відрізняється [віддалений шлях] від [локальний шлях]?
Код-учень

Я щойно помітив вашу редакцію. Сміливо опублікуйте це як відповідь.
Код-учень

що ти називаєш "майстром походження"?

метод ecitse egit хороший
user1169587

Відповіді:


250

Якщо [remote-path]і [local-path]те саме, ви можете зробити

$ git fetch origin master
$ git diff origin/master -- [local-path]

Примітка 1: Друга команда, наведена вище, порівнюватиме з локально зберігається гілкою віддаленого відстеження. Команда для отримання потрібна для оновлення відділення віддаленого відстеження для синхронізації із вмістом віддаленого сервера. Крім того, ви можете просто зробити

$ git diff master:<path-or-file-name>

Примітка 2: master у наведених вище прикладах можна замінити будь-яку назву гілки


15
І навіть може опустити локальний шлях, якщо це поточний каталог.
Тоні Уолл

19
Для таких надзвичайно нуб, як я, ось приклад:git diff master:README.md -- README.md
fabriciorissetto

24
Насправді, ось кращий приклад:git diff origin/master -- README.md
JDiMatteo

Я не міг зробити git fetch masterзамість цього використаний git fetch .(origin / master теж не працював) Але решта добре працювала.
пограбувати

1
@rob Ви першими вказали на мою помилку. Це повинно бути git fetch **origin**.
Код-учень

114

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

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

Щоб переглянути відмінності в іншому напрямку:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

В основному ви можете відрізняти будь-які два файли де завгодно, використовуючи цю нотацію:

git diff ref1:path/to/file1 ref2:path/to/file2

Як завжди, ref1і ref2може бути імена філій, удаленное_імя / branchname, здійснюють ШАС і т.д.


17

Щоб порівняти локальний сховище з віддаленим, просто скористайтесь нижче синтаксисом:

git diff @{upstream}

2

Для цього я написав баш сценарій:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

У наведеному вище сценарії я отримую віддалену головну гілку (не потрібно її головну гілку БУДЬ-яку гілку) FETCH_HEAD, а потім складаю список лише мого модифікованого файлу та порівнюю модифіковані файли git difftool.

Є багато difftoolпідтримуваних git, я налаштований Meld Diff Viewerна гарне порівняння графічного інтерфейсу.
З вищенаведеного сценарію, я попередньо знаю, які зміни були зроблені іншими командами в тому ж файлі, перш ніж пройти етапи git, untrack-->staged-->commitякі допомагають мені уникнути непотрібного вирішення конфлікту з об'єднанням з віддаленою командою або зробити нову локальну гілку та порівняти та об'єднати на головну гілку.


1

Я спробував пару рішень, але мені так просто (як ви знаходитесь у локальній папці):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Тоді ви порівняли локальний номер git та віддалений номер git з останнім номером фіксування ....


0

Повна відповідь на початкове запитання, в якому йшлося про можливий різний шлях на локальному та віддаленому рівні, наведено нижче

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

Припустимо, що локальним шляхом є docs / file1.txt, а віддалений шлях - docs2 / file1.txt, використовуйте git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Це адаптовано з довідкової сторінки GitHub тут і відповіді Code-Apprentice вище

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