Git коммит против тега без веток - PullRequest
56 голосов
/ 14 декабря 2008

Если я извлекаю версию исходного кода с тегами без создания ветки, Git указывает, что я вообще не связан ни с одной веткой. Я рад, что могу внести изменения и проверить их. Куда идут эти изменения? Если я переключаюсь обратно на «мастер», они исчезают (перезаписываются тем, что было в мастере), и я не могу найти их снова. Что дает? Если Git позволяет мне вносить изменения в то, что по сути является анонимной веткой, то, конечно же, я могу вернуть их обратно?

Ответы [ 4 ]

79 голосов
/ 14 декабря 2008

Поскольку ваш коммит не находится ни в одной ветви , вы не сможете увидеть его в рабочем каталоге, пока не извлечете этот конкретный коммит, используя его SHA1. Вы можете найти коммит, посмотрев на reflog, который отслеживает изменения в том, что вы выписали из репо. Если ваш тег был XXX, вы увидите что-то вроде:

$ git reflog
7a30fd7... HEAD@{0}: checkout: moving from master to XXX
ddf751d... HEAD@{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master
96c3b03... HEAD@{2}: commit:  example commit on tag XXX, not on any branch
7a30fd7... HEAD@{3}: checkout: moving from master to XXX

Это говорит вам SHA1, что вам нужно будет checkout, чтобы увидеть ваш коммит в рабочем каталоге.

$ git checkout 96c3b03
Note: moving to "96c3b03" which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 96c3b03... example commit on tag XXX, not on any branch
$ git checkout -b newbranch
$ git branch                #lists all branches
    feature1
    master
  * newbranch

Сначала все это казалось мне немного странным, пока я не понял, что git checkout помещает все файлы проекта с определенного коммита в мою файловую систему (рабочий каталог). По сути, рабочий каталог действует как браузер в локальном репозитории Git. Таким образом, ваши изменения не были перезаписаны в хранилище , они просто не отображаются в вашем рабочем каталоге, когда вы извлекли мастер.

8 голосов
/ 14 декабря 2008

Да, они будут в рефлогах.

Вы можете в любое время назвать ветку так:

git checkout -b my-branch-name
5 голосов
/ 06 января 2012

Кроме того, вы можете объединить коммит обратно в master без новой ветви, найдя его SHA1 (используя git reflog, как указано выше), а затем:

git checkout master
git merge SHA1
0 голосов
/ 05 июня 2010

Чтобы ответить на второй вопрос, вы должны использовать git reset --hard yourtagname

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

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