Объединение двух веток в GIT


133

Я только начал использовать GIT и считаю его замечательным, однако я немного не понимаю, что merge делает команда.

Допустим, у нас есть рабочий проект в ветке «А».

Я иду домой, вношу изменения в эту ветку и сохраняю ее как «B». Другой программист вносит изменения в «A» и сохраняет его как «C».

Есть ли способ объединить две ветви «B» и «C» вместе, а затем зафиксировать изменения как новую ветвь, скажем «D»?

Или не хватает точки «слияния»?


нет необходимости «сохранять изменения» в другой ветке.
провяжите

Я не слежу. A будет на моем локальном компьютере, dev1 будет иметь копию A на своем компьютере, а dev2 имеет копию A на своем компьютере. Оба разработчика вносят изменения, как мне объединить эти изменения вместе?
dotty 04

см. < kernel.org/pub/software/scm/git/docs/git-pull.html >. разработчикам, вероятно, нужно сначала куда-нибудь
отправить

Ответы:


197

merge используется для объединения двух (или более) веток.

небольшой пример:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

Итак, теперь есть три отдельных ветки (а именно AB и C) с разными головами

чтобы вернуть изменения из B и C в A, проверьте A (уже сделано в этом примере), а затем используйте команду слияния:

# create an octopus merge
$ git merge B C

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

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

если вы хотите выполнить слияние через границы репозитория / компьютера, посмотрите на git pullкоманду, например, с компьютера с веткой A (в этом примере будут созданы две новые фиксации):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

это означает, что обе ветки действительно изменили один и тот же фрагмент кода. починить конфлиты, git add conflicting_filesа затемgit commit
вязать

Скажем, файл в A содержит слово «hello», A изменил его на «HELLO», а B изменил его на «Hello world». Каков будет результат слияния этих файлов?
dotty 04

Упс, я имею в виду, что B внес поправки в это, а C.
dotty 04

будьте осторожны со словом «изменить», которое означает что-то другое в git (изменение существующих коммитов). изменение файла "hello" на "HELLO" с одной стороны и "Hello World" с другой стороны приведет к конфликту слияния
knittl

19
@dotty: Хотя git часто кажется волшебством, на самом деле он не может читать ваши мысли - если две ветки вносят два разных изменения в один и тот же контент, только человек может понять, как их согласовать. Вот что такое конфликт слияния.
Каскабель

48

Если вы хотите объединить изменения в SubBranch с MainBranch

  1. ты должен быть на MainBranch git checkout MainBranch
  2. затем запустите команду слияния git merge SubBranch

2
@luckytaxi: Согласен, иногда лучше меньше, да лучше
Марсело Скофано

Могу я отменить это?
Йоханелли

0

Случай: если вам нужно игнорировать фиксацию слияния, созданную по умолчанию , выполните следующие действия.

Скажем, новая функциональная ветка извлечена из мастера, уже имеющего 2 фиксации,

  • «Добавлен A», «Добавлен B»

Checkout a new feature_branch

  • «Добавлен C», «Добавлен D»

Затем ветка Feature добавляет две фиксации ->

  • «Добавлен E», «Добавлен F»

введите описание изображения здесь

Теперь, если вы хотите объединить изменения feature_branch с мастером, git merge feature_branchсидите на мастере.

Это добавит все коммиты в основную ветку (4 в master + 2 в feature_branch = всего 6) + дополнительный коммит слияния что-то вроде 'Merge branch 'feature_branch'', поскольку мастер расходится .

Если вам действительно нужно игнорировать эти коммиты (сделанные в FB) и добавить все изменения, сделанные в feature_branch, как один коммит, например 'Integrated feature branch changes into master', Run git merge feature_merge --no-commit.

С --no-commit он выполняет слияние и останавливается непосредственно перед созданием коммита слияния. У нас будут все добавленные изменения в ветке функций теперь в master, и мы получим возможность создать новый коммит как свой собственный.

Подробнее читайте здесь: https://git-scm.com/docs/git-merge

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.