2015-04-19 4 views
1

Я, вероятно, что-то пропустил. Просьба указать на мою ошибку.Невозможно переключить ветви. Что я делаю не так?

У меня есть репозиторий. Строка называется 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 есть на самом деле. Итак, видимо, я нахожусь на ветке dev-17. Но почему git status говорят, что я нахожусь на master?

Теперь для реальной проблемы, в то время как на dev-17 ветви (EDIT: оказывается, что выше на самом деле не взять меня к DEV-17 филиала, так что это утверждение неверно), это происходит, когда я хочу увидеть если file17 изменилось:

$ git --no-pager diff --name-only dev-17..origin/dev-17 -- ./file17 
fatal: bad revision 'dev-17..origin/dev-17' 
$ 

Предложения очень приветствуются.

+3

[ 'мерзавец reset'] (http://git-scm.com/docs/git-reset) ** не ** переключает ветви. ['git checkout'] (http://git-scm.com/docs/git-checkout) - это команда, которую вы ищете. – axiac

+2

Почему вы используете 'git reset --hard', здесь? Это, вероятно, * не * то, что вы хотите сделать ... – Jubobs

+0

@Jubobs: Я кодирую другую систему и проверяю изменения на этом. Я периодически использую 'git reset --hard' для поддержания синхронизации с удаленным кодом. Я думаю, что я принял эту команду, чтобы (также) иметь возможность переключаться между ветвями. – Mausy5043

ответ

1

Для переключения ветвей вам не нужно выполнять сброс. вам нужно checkout нужной ветви

git fetch --all --prune 
git checkout dev-17 

Это проверка филиал DEV-17

+0

Mmm. Кажется, это работает. Пожалуйста, объясните, почему 'fetch' ** перед **' checkout'? Будет ли «git fetch origin» не выполнить то же самое? – Mausy5043

+0

Привет снова. флаг -all будет извлекать ** все ** теги ветвей +, а не только текущую ветку, на которой вы сейчас находитесь. вот в чем разница. – CodeWizard

+0

'--prune' удалит все удаленные ветки/теги, а также – CodeWizard

1

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)

+0

Спасибо за информацию. FYI, я не собираюсь идти на тестовую машину. Он просто должен оставаться в синхронизации с любой веткой, на которую я указал. Я работал над «мастером», и все прошло хорошо. Затем я захотел провести некоторое тестирование с помощью 'dev-17', и это произошло. – Mausy5043

+0

Итак, если я правильно понял. Пока я останавливаюсь на заданной ветке '$', я могу использовать 'git fetch origin && git reset -hard origin/$ branch && git clean -f -d'. Но если я хочу переключиться на другую ветвь $, мне нужно использовать 'git checkout -b $ branch2', чтобы сделать переключатель, а затем продолжить дальше. – Mausy5043

+0

И HEAD (я теперь понимаю) является указателем на данное коммитирование в истории репозитория. И файлы, находящиеся в текущем каталоге, отражают состояние репо в этой исторической точке. – Mausy5043

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