2012-01-23 3 views
1

У меня есть несколько вопросов о следующей последовательности событий.На расходящихся ветвях GIT

На этот код работают 2 разработчиков. В первую очередь, , что заставляет ветви расходиться на первом месте?

11:05:08 ~/myApp $ git status 
# On branch Dev 
# Your branch and 'origin/Dev' have diverged, 
# and have 1 and 3 different commit(s) each, respectively. 
# 
nothing to commit (working directory clean) 
11:10:39 ~/myApp $ git push origin Dev:Dev 
To ssh://[email protected]/myApp-web.git 
! [rejected]  Dev -> Dev (non-fast-forward) 

error: failed to push some refs to 'ssh://[email protected]/myApp-web.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

Как предложил Git, я пытался сделать тянуть от remote/Dev к местным Dev, только чтобы увидеть:

11:10:51 ~/myApp $ git pull origin Dev:Dev 
From ssh://mygitserver/myApp-web 
! [rejected]  Dev  -> Dev (non-fast-forward) 

Git тянуть работал, однако. Почему git pull работал и git тянул начало Dev: Dev не удалось?

11:13:05 ~/myApp $ git pull 
Merge made by recursive. 
WebContent/BL/a.jsp    | 14 +++++------- 
WebContent/RJ/b.jsp    | 3 +- 
.../RJ/c.jsp      | 22 ++++++++++---------- 
WebContent/RJ/d.jsp    | 14 ++++++------ 
WebContent/TM/e.jsp    | 12 ++++------ 
5 files changed, 31 insertions(+), 34 deletions(-) 

После git status и git push origin Dev:Dev работали без приключений.

ответ

1

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

Что касается git pull origin Dev:Dev не работает:

git pull s manpage описывает его использование в качестве:

git pull [options] [<repository> [<refspec>...]] 

refspec part указывает git, который (удаленный) refs должен сливаться в локальные ссылки. Таким образом, он позволяет только быстро обновлять обновления, чтобы не допустить потери истории.

вероятно Вы имели в виду, чтобы обновить удаленную ветку отслеживания, а не ваш местный один:

git pull origin dev:refs/remotes/origin/dev 

Укороченный обозначения для случая использования существует, хотя:

git pull origin dev: 

git pull без аргументов будет обновите все ветви отслеживания для настроенного пульта (обычно origin) и объединяет первый refspec в текущую ветку.

+1

Для OP: изменения, происходящие в удаленном * и * локальном репозитории, действительно означают, что кто-то сделал изменения и нажал на пульт дистанционного управления, поэтому подумайте об этом как о дивергентном развитии, выполненном вами и, по крайней мере, другом разработчике. – Cascabel

1

Чтобы визуализировать расхождение, вам просто нужно было сравнить git log Dev на обеих машинах.

+0

Или проще, поскольку вы можете иметь все фиксации на одной машине: 'git fetch origin; git log --oneline --graph --decorate Dev ... origin/Dev' – knittl

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