Я прочитал раздел « Основные ветвления и слияния » в Git Community Book.
Поэтому я следую его и создать одну ветвь: experimental
.
Затем я:
- переключиться на экспериментальную ветку (git checkout экспериментальный)
- внести кучу изменений
- совершить это (git commit -a)
- переключиться на главную ветку (git checkout master)
- внести некоторые изменения и зафиксировать там
- переключиться обратно на экспериментальный (git checkout экспериментальный)
- изменение мастера слияния на экспериментальное (мастер слияния git)
Есть некоторые конфликты, но после их разрешения я добавил «git add myfile»
И теперь я застрял, я не могу вернуться к мастеру
когда я делаю
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.
и я сделал:
$ git rebase --abort
Нет ребаз в прогрессе?
и я сделал :
$ git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.
Что я могу сделать, чтобы вернуться в свою основную ветку?
git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"
, это приводитfatal: cannot do a partial commit during a merge.
. И, конечно же, «Частичные коммиты» , по-видимому, не документированы и не обсуждаются нигде на страницах руководства пользователя git. Выполнениеgit merge
после исправления приводит к тому,Please, commit your changes before you can merge.
что инструмент «git merge --continue
. Смотрите мой ответ нижеОтветы:
Когда во время слияния возникает конфликт, вы должны завершить слияние вручную. Похоже, вы сделали первые два шага, чтобы отредактировать конфликтующие файлы, а затем запустить
git add
их, чтобы пометить их как разрешенные. Наконец, вам нужно совершить слияние сgit commit
. В этот момент вы сможете снова переключать филиалы.источник
git commit -am "your commit message"
выполнить добавление и фиксацию одновременно.git commit
работает. И лучше всего использовать его, чтобы получить заполненное сообщение о коммитах по умолчанию. Я избегаю `git commit -am", так как он переопределит сообщениеgit push
.С Git 2.12 (1 квартал 2017 года) у вас будет более естественная команда:
Смотрите коммит c7d227d (15 декабря 2016 г.) Джеффа Кинга (
peff
) .См. Коммит 042e290 , коммит c261a87 , коммит 367ff69 (14 декабря 2016 г.) Крисом Пакхэмом (
cpackham
) .(Слиты Junio C Hamano -
gitster
- в фиксации 05f6e1b , 27 декабря 2016)См. 2.12 примечания к выпуску .
источник
Если вы застряли во время слияния / перебазировки, вы всегда можете
чтобы восстановить вашу работу до состояния последнего коммита. Это приведет к потере ваших изменений из рабочего дерева, поэтому если у вас были локальные модификации до слияния, они будут удалены после этого, поэтому желательно не начинать слияние, когда у вас есть локальные модификации. :)
источник
git reset --hard
выбрасывает незафиксированные измененияgit merge --abort
, который не рискует что-либо потерять?Просто
git commit
это.Опционально
git abort
это:я столкнулся с конфликтом слияний. Как я могу прервать слияние?
Чтобы упростить жизнь с помощью слияний, установите kdiff3 и настройте его как mergetool. Инструкции: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/
Эта страница содержит это видео: https://www.youtube.com/watch?v=Cc4xPp7Iuzo
источник
Всякий раз, когда вы объединяете две ветви с помощью команды
git merge brancha branchb
, есть две возможности:Одна ветвь (скажем, ветвь) может быть достигнута другой ветвью (скажем, ветвь b), следуя ее истории коммитов. В этом случае git просто перемотает вперед голову, чтобы указать на недавнюю ветвь (в этом случае ветвь b).
2.Но если две ветви разошлись в какой-то более старой точке, то git создает новый снимок и добавляет новый коммит, который указывает на него. Таким образом, в случае отсутствия конфликта между ветвями, которые вы объединяете, git плавно создает новый коммит.
Теперь вернемся к интересному случаю, когда между объединяющимися ветвями возникают конфликты слияния. Я цитирую это со страницы https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
Таким образом, в случае возникновения конфликтов слияния, вам нужно разрешить конфликт, затем добавить изменения, которые вы внесли в промежуточную область,
git add filename
и затем зафиксировать изменения с помощью команды,git commit
которая была приостановлена git из-за конфликта. Я надеюсь, что это объясняет вашу запрос. Также посетите ссылку выше для подробного понимания. В случае любого запроса, пожалуйста, прокомментируйте ниже, я буду рад помочь.источник
Следующие шаги после разрешения конфликтов вручную:
git merge --continue
,git cherry-pick --continue
,git rebase --continue
]источник
error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
git merge --continue
, что я пытаюсь сделать, приводит кerror: unknown option 'continue'
. Я уверен, что ваш ответ неверен, поскольку вgit-merge
справочной странице его нет. Какую версию Git вы используете? Я используюgit version 1.8.5.2 (Apple Git-48)
. Я тоже пробовал с MacPortsgit version 2.9.3
.git commit
Конфликт слияния возникает, когда две ветви, которые вы пытаетесь объединить, изменили одну и ту же часть одного и того же файла. Вы можете создать список конфликтов с
git status
.При обнаружении конфликтующей строки Git будет редактировать содержимое затронутых файлов с помощью визуальных индикаторов, которые отмечают обе стороны конфликтующего содержимого.
Когда вы исправите конфликтующие файлы и будете готовы к слиянию, все, что вам нужно сделать, это запустить
git add
иgit commit
сгенерировать коммит слияния. Как только коммит был сделан,git push
изменения в ветке.Справочная статья: Git Merge .
источник
После добавления всех файлов следующим шагом будет « git commit» ».
«git status» подскажет, что делать: файлы, которые еще нужно добавить, перечислены внизу, а после того, как они все закончат, он предложит коммит вверху, где он пояснит статус слияния текущей ветви.
источник
Первое, что я хочу пояснить, это то, что имена ветвей - это просто псевдоним для определенного коммита. git - это то, что git работает, когда вы тянете, нажимаете merge и так далее. Каждый коммит имеет уникальный идентификатор.
Когда вы выполняете $ git merge, то на самом деле происходит то, что git пытается переслать вашу текущую ветку к коммиту, на который включена ветвь, на которую ссылаются (другими словами, оба имени ветки указывают на один и тот же коммит.) Этот сценарий самый простой для git иметь дело, так как нет нового коммита. Подумайте о том, как хозяин прыгает на лилипад, на котором сидит ваша ветвь. Можно установить флаг --no-ff, и в этом случае git создаст новый коммит независимо от того, были ли какие-либо конфликты кода.
В ситуации, когда существуют конфликты кода между двумя ветвями, которые вы пытаетесь объединить (обычно это две ветки, в которых история коммитов имеет общий коммит в прошлом), ускоренная перемотка вперед не будет работать. git все еще может автоматически объединять файлы, если одна и та же строка не была изменена обеими ветками в конфликтующем файле. в этом случае git объединит конфликтующие файлы для вас и автоматически зафиксирует их. Вы можете просмотреть, как это сделал git, выполнив $ git diff --cached. Или вы можете передать флаг --no-commit в команду merge, которая оставит измененные файлы в вашем индексе, которые вам нужно будет добавить и зафиксировать. Но вы можете $ git diff этих файлов, чтобы посмотреть, что изменится слияние.
Третий сценарий - это конфликты, которые git не может разрешить автоматически. В этом случае вам нужно будет объединить их вручную. На мой взгляд, это проще всего сделать с помощью слияния, например, слияния с араксисом или p4merge (бесплатно). В любом случае, вы должны сделать каждый файл по одному. Если слияние кажется застрявшим, используйте $ git merge --continue, чтобы подтолкнуть его вперед. Git должен сказать вам, если это не может продолжаться, и если так, то почему бы и нет. Если вы чувствуете, что в какой-то момент приостановили слияние, вы можете выполнить $ git merge --abort, и любое слияние будет отменено, и вы сможете начать все сначала. Когда вы закончите, каждый объединенный файл будет измененным файлом, который необходимо добавить и зафиксировать. Вы можете проверить, где находятся файлы со статусом $ git. Если вы еще не зафиксировали объединенные файлы. Вы должны сделать это, чтобы завершить слияние.
источник
Может быть поздно Это происходит, потому что ваш git HEAD не обновляется. эта похвала решит это
git reset HEAD
.источник