Проблема слияния изменений вверх по течению обратно в мою ветку - PullRequest
38 голосов
/ 25 апреля 2011

Я сталкиваюсь с конфликтами при попытке объединить восходящие изменения обратно в свою ветку, и я не уверен, как их разрешить.

Я создал свой собственный форк. Я клонировал это. Я внес изменения в ветку на своей вилке, зафиксировал и подтолкнул. Но затем основной форк обновился, и я попытался обновить свой собственный форк, объединив апстрим в следующем виде:

$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master

Слияние говорит, что есть проблема с файлом, и автоматическое слияние не работает. Он говорит мне, чтобы исправить это сам и заново слить. Так что я на самом деле пошел в (upstream) репозиторий на GitHub основного форка и скопировал весь код нового файла в файл на моем форке, и попытался снова объединиться. Затем Git дает мне эту ошибку:

fatal: «объединить» невозможно, потому что у вас есть файлы без слияния. Пожалуйста, исправьте их в рабочем дереве, а затем используйте «git add / rm» как подходит, чтобы пометить разрешение и сделать коммит, или использовать 'git commit -a'.

Есть какой-то аргумент, который я опускаю? Я делаю что-то глупое? Что это значит под "неотправленными файлами"? Разве весь смысл не в том, чтобы объединять файлы? Должен ли я зафиксировать свои изменения перед слиянием?

Ответы [ 5 ]

33 голосов
/ 25 апреля 2011

То, что вы видите, означает, что автоматическое объединение не может разрешить конфликты в файлах.Вам необходимо разрешить эти конфликты вручную.Выполнить git mergetool или git gui.

11 голосов
/ 25 апреля 2011

Команда "git merge" пытается включить изменения из другой ветви в текущую ветку.Если слияние является чистым, что означает отсутствие конфликтов, оно будет зафиксировано.Поскольку у вашего слияния были конфликты, оно не зафиксировало.Вам необходимо разрешить конфликт.

Вытащить копию из репозитория в восходящем направлении является одним из способов сделать это - приняв версию репозитория в обратном направлении.Вы можете сделать это в git, используя «git checkout --theirsgotiting_file.txt»

Редактирование файла для придания ему нужной формы - это другой способ.

После того, как он исправлен, вам нужнодобавить с помощью «git add threatting_file.txt», а затем зафиксировать.Тогда ваша рабочая копия будет чистой и готова к дальнейшему взлому.Удачи.

7 голосов
/ 14 января 2013

В Git есть случаи, когда слияние отказывается даже запускаться, чтобы защитить ваши локальные изменения. Это может произойти в двух случаях:

  • У вас есть незафиксированные изменения в вашем хранилище, конфликтующие с слиянием . Git откажется выполнить слияние со следующим сообщением:

    error: Your local changes to the following files would be overwritten by merge:
            foo
    Please, commit your changes or stash them before you can merge.
    Aborting
    

    Затем вы должны сначала зафиксировать изменения (git commit -a или git add + git commit) или спрятать их с помощью git stash save.

  • Вы находитесь в середине какой-то незаконченной операции слияния-у . Был какой-то конфликт, например

    Auto-merging foo
    CONFLICT (content): Merge conflict in foo
    Automatic merge failed; fix conflicts and then commit the result.
    

    и вы не завершили разрешение конфликтов (редактируя файлы и помечая их как разрешенные с помощью git add, или используя какой-либо графический инструмент слияния с помощью git mergetool), и не создали окончательный коммит слияния с git commit -a, или прервал объединение с git reset --hard ( ПРИМЕЧАНИЕ: это отменит все ваши изменения, и вы потеряете работу по разрешению конфликтов !!!).

    Или вы только что запустили секунду git merge слишком быстро или использовали git merge вместо git commit для создания коммита слияния.

    error: 'merge' is not possible because you have unmerged files.
    hint: Fix them up in the work tree,
    hint: and then use 'git add/rm ' as
    hint: appropriate to mark resolution and make a commit,
    hint: or use 'git commit -a'.
    fatal: Exiting because of an unresolved conflict.
    

    Разрешение конфликтов, как описано, например, в старом Забавно завершить слияние статьи Джунио С. Хамано и завершить слияние с помощью git commit, либо отменить слияние или спрятать его. Тогда, если вы намеревались создать это второе слияние, вы можете сделать это.

Sidenote: по умолчанию приглашение оболочки git -ware показывает, что вы находитесь в процессе слияния, перебазирования или применения исправлений (операция git am). Вы также можете настроить его, чтобы показать, если рабочий каталог грязный (отличается от последней версии, т.е. HEAD).

3 голосов
/ 25 апреля 2011

Запустите git commit (после добавления файлов) во второй раз, а не git merge.

Кроме того, разрешение конфликта создаст файлы, которые помогут вам объединиться.Смотри также git mergetool.

2 голосов
/ 25 апреля 2011

После того, как вы разрешите объединение, вам нужно использовать git add, чтобы добавить файлы, которые вы изменили, в индекс, а затем зафиксировать (как говорится в сообщении).Это говорит git: «Да, я действительно хочу внести эти изменения».

Помните, всегда используйте git add перед коммитом (либо обычным, либо коммитом слияния), если вы используете интерфейс командной строки,Интерфейсы, такие как magit, могут упростить это для вас, чтобы вам не приходилось каждый раз вводить «git add».

...