Как я говорю мерзавцу всегда выбирать свою локальную версию для противоречивых слияний на определенном файле?

У меня было много проблем из-за кодирования с помощью python и scrapy. Чтобы избежать проблем кодирования, лучше всего написать:

unicode(response.body.decode(response.encoding)).encode('utf-8')
94
задан Micah 13 May 2010 в 19:00
поделиться

1 ответ

В конкретном экземпляре файла конфигурации я согласен с ответом Рона :
конфигурация должна быть "частной" для вашей рабочей области (следовательно, "игнорироваться", как в "объявленном в файле .gitignore ").
У вас может быть файл конфигурации шаблон с токенизированными значениями в нем и сценарий, преобразующий этот файл config.template в частный (и игнорируемый) файл конфигурации.


Однако это конкретное замечание не отвечает на более широкий и общий вопрос, то есть на ваш вопрос (!):

Как мне сказать git всегда выбирать мою локальную версию для конфликтующих слияний в определенном файле? (для любого файла или группы файлов)

Этот вид слияния является «копированием слияния», при котором вы всегда будете копировать «нашу» или «их» версию файла всякий раз, когда возникает конфликт.

(как Брайан Ванденберг отмечает в комментариях , , « наш » и « их ] здесь используются для слияния .
Они перевернуты для rebase : см. « Почему значения« наши »и« их »меняются местами с помощью git-svn », который использует rebase , " git rebase , отслеживание" локальных "и" удаленных "")

Для "файла" (файла в целом, не говоря уже о "конфигурационном" файле, поскольку это плохой пример), этого можно добиться с помощью специального сценария, вызываемого посредством слияния.
Git вызовет этот скрипт, потому что вы должны определить значение gitattributes , которое определяет настраиваемый драйвер слияния .

В данном случае это "настраиваемый драйвер слияния" , очень простой скрипт, который в основном сохранит текущую версию без изменений, что позволит вам всегда выбирать локальную версию.


Давайте проверим это в простом сценарии с msysgit 1.6.3 в Windows, в простом сеансе DOS:

cd f:\prog\git\test
mkdir copyMerge\dirWithConflicts
mkdir copyMerge\dirWithCopyMerge
cd copyMerge
git init
Initialized empty Git repository in F:/prog/git/test/copyMerge/.git/

Теперь давайте создадим два файла, у которых будут конфликты, но которые будут объединены по-разному.

echo a > dirWithConflicts\a.txt
echo b > dirWithCopyMerge\b.txt
git add -A
git commit -m "first commit with 2 directories and 2 files"
[master (root-commit) 0adaf8e] first commit with 2 directories and 2 files

Мы введем «конфликт» в содержимое обоих этих файлов в двух разных ветвях git:

git checkout -b myBranch
Switched to a new branch 'myBranch'
echo myLineForA >> dirWithConflicts\a.txt
echo myLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in myBranch"
[myBranch 97eac61] add modification in myBranch

git checkout master
Switched to branch 'master'
git checkout -b hisBranch
Switched to a new branch 'hisBranch'
echo hisLineForA >> dirWithConflicts\a.txt
echo hisLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in hisBranch"
[hisBranch 658c31c] add modification in hisBranch

Теперь давайте попробуем объединить hisBranch с myBranch с:

  • ручным разрешением конфликтующих слияний
  • , кроме для dirWithCopyMerge \ b. (Если вы хотите сохранить другую версию, просто добавьте перед строкой exit 0 :
    cp -f $ 3 $ 2 .
    Вот и все. Драйвер слияния всегда сохраняет версию, полученную из другой ветки, отменяя любые локальные изменения)

    Теперь давайте повторим слияние с самого начала:

    git reset --hard
    HEAD is now at ec202aa prepare myBranch with .gitattributes merge strategy
    
    git merge hisBranch
    Auto-merging dirWithConflicts/a.txt
    CONFLICT (content): Merge conflict in dirWithConflicts/a.txt
    Auto-merging dirWithCopyMerge/b.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    Слияние не удалось ... только для a.txt .
    Отредактируйте a.txt и оставьте строку из hisBranch, затем:

    git add -A
    git commit -m "resolve a.txt by accepting hisBranch version"
    [myBranch 77bc81f] resolve a.txt by accepting hisBranch version
    

    Давайте проверим, что b.txt был сохранен во время этого слияния

    type dirWithCopyMerge\b.txt
    b
    myLineForB
    

    Последняя фиксация действительно представляет собой полное слияние:

    git show -v 77bc81f5e
    commit 77bc81f5ed585f90fc1ca5e2e1ddef24a6913a1d
    Merge: ec202aa 658c31c
    git merge hisBranch
    Already up-to-date.
    

    (Строка, начинающаяся с Merge, действительно доказывает это)


    Считайте, что вы можете определить, объединить и / или перезаписать драйвер слияния, поскольку Git:

    • проверит /.gitattributes (что является в том же каталоге, что и рассматриваемый путь): будет преобладать над другими .gitattributes в каталогах
    • Затем он проверяет .gitattributes (который находится в родительском каталоге), будет устанавливать только директивы, если они еще не установлены
    • Наконец, он проверяет $ GIT_DIR / info / attributes . Этот файл используется для переопределения настроек в дереве. Он перезапишет директивы /.gitattributes. Однако, как упоминалось в его другом вопросе , он работает только в случае конфликтов (одновременное изменение в обеих ветвях).

137
ответ дан 24 November 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: