Что будет делать git checkout master + git reset --hard? - PullRequest
3 голосов
/ 11 марта 2010

Я относительно новичок в Git и у меня есть некоторые проблемы на ранних стадиях. Я сделал несколько коммитов, но когда я пытаюсь их подтолкнуть, я получаю ответ, в котором говорится, что все обновлено. Я чувствую, что моя проблема такая же, как в этом вопросе , но она рекомендует следующее:

$ git log -1
# note the SHA-1 of latest commit
$ git checkout master
# reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Что именно будет делать «проверка мастера»? Я просто не хочу потерять сделанные мной изменения ...

скриншот gitk:
enter image description here

Ответы [ 2 ]

4 голосов
/ 11 марта 2010

Проверка ветки перемещает локальный указатель HEAD так, чтобы он указывал на тот же коммит, на который ссылается ветка. Например:

Когда на ветке mybranch (C s - коммиты):

                        HEAD
                        |
                        V
            master      mybranch
            |           |
            V           V
C1 -------> C2 -------> C3

После запуска git checkout master:

            HEAD
            |
            V
            master      mybranch
            |           |
            V           V
C1 -------> C2 -------> C3

Это также перемещает файлы в вашем рабочем каталоге по мере необходимости, так что это идеальный снимок того, как проект выглядел при этой фиксации. Он не удаляет и не изменяет коммиты, поэтому вы не потеряете работу в одной ветви, проверяя другую.

Что произошло в случае «отсоединенной головы», как описано в этом другом вопросе, так это то, что C3 не связан с ветвью. Чтобы это исправить, вам нужно обновить коммит, на который указывает ветка master, чтобы он включал новый материал (C3). Извлечение master говорит git, что вы сейчас работаете с мастер-веткой, затем выполняете хард reset с SHA1 коммита, который вы хотите, чтобы был на кончике вашей master ветки обновляет ссылки на ветки на то, что вы хотите.

Edit:

В этом случае отсоединенная голова не была проблемой. Просто помните, что фиксация и нажатие - это две разные вещи в git. Фиксация не связывается с центральным репозиторием, как в Subversion. После внесения изменений в рабочий каталог вы запускаете git add filename один раз для каждого измененного файла, где filename - это имя файла. После добавления всех файлов в индекс вы фиксируете их с помощью git commit.

Сокращением для этого является использование git commit -a, которое автоматически добавит измененные файлы в индекс перед фиксацией. Это позволяет пропустить шаги git add. Обратите внимание, что git commit -a будет добавлять только измененные файлы. Если вы вводите новый файл, который никогда не был зафиксирован, вы должны вручную добавить его с помощью git add.

Как только ваш коммит сделан, вы можете запустить git push, чтобы отправить этот коммит в ваш удаленный репозиторий и обновить удаленные ветки. Это делает только удаленную связь. В отличие от Subversion, сам коммит обрабатывается локально, без какого-либо взаимодействия с сервером.

0 голосов
/ 11 марта 2010

git checkout master - это переключение вашей рабочей зоны на master ответвление, также известное как trunk в другой системе управления версиями.

...