Невозможно переключить ветки. Что я делаю неправильно?
Я, наверное, что-то упустил. Пожалуйста, укажите на мою ошибку.
У меня есть хранилище. Ствол называется master
(очевидно) и содержит ряд файлов. Я создал ветку под названием dev-17
и добавил еще один файл (называется file17
) к этому.
Теперь в системе на основе Debian я делаю:
$ git fetch origin
$ git reset --hard origin/master
HEAD is now at 13e51c7 20150418.2030
$ git clean -f -d
$ git status
# On branch master
nothing to commit (working directory clean)
$
Выглядит хорошо. И ls
показывает все файлы, которые я ожидаю. Тогда я делаю:
$ git fetch origin
$ git reset --hard origin/dev-17
HEAD is now at 145e638 add file17
$ git clean -f -d
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
$
Делать ls
показывает, что добавил file17
действительно есть. So, apparently I'm on the dev-17
ветка. Но почему git status
say that I'm on master
?
Now for the real problem, while on the dev-17
branch (EDIT: it appears that the above does not really take me to the dev-17 branch, so this statement is incorrect) this happens when I want to see if file17
изменилось:
$ git --no-pager diff --name-only dev-17..origin/dev-17 -- ./file17
fatal: bad revision 'dev-17..origin/dev-17'
$
Предложения очень приветствуются.
2 ответа
Для переключения веток вам не нужно делать сброс. вам нужно checkout
желаемая ветвь
git fetch --all --prune
git checkout dev-17
Это оформит ветку dev-17
Перейдите в Git CMD и при необходимости выполните следующие команды.
Если вы переключаетесь в первый раз, используйте: git fetch --all
Если вы пытаетесь вытянуть недавно созданную ветку, используйте: git fetch
reset
двигает ваш ток HEAD
на указанный коммит (и --hard
обновляет рабочие файлы соответственно).
Если твой HEAD
является master
и ты бежишь $ git reset --hard origin/dev-17
Вы двигаетесь master
в такой же степени, как origin/dev-17
, Вы перемещаете ссылку на другой коммит, а не только обновляете свои локальные файлы. Вы все еще на master
как git status
говорит вам, но master
теперь другой коммит (такой же как origin/dev-17
указывает на).
Чтобы обновить содержание origin/dev-17
с новыми коммитами с вашего пульта, используйте git fetch origin dev-17
,
Чтобы обновить ваши локальные файлы, чтобы отразить содержание origin/dev-17
, вам нужно checkout
филиал origin/dev-17
,
Если вы хотите продолжить работу над веткой, я бы посоветовал создать локальную ветвь, в которой можно выполнить коммит:
git checkout origin/dev-17
git checkout -b dev-17
После добавления коммитов в ветку вы можете отправить их обратно на пульт:
git push origin dev-17
(это не удастся, если дополнительные коммиты были созданы / отправлены на удаленный компьютер, когда вы работали локально. В этом случае вам нужно pull
во-первых, см. ниже.)
После того, как вы это настроите, сделать местный филиал актуальным очень просто. Что вы хотите сделать, это:
git fetch origin dev-17
git merge origin/dev-17
и это можно сделать за одну операцию:
git pull origin dev-17
(при условии, что вы находитесь в вашем местном филиале dev-17
)