2014-01-14 4 views
0

Я пытаюсь понять странную вещь. Я не знаю, что я делаю что-то не так, но вот оно:Git aways делает странное слияние

У меня есть две ветки: «Веб» и «ios-web-dev».

Мои git status:

# On branch ios-web-dev 
nothing to commit, working directory clean 

Я использовал следующие команды:

git add -A . 
git commit -m "[SIMULATOR] brightness control // get results // local storage" 
git pull 
git push origin ios-web-dev 

Вот мой git log:

commit e38c75f73c2d3b1ee40d41f87f1a09c0a51b3161 
Merge: 0bc2991 f617068 
Author: Mauricio Giordano <[email protected]> 
Date: Tue Jan 14 01:16:51 2014 -0200 

    Merge branch 'ios-web-dev' of github.com:estudiotrilha/InEvent into ios-web- 

commit 0bc29916e10861c40aafc208a86e7a4db9fafc4b 
Author: Mauricio Giordano <[email protected]> 
Date: Tue Jan 14 01:16:28 2014 -0200 

    [SIMULATOR] brightness control // get results // local storage 

Почему это слияние существует и что это значит?

Спасибо!

+1

Вот почему полезно использовать git с 'git fetch', а не' git pull' – zerkms

ответ

1

Git всегда должен работать над историей. Поэтому, если вы сделаете фиксацию, а затем вытащите фиксации из удаленного репо, он должен будет объединить эту фиксацию поверх истории вашего местного репо. Если у вас нет новых коммитов на локальном уровне, ваше местное репо будет только fast-forward и добавит коммиты отдачи сверху. Однако, поскольку вы сделали запись (+), git автоматически объединит ваши изменения поверх вашей истории. Вы можете технически stash свои изменения, потяните с пульта, а затем примените свои изменения сверху. Я бы не рекомендовал это.

Притворите, что вы сделали начальную фиксацию (1) и перетащили ее на дистанционное репо. Если сотрудник взял эту фиксацию и добавил фиксацию (2), прежде чем нажимать ее обратно, теперь пульт будет находиться в 2 (с историей 2-1). Теперь вы добавляете еще одну фиксацию (3) и пытаетесь вытащить с пульта. Git поймет, что ваша местная история идет 3-1, а удаленная история - 2-1. Где моя 2? Git должен получить это в вашу историю, так или иначе ... он сливается. Вы не просили git переписать историю хотя (3-2-1), поэтому она пытается объединить ее сверху (2-3-1). Теперь он просто применил изменения 2 поверх 3, поэтому он должен сделать фиксацию, следовательно, Merge branch 'ios-web-dev' of github.com:estudiotrilha/InEvent into ios-web-.

Теперь, если вы попытались нажать на удаленный (с историей 2-1), вы получите ошибку, так как в вашем местном репо (с историей 3-1) отсутствует какая-то история. Вы можете (, но не должны) сделать git push <branch> -f, который заставит нажать (и перезаписать локальный пульт, эффективно удаляя фиксацию 2). Если вы никогда не совершили фиксацию 3 после нажатия на пульт дистанционного управления, git без проблем вытащил 2, так как он может просто добавить (fast-foward) 2 поверх вашего местного 1 (2-1).

Иногда я делаю git-stash, прежде чем вытаскивать, чтобы сохранить это сообщение, но обычно, если я знаю, что кто-то внес изменения, которые мне нужны, и я не много работал над местным репо (ничего, что нужно сделать). Пример рабочего процесс в том, что может быть:

git status # a few working changes 
git stash # save your working changes to a temporary commit 
git pull origin <branch> # merge in the remote, fast-forwarding your repo 
git stash apply # apply your working changes from before 

Если у вас есть несколько фиксаций на локальный репо, вы можете использовать технически git-rebase, чтобы получить историю «под» ваши коммиты, чтобы избежать этого дополнительного сообщения фиксации. Так что если вы локально имели 3-1, а пульт был на 2-1, вы могли бы пересобрать свой филиал, чтобы засунуть 2 в свои 3 и у вас есть 3-2-1. Однако это не стоит хлопот (по моему мнению) и выходит за рамки этого ответа.

+1

Зачем нужна перестановка? Он имеет два очевидных преимущества; он дает более чистую историю, более дружественную к делению пополам, и он сохраняет разрешение конфликтов в самом коммите. –

+1

Вы всегда должны переустанавливать, это должен быть ваш рабочий поток по умолчанию. Две вещи для вас, если вы считаете, что вы перегружаетесь: «git pull --rebase» и [git-smart] (https://github.com/geelen/git-smart). – meagar

+0

Это не обязательно хлопот, но в плане вопроса. Не думайте, что ему нужно объяснение, чтобы ответить OP. – Sam

1

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

Git ясно объяснит, что он делает, если вы посмотрите на его вывод между вашими командами.

+0

Итак, если бы я сделал git pull, не внося никаких изменений в local, а THEN внес некоторые изменения, он бы не слился? –

+0

Если кто-то не внес изменений в это окно, но на самом деле все, что вам нужно сделать, это * try * pushing. Git предупредит вас, если есть какие-то изменения, которые нужно перенести в первую очередь. – meagar