2015-01-13 5 views
0

У меня был feature филиал, а затем мастер branch.Филиал Git отклонился от мастера

На прошлой неделе я работал на feature отрасли, а затем на этой ветке я сделал это вчера

git rebase master.

Другой человек, также совершивший osme материал в мастер отрасли сегодня.

Итак, сегодня я сделал это

master# git pull 
master# git rebase feature 

Теперь я получаю эту

$ git status 
On branch master 
Your branch and 'origin/master' have diverged, 
and have 18 and 11 different commits each, respectively. 
    (use "git pull" to merge the remote branch into yours) 
nothing to commit, working directory clean 

Что я должен делать. могу ли я сделать git push -f

+0

Нет, никогда не делайте 'git push -f', если вам не нравится раздражать остальных членов вашей команды! –

+0

@OliverCharlesworth я сбрасываю жестко в orgin/master HEAD, а затем i git merge feature. то это сработало. не знаю, правильно ли это было – user3214546

ответ

3

Было бы чрезвычайно информативно попытаться создать некоторые диаграммы, объясняющие, что именно вы сделали, поэтому давайте сделаем это. Предположим, что вы, создав ветку функций из удаленного мастера, имели только 3 коммита. Это будет означать, что два местных отделения будут начать выглядеть как следующее:

A <- B <- C master
A <- B <- C feature

Давайте также предположим, что в течение последней недели, вы сделали несколько коммитов в вашу местную особенности отрасли, а также другие разработчик ваша команда также совершает фиксацию для удаленного мастера. После извлечения мастеров-ветви через master# git pull, два ваши местные отделения будут выглядеть следующим образом:

A <- B <- C <- 1 <- 2 <- 3 master
A <- B <- C <- D <- E feature

Здесь коммиты 1, 2 и 3 пришли от других разработчиков, а совершает D и Е пришли от тебя.

Далее, если вы сделали местный Rebase мастера на функции через master# git rebase feature, две ветви будут выглядеть следующим образом:

A <- B <- C <- D <- E <- 1' <- 2' <- 3' master
A <- B <- C <- D <- E feature

Мастер совершает 1, 2 и 3 имеют в настоящее время становятся 1 ', 2' и 3 ', потому что на самом деле это разные коммиты, сделанные после повторения функции на вашей основной ветке.

Наконец, давайте сравним местный мастер-ветвь с удаленным мастером:

A <- B <- C <- D <- E <- 1' <- 2' <- 3' local master
A <- B <- C <- 1 <- 2 <- 3 remote master

Когда вы сделали это git status вызова, Git сказал вам, что ваш местный мастер расходился с пульта дистанционного управления. Это означает, что локальный и удаленный мастер совместно используют общий предок, но каждый из них имеет разные значения за пределами этой точки. Это также означает, что вы не можете ускорить перемотку удаленного ведущего устройства. Вашими опциями в этот момент являются принудительное нажатие через git push -f или до git merge. Как указал Оливер Шарлеорт, принудительная локальная ветка на удаленной машине обычно является плохим, потому что она может переписывать все изменения от других разработчиков, используя master. Остальная опция - объединить локальный мастер с пультом дистанционного управления.

Простой (и более чистый) способ продолжения движения вперед - это просто выполнить всю вашу работу в ветви функции, а затем объединить ее в мастер, когда придет время. Как правило, вы должны только переустанавливать функцию (или объединять функцию в) мастера, а не наоборот.

-1

Нет, если вы нажмете -f, вы уничтожите изменения, которые были совершены мастером другим разработчиком.

У вас есть два варианта:

1) Слияние с мастером.

git merge master 

2) Rebase на мастер

git rebase <sha1> onto --master 

<sha1> бы оригинальный коммит мастера, что вы ответвляется от.

Эти варианты очень отличаются друг от друга, и вам нужно полностью понять, что они делают. Который вам нужно, полностью зависит от ваших намерений, в будущем. Если вы точно объясните, чего вы пытаетесь достичь, можно сделать некоторые дополнительные рекомендации.

Смежные вопросы