Слияние до определенного коммита

Я создал новую ветку с именем newbranch из ветки master в git. Теперь я проделал некоторую работу и хочу объединить newbranch в master; однако я внес несколько дополнительных изменений в newbranch и хочу объединить newbranch до четвертого с последнего коммита в master.

Я использовал cherry-pick, но он показывает сообщение об использовании правильных параметров:

git checkout master    
git cherry-pick ^^^^HEAD newbranch

Могу я вместо этого использовать git merge?

git merge newbranch <commitid>

person Dau    schedule 22.11.2011    source источник


Ответы (5)


Конечно, находясь в ветке master, все, что вам нужно сделать, это:

git merge <commit-id>

где commit-id - это хеш последнего коммита из newbranch, который вы хотите получить в ветке master.

Вы можете узнать больше о любой команде git, выполнив git help <command>. В таком случае это git help merge. И документы говорят, что последний аргумент для команды merge - это <commit>..., поэтому вы можете передать ссылку на любую фиксацию или даже на несколько коммитов. Хотя я сам никогда не делал последнего.

person KL-7    schedule 22.11.2011
comment
не только один коммит, но и все коммиты до commit-id - person Dau; 22.11.2011
comment
Да, он объединит все коммиты из newbranch с того времени, когда его история отклонилась от master до commit-id в ветку master. Вы можете думать о git merge <commit-id> как о слиянии некоторой безымянной ветки, которая заканчивается на commit-id, в вашу текущую ветку. - person KL-7; 22.11.2011
comment
Могу ли я объединить две локальные ветки, кроме master, с помощью идентификатора фиксации? - person skt; 30.05.2017
comment
@skt, вы можете просто быть в локальной ветке, с которой хотите выполнить слияние, прежде чем использовать git merge. например, вы хотите объединить фиксацию 18a6fac из ветки b2 в ветку b1, просто выполните git checkout b1; git merge 18a6fac - person XioRcaL; 16.06.2017
comment
Кажется, это НЕ работает, если я нахожусь в ветке, с которой хочу слиться, и есть какая-то другая ветка с коммитами A B и C, и я сливаюсь в C, она получает только изменения, сделанные в C, а не в A и B. - person ggb667; 20.08.2019

Чтобы ветвление оставалось чистым, вы можете сделать это:

git checkout newbranch
git branch newbranch2
git reset --hard <commit Id> # the commit at which you want to merge
git checkout master
git merge newbranch
git checkout newbranch2

Таким образом, newbranch закончится там, где он был объединен с master, и вы продолжите работу над newbranch2.

person tkruse    schedule 06.12.2017

Выполните команду ниже в папке текущей ветки, чтобы объединить эту <commit-id> с текущей веткой, --no-commit не делать новую фиксацию автоматически

git merge --no-commit <commit-id>

git merge --continue можно запустить только после того, как слияние привело к конфликту.

git merge --abort Прервать текущий процесс разрешения конфликтов и попытаться восстановить состояние до слияния.

person ElasticCode    schedule 29.07.2019

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

branch A: A1 -> A2 -> A3 -> A4
branch B: B1 -> B2 -> B3 -> B4
branch C: C1 -> A2 -> B3 -> C2

Например, нам нужно было объединить ветвь A до A2 и ветвь B до B3. Но ветка C имела выборку из A и B. При использовании SHA для A2 и B3 это выглядело так, как будто возникла путаница из-за локальной ветки C, которая имела тот же SHA.

Чтобы избежать какой-либо двусмысленности, мы удалили ветвь C локально, а затем создали ветвь AA, начиная с фиксации A2:

git co A
git co SHA-of-A2
git co -b AA

Затем мы создали ветку BB из коммита B3:

git co B
git co SHA-of-B3
git co -b BB

В этот момент мы объединили две ветви AA и BB. Удалив ветку C, а затем ссылаясь на ветки вместо коммитов, это сработало.

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

person pid    schedule 23.07.2020

Чтобы объединить конкретную ветку с вашим мастером, просто сделайте следующее:

git reset --hard <commit Id> ‹- коммит, на котором вы хотите слить

person Janis Basis Basovs    schedule 25.05.2021