Git merge повторно применяет коммиты на другой коммит? - PullRequest
9 голосов
/ 12 июня 2010

Мне 15 лет, и я только начал использовать системы контроля версий, чтобы немного лучше управлять своим кодом, поэтому я немного новичок в этом. Прямо сейчас у меня есть этот репозиторий:

[a]---[b]---[d]---[f] master
        \
         \
          [c]---[e]   develop

Я хочу оказаться здесь:

[a]---[b]---[d]---[f]---[g]  master
        \               /
         \             /
          [c]---[e]---/      develop

, где g эквивалентно выполнению коммитов [c] и [e] на [f]. Это git checkout master; git merge develop, верно?

Ответы [ 4 ]

6 голосов
/ 12 июня 2010

Рисунок, который вы нарисовали, выглядит как результат git merge, но ваше описание того, что вы хотите, звучит как git rebase.

Заимствование из главы "Перебазировка" книги сообщества git, если вы находитесь в ветке mywork и говорите

$ git merge origin

вы получите

git merge history

Думайте о слиянии как о соединении двух разных снимков: в этом случае C4 и C6 собрались вместе, чтобы создать C7.

Rebase создает дерево, которое выглядит точно так же, как C7, но его история выглядит совершенно иначе. Скажем, вместо слияния вы дали команду

$ git rebase origin

вы получите

alt text

Когда вы захотите: «Мне бы очень хотелось, чтобы я создал ветвь mywork на С4 вместо С2», - git rebase - это джинни, который даст это.

Вы могли бы также подумать о перебазировании, как обрезке ветки из вашей истории и пересадке ее в другую точку. Не пропустите тонкое изменение от C5 и C6 до C5 'и C6'. Хотя деревья будут выглядеть одинаково, у них будут разные родители, что приведет к изменению их git-идентификаторов.

1 голос
/ 12 июня 2010

Еще одна полезная помощь по слиянию - http://progit.org/book/ch3-2.html и http://gitref.org/branching/#merge.

1 голос
/ 12 июня 2010

Вы хотите git checkout master; git merge develop.

Это потому, что git merge берет имя ветви, которую вы хотите объединить , в текущую извлеченную ветку .Таким образом, вы выбираете нужную ветку назначения (master), а затем объединяете в нее другую ветку (развернуть).

Если вы посмотрите в первом разделе «Описание» на git-mergeСтраница man , вы увидите диаграмму, почти идентичную вашей (хотя и перевернутую вертикально), которая описывает это.

0 голосов
/ 12 июня 2010

Это git checkout master, чтобы войти в ветку 'master', затем git merge <b>develop</b>, чтобы объединить ветвь 'development' в текущую ветку 'master'.

...