странное поведение ветки удаленного HEAD - PullRequest
3 голосов
/ 18 ноября 2011

Иногда я получаю сообщение о том, что какая-то ветка опережает источник, # фиксирует На самом деле, я не создавал эти коммиты, а они извлекаются из источника.

$> git pull origin develop
Enter passphrase for key '###': 
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From ssh://git.#############
 * branch            develop    -> FETCH_HEAD
Updating bbe5577..71907bc
Fast-forward
 ############### |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

И

$> git st
# On branch develop
# Your branch is ahead of 'origin/develop' by 1 commit.

tig выход:

{date} {author} [develop] {message1}
{date} {author} [origin/develop] {message2}

Итак, если я правильно понимаю, HEAD источника - это мой локальный HEAD (или что-то в этом роде), подкрепленный 1. Но никто не фиксирует HEAD этого источника в состоянии -1.

Почему это случилось?

Затем я нажимаю на эту ветку и получаю «все в курсе»

$> git push origin develop
Enter passphrase for key '###': 
Everything up-to-date

Может кто-нибудь объяснить, что происходит с этой веткой?

1 Ответ

2 голосов
/ 19 ноября 2011

Краткий ответ - использовать git fetch origin, за которым следует git merge origin/develop из вашей локальной ветки разработки

git pull похоже на git fetch, за которым следует git merge в вашей локальной ветке разработки.Происхождение / разработка в вашем текущем репозитории не будет соответствовать вашей локальной ветке разработки, потому что ваша локальная копия на один коммит опережает вашу HEAD.Вызов git push origin develop обновляет ваше локальное происхождение / развитие, когда git понимает, что изменения уже есть в удаленном репозитории git.

Вот что вы видите локально на вашей машине без изменений:

macbook:test joel$ git push origin master
Everything up-to-date
macbook:test joel$ git status
# On branch master
nothing to commit (working directory clean)
macbook:test joel$

На другом компьютере другой пользователь вносит изменения, фиксирует их и отправляет их в origin / master:

otherPerson-pc:test bob$ git status
# On branch master
nothing to commit (working directory clean)
otherPerson-pc:test bob$ echo "ddd" >> newfile.txt 
otherPerson-pc:test bob$ git add newfile.txt 
otherPerson-pc:test bob$ git commit --message "added to newfile in master remotely"
[master d14b77e] added to newfile in master remotely
 1 files changed, 1 insertions(+), 0 deletions(-)
otherPerson-pc:test bob$ git push origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 314 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/joel/Desktop/test/test.git
   2cfa7d4..d14b77e  master -> master
otherPerson-pc:test bob$

Вернувшись к своей локальной копии, я не внес изменения.Я вытаскиваю из мастера источника, чтобы получить изменения от других и вывести один коммит вперед!:

macbook:test joel$ git status
# On branch master
nothing to commit (working directory clean)
macbook:test joel$ git pull origin master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /Users/joel/Desktop/test/test
 * branch            master     -> FETCH_HEAD
Updating 2cfa7d4..d14b77e
Fast-forward
 newfile.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

macbook:test joel$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
macbook:test joel$

Мой локальный мастер применяет изменения от мастера пульта, но моя копия источника / мастера - 1 коммит позади, поэтому git говоритЯ один коммит вперед локально, хотя я в курсе.git push origin master обновляет источник / мастер локально, и сообщение исчезает.

Вы можете избежать этого, используя git fetch и git merge вместо git pull

Другой разработчик может сделатьэто снова:

otherPerson-pc:test bob$ git status
# On branch master
nothing to commit (working directory clean)
otherPerson-pc:test bob$ echo "gggg" >> newfile.txt 
otherPerson-pc:test bob$ git add newfile.txt 
otherPerson-pc:test bob$ git commit --message "added gggg newfile in master remotely"
[master 677d031] added eeee newfile in master remotely
 1 files changed, 1 insertions(+), 0 deletions(-)
otherPerson-pc:test bob$ git push origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 321 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/joel/Desktop/test/test.git
   d14b77e..677d031  master -> master
otherPerson-pc:test bob$

Локально я собираюсь получить все происхождение, а затем вручную объединить origin / master с моей копией слияния.

macbook:test joel$ git status
# On branch master
nothing to commit (working directory clean)


macbook:test joel$ git fetch origin 
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /Users/joel/Desktop/test/test
   5e335fa..2dae61c  master     -> origin/master

macbook:test joel$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#
nothing to commit (working directory clean)

macbook:test joel$ git merge origin/master
Updating 5e335fa..2dae61c
Fast-forward
 newfile.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

macbook:test joel$ git status
# On branch master
nothing to commit (working directory clean)
macbook:test joel$

Обычно я делаю выборку, а затемобъединить, потому что вы можете проверить наличие конфликтов перед тем, как сливаться, используя git diff.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...