Git pull перезаписывает и не объединяет и не подтверждает конфликт в одной ветви (master) - PullRequest
7 голосов
/ 14 марта 2019

Фон:

У меня есть то, что я считаю простым сценарием.Я зафиксировал изменения локально, и теперь я хочу объединить то, что находится на удаленном компьютере, в той же ветке (впереди меня) в локальный рабочий каталог.

git branch -vv --list --all дает следующее:

  master                79d9d4e [origin/master: behind 7] Footprint UI working
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master a86a1a9 Added sample data to webpage

В частности, есть один файл, который я хотел бы объединить.Вот разница: git diff --stat a86a1a9 79d9d4e views/footprint.handlebars

views/footprint.handlebars | 65 +++++++++++++++++++++++++++++++++--------------------------------
 1 file changed, 33 insertions(+), 32 deletions(-)

Но когда я запускаю git pull, версия файла в моем локальном коммите перезаписывается версией удаленного.Более подробно:

$ git fetch -v origin  

From github.com:githubusername/foo
 = [up to date]      master     -> origin/master
$ git merge origin  
Updating 79d9d4e..a86a1a9
Fast-forward
...
 views/footprint.handlebars    | 65 ++++++++++++++++++++++++++++++++---------------------------------
...
 6 files changed, 220 insertions(+), 59 deletions(-)
 create mode 100644 static/search.js
 create mode 100644 views/search.handlebars

Я прочитал следующие посты:

  1. git merge перезаписывает содержимое
  2. Git Merge Master в ветке разработки перезаписывает, а не объединяет

И пробовал эти команды:

  1. git pull --rebase перезаписывает локальную версиюфайл
  2. git merge -s recursive -X ours перезаписывает локальную версию файла
  3. git merge -s ours запрашивает сообщение о фиксации, а затем перезаписывает удаленные изменения
  4. git rebase remotes/origin/master говорит, что он "воспроизведет мойработа поверх "head, но все равно перезаписывает ее
  5. git merge --no-ff --no-commit буквально сообщает" Автоматическое слияние прошло успешно; остановлено перед фиксацией по запросу "при перезаписи файла

(ПослеЗапустив все вышеперечисленное, я проверил рассматриваемый файл и, заметив, что он был перезаписан, запустил git reset --hard master@{"5 minutes ago"})

$ git config --list  

redential.helper=osxkeychain
user.name=My Name
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.precomposeunicode=true
remote.origin.url=git@github.com:githubusername/foo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
user.email=email@address.com
remote.heroku.url=https://git.heroku.com/foo.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
$ git log --oneline --decorate --simplify-by-decoration --all -10  

a86a1a9 (origin/master, origin/HEAD) Added sample data to webpage
79d9d4e (HEAD -> master) Footprint UI working
c53160d Initial commit
$git log --format="%h %ci %cn" views/footprint.handlebars

79d9d4e 2019-03-12 19:04:08 -0400 chb
fada3fa 2019-03-10 13:59:41 -0700 JA
9641499 2019-03-08 16:48:14 -0800 JA
1759509 2019-03-08 12:32:08 -0800 GitHub
bfe443e 2019-03-07 16:41:18 -0800 JA

git version 2.17.2 (Apple Git-113)

Вопрос:

Почему этот конфликт не помечен как таковой git с помощьюмаркеры riate (<<<<<<< HEAD, =======, >>>>>>>) добавляются в соответствующий файл?

1 Ответ

8 голосов
/ 14 марта 2019

Я подозреваю недоразумение о том, что должно делать слияние.(обратите внимание на акцент и потерпите меня)

Давайте разберемся, если есть.

Нам лучше сосредоточиться на файле views/footprint.handlebars.Было ли оно изменено между первоначальным коммитом и вашим локальным коммитом?Между начальным коммитом и origin/master?Оба?

Если вы не изменили его, ожидается тот факт, что после слияния ваш файл отражает их изменения.

Если они не изменили его иваша измененная версия перезаписывается «более старой» версией из первоначального коммита после слияния, теперь это странное поведение для исследования.

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


Наконец, если вы действительно хотите сохранить этот файл в том же состоянии, в каком он был в вашей недавней локальной фиксации, вы должны будете, как и вынамекнул, как на очень утомительную вещь, создайте конфликт слияния, но это не имеет большого значения:

git checkout master
git fetch
git merge --no-commit origin/master
git checkout HEAD -- views/footprint.handlebars
git commit -am "Kept file views/footprint.handlebars as per commit 79d9d4e"

Дайте нам немного больше отзывов, и я отредактирую для корректировки.(вероятно, завтра, хотя; -)

Добавление после комментариев:

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

Решением для восстановления как ваших необходимых изменений, так и их изменений теперь может быть проверка истории файлов, а затем тщательная перестройка содержимого из исходного общего состояния, но в зависимости от вашего контекста сложно посоветовать лучшую формулу.Если коллега готов разобраться с вами, вы, вероятно, избежите множества головных болей.

Добавление к эпилогу:

Извините за горький сладкий финалЯ полностью понимаю, что вы предпочли бы более интеллектуально удовлетворительный ответ / решение.Я благодарю вас за щедрость и всех остальных за все проницательные комментарии.

...