LINUX.ORG.RU

Помогите расколдовать проблему с веткой в git.

 


0

2

Значит такая ситуация. Создал я как то ветку, в своём простом локальном репозитории( от ветки master). Менял код, вёртску. Не помню чего страшного я сделал(git исп-ю не часто), появилась у меня такая вот ситуация:

fri8i@fri8i-VirtualBox:~/projects/portfolio$ git branch -a
* (no branch)
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/registration
Что за беда не понимаю. Мне нужно отправить изменения на bitbucket, а с него на хост. Причём я делал git push/git pull в ответ «Everything up-to-date»/«Already up-to-date» соответственно. Крайне не хочу потерять изменения. Помогите разобраться!



Последнее исправление: second_buddha (всего исправлений: 1)

Ответ на: комментарий от Pavval

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

Минус подхода - ты теряешь историю своих изменений.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Если предположить, что ты был в ветке xxxxx, а потом просто сделал git checkout <коммит yyyyyyyyyyyyyy> и далее коммитил, то тебе будет достаточно сделать git merge xxx, чтобы вернуть изменения в xxx.

git checkout <коммит yyyyyyyyyyyyyy> переводит тебя в detached head, т.е. ты как бы в неназванном бренче, который ты отделил от какого-то коммита. Твое состояние можно идентифицировать по номеру последнего коммита в git log (который в самом начале). Вернуться в это состояние всегда можно через git checkout с тем номером коммита. В такой бренч можно делать коммиты, но ты их потеряешь, если уйдешь с бренча и забудешь номер коммита.

Pavval ★★★★★
()

появилась у меня такая вот ситуация:

Это detached state. Это означает то, что твой коммит находится вне бранча.

Причём я делал git push/git pull в ответ «Everything up-to-date»/«Already up-to-date» соответственно

Логично, потому как пушить нечего (HEAD'ы локальный бранчей не отличаются от HEAD'ов ремоутных бранчей).

Крайне не хочу потерять изменения. Помогите разобраться!

Нужно сделать следующее:
- застэшить изменения (ресетнуть коммит через git reset --soft, перевести из их в unstage, сделать git stash);
- перепрыгнуть на коммит, на который указывает HEAD интересующего бранча (git co master);
- git stash pop

Есть и другое решение.
- запомнить хэши коммитов
- перепрыгнуть в нужный бранч
- почерепикать коммиты друг за дружкой (man git-cherry-pick)

dmitry_malikov ★★
()
Последнее исправление: dmitry_malikov (всего исправлений: 2)
Ответ на: комментарий от dmitry_malikov

Сижу перевариваю. Сначала почитаю про все команды, которые вы упомянули...

second_buddha
() автор топика
Ответ на: комментарий от second_buddha

Просто внимательно читай сообщения git. Он тебе писал про detached HEAD, пример:

valentine ~/soft/buildsand/sources/kdevplatform/repo $  git checkout 9e47ee691e1086c7764fe2d653ee5b15865364d4
Note: checking out '9e47ee691e1086c7764fe2d653ee5b15865364d4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, 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 9e47ee6... Merge branch 'master' of git.kde.org:kdevplatform
Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Уровень пока не тот, чтобы схватывать всё сразу, даже если и смотреть внимательно. Ладно, я пока поразбираюсь...

second_buddha
() автор топика

У тебя сейчас указатель HEAD не указывает ни на какую ветку. Это происходит, когда ты делаешь checkout не самого последнего коммита в ветке. Тебе надо сейчас создать временную ветку (git branch, git тебе должен был подсказать это сделать), потом соединить её с нужной веткой (git merge). Потом временную ветку можно удалить. Так ничего не потеряешь.

yvv ★★☆
()
Последнее исправление: yvv (всего исправлений: 1)
Ответ на: комментарий от Pavval

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

Ну и зачем так делать, если в git можно по-нормальному?

yvv ★★☆
()
Ответ на: комментарий от yvv

Если не шаришь - возможно стоит именно так. По крайней мере гарантированно не просрешь текущее состояние, набрав не ту команду или еще где тупнув.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Не, я в git тоже новичок, но то что HEAD должен всегда ассоциироваться с коммитом (копией твоей рабочей директории в .git), мне подсказал сам git. Первое что ТСу надо делать

git branch <имя ветки>

Потом уже смотреть, что и куда надо объединить.

yvv ★★☆
()
Ответ на: комментарий от Pavval

ты их потеряешь, если уйдешь с бренча и забудешь номер коммита.

google://git+find+dangling+commits

anonymous
()
Ответ на: комментарий от dmitry_malikov

Нужно сделать следующее: - застэшить изменения (ресетнуть коммит через git reset --soft, перевести из их в unstage, сделать git stash); - перепрыгнуть на коммит, на который указывает HEAD интересующего бранча (git co master); - git stash pop

Что имею:

git branch -l
* (no branch)
  master

git log --pretty=oneline
0bce21b6b1aecc82c828a0ea36327ad4c0c32c09 scaffolding complete
e5d3d49ebb40a6cbfe3a4b30e7fd97a8cca82436 pre bootstrap
9eba77517368c2ca7d630a8b27259f15380e70d1 bookmark app
ba068dc67f8ada13720eb929e38273fd2cf01f8d vse slomalos iz-za south
...
...

1) Откатываю на предпоследний коммит

git reset --soft e5d3
Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   mybookmark/views.py
#	modified:   myi18n/views.py
#	modified:   myimages/views.py
#	modified:   mynotes/views.py
#	deleted:    portfolio/static/backgroundpage.png
#	new file:   portfolio/static/bootstrap/css/bootstrap-
...
...

2) Перевёл несколько файлов в unstaged(подскажите как сразу все файлы снять с индекса???)

git reset HEAD mybookmark/views.py # и так еще несколько файлов

3) Стало лень вводить все файлы так(около 20 штук), спрятал все изменения как есть...

git stash

4) Переключился на ветку master и принял на ней спрятанные изменения

git checkout master
git stash apply

Нарвался на конфликты! Как быть с ними???

Auto-merging portfolio/urls.py
Auto-merging portfolio/templates/mynotes/show_notes.html
Auto-merging portfolio/templates/mynotes/note.html
CONFLICT (modify/delete): portfolio/templates/mybookmark/edit_bookmark.html deleted in Updated upstream and modified in Stashed changes. Version Stashed changes of portfolio/templates/mybookmark/edit_bookmark.html left in tree.
CONFLICT (modify/delete): portfolio/templates/mybookmark/create_bookmark.html deleted in Updated upstream and modified in Stashed changes. Version Stashed changes of portfolio/templates/mybookmark/create_bookmark.html left in tree.
CONFLICT (modify/delete): portfolio/templates/mybookmark/bookmarks_list.html deleted in Updated upstream and modified in Stashed changes. Version Stashed changes of portfolio/templates/mybookmark/bookmarks_list.html left in tree.
Auto-merging portfolio/templates/base.html
CONFLICT (content): Merge conflict in portfolio/templates/base.html
Removing portfolio/static/backgroundpage.png
Auto-merging myimages/views.py
CONFLICT (modify/delete): mybookmark/views.py deleted in Updated upstream and modified in Stashed changes. Version Stashed changes of mybookmark/views.py left in tree.


(envDjango141_2)fri8i@fri8i-VirtualBox:~/projects/portfolio$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   myi18n/views.py
#	modified:   myimages/views.py
#	modified:   mynotes/views.py
#	deleted:    portfolio/static/backgroundpage.png
#	new file:   portfolio/static/bootstrap/css/bootstrap-responsive.css
#	new file:   portfolio/static/bootstrap/css/bootstrap-responsive.min.css
#	new file:   portfolio/static/bootstrap/css/bootstrap.css
#	new file:   portfolio/static/bootstrap/css/bootstrap.min.css
#	new file:   portfolio/static/bootstrap/img/glyphicons-halflings-white.png
#	new file:   portfolio/static/bootstrap/img/glyphicons-halflings.png
#	new file:   portfolio/static/bootstrap/js/bootstrap.js
#	new file:   portfolio/static/bootstrap/js/bootstrap.min.js
#	modified:   portfolio/templates/base_with_change_lang.html
#	modified:   portfolio/templates/myimages/albums.html
#	modified:   portfolio/templates/myimages/images.html
#	modified:   portfolio/templates/mynotes/create_note.html
#	modified:   portfolio/templates/mynotes/note.html
#	renamed:    portfolio/templates/mynotes/notes.html -> portfolio/templates/mynotes/show_notes.html
#	modified:   portfolio/templates/myprofile/profile.html
#	modified:   portfolio/templates/registration/activate.html
#	modified:   portfolio/templates/registration/login.html
#	modified:   portfolio/templates/registration/registration_form.html
#	modified:   portfolio/urls.py
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#	deleted by us:      mybookmark/views.py
#	both modified:      portfolio/templates/base.html
#	deleted by us:      portfolio/templates/mybookmark/bookmarks_list.html
#	deleted by us:      portfolio/templates/mybookmark/create_bookmark.html
#	deleted by us:      portfolio/templates/mybookmark/edit_bookmark.html

second_buddha
() автор топика
Ответ на: комментарий от second_buddha

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

git checkout 0bce
git branch zzz 0bce21b6b1aecc82c828a0ea36327ad4c0c32c09
git checkout zzz
Осталось только нормально слить с основной веткой. Всем спасибо за подсказки.

second_buddha
() автор топика
13 сентября 2014 г.

Аналогичная ситуация и решение.

Может кому-то, кто придет сюда из поиска это будет полезно.

Честно говоря разбираться в дебрях терминов «застешить», «unstage», и осваивать приемы прыжков через коммиты не хотелось.

Действительно когда делаешь

git checkout идентификатор_коммита 
дальнейшие коммиты, как оказалось лепятся к нему вне какой либо ветки, даже если вы сделали checkout на самый свой последний коммит (я например ожидал что вернувшись на него, все действительно вернется на круги своя).

Эти коммиты висят как-бы в неименованой новой ветке, в своего рода межветочном пространстве. И само собой все попытки запушить изменения командой

git push origin ваша_обычная_ветка
не дадут ожидаемого вами результата. С вашей веткой все впорядке, и с изменениями тоже, просто все те коммиты которые сделаны после ваших манипуляций с откатами надо влить в вашу основную ветку.

Самый понятный и простой способ, проименовать текущее состояние (текущую цепочку коммитов) новой веткой.

git checkout -b tempname 
Затем вернуться в вашу родную ветку

git checkout ваша_обычная_ветка

и слить изменения из созданной ветки

git merge tempname

(так как в гите все с чем вы работаете это изменения, то ветка tempname - это и есть только лишь ваши изменения, отсюда интуитивная понятность метода).

остается только удалить временную ветку, дабы не засорять реп.

git branch -d tempname

И можно пушить.

Вопрос к другим специалистам, в чем суть «застешить», «unstage», хотелось бы узнать смысл манипуляций с этими командами, и что значит «почерепикать коммиты друг за дружкой»?

merlex
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.