LINUX.ORG.RU

Как в GIT создать новую ветку в условиях, когда что-то уже было изменено после последнего коммита?

 


0

3

Сделал я коммит, потом стал править код. Под конец правки осознал, что эта правка уже тянет на отдельную ветку.

Вопрос: как сделать новый коммит так, чтобы образовалась новая ветка, и в нее поместилась последняя правка проекта?

PS: Я нашел команду checkout -m, которая вроде делает то что нужно. Но она вначале сохраняет изменение в текущей ветке, а изменения мне требуется сохранить в новой ветке:

Если в текущей ветке были какие-то изменения по сравнению с последним коммитом в ветке(HEAD), то команда checkout откажется производить переключение на другую ветку, дабы не потерять произведенную работу.

В случае, когда изменения надо все же сохранить, у команды checkout используют ключ -m. Тогда команда перед переключением попробует залить изменения в текущую ветку и, после разрешения возможных конфликтов, переключиться в новую:

checkout -m some-other-branch

★★★★★

УМВР

git checkout -b <новаяветка>

создает новую ветку, переключает на неё и не трогает измененные файлы.

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

Читаем внимательно условие задачи. Под термином «правка» понимаются еще не закоммиченные изменения.

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

Если ты бранч создаешь от текущей ветки, все будет нормально без сташей.

И где будут храниться незакоммиченные изменения? В астрале чтоли?

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

Так в момент создания бранча происходит переключение на бранч. Переключение на бранч = изменение файлов в рабочей директории.

Xintrea ★★★★★
() автор топика

Сделать на новом комите новую ветку. Убедиться что ты на старой, сделать хард ресет на предыдудщий комит.

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

Схера? Если бранч создается от текущего бранча.

У меня при создании ветки происходит переключение на эту ветку. Не знаю почему, но у меня так. Соответственно, все что незакоммичено, git требует закоммитить. Мне нужно закоммитить изменения в новую ветку, а не в основную, я об этом написал. Поэтому нужен карман.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea
╭─some_user@host  /var/tmp  
╰─$ mkdir test
╭─some_user@host  /var/tmp  
╰─$ ./test 
╭─some_user@host  /var/tmp/test  
╰─$ git init
Initialized empty Git repository in /var/tmp/test/.git/
╭─some_user@host  /var/tmp/test  ‹master› 
╰─$ touch README
╭─some_user@host  /var/tmp/test  ‹master*› 
╰─$ git add README 
╭─some_user@host  /var/tmp/test  ‹master*› 
╰─$ git commit -m "Commit."
[master (root-commit) 7e95584] Commit.
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
╭─some_user@host  /var/tmp/test  ‹master› 
╰─$ echo 123 > README 
╭─some_user@host  /var/tmp/test  ‹master*› 
╰─$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README

no changes added to commit (use "git add" and/or "git commit -a")
╭─some_user@host  /var/tmp/test  ‹master*› 
╰─$ git checkout -b some_branch master
M	README
Switched to a new branch 'some_branch'
╭─some_user@host  /var/tmp/test  ‹some_branch*› 
╰─$ git status                        
On branch some_branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README

no changes added to commit (use "git add" and/or "git commit -a")

ЧЯДНТ???

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

Соответственно, все что незакоммичено, git требует закоммитить.

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

TDrive ★★★★★
()

Хочу заметить, что ответ на вопрос ТС находится в гугле за 1 минуту. Как ТС смог набрать здесь 4 (не 2, не 3, а 4!) звезды?

P.S. Больше скажу. если нет гугла, то ответ находится в мане гита за 2 минуты.

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

Хочу заметить, что ответ на вопрос ТС находится в гугле за 1 минуту. Как ТС смог набрать здесь 4 (не 2, не 3, а 4!) звезды?
P.S. Больше скажу. если нет гугла, то ответ находится в мане гита за 2 минуты.

Больше скажу, у автора почетное количество коммитов: https://github.com/xintrea?tab=contributions&from=2014-10-27

Contributions in the last year 635 total

И при этом он практически не знает Git.

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

git checkout -b new_useless_feature

git branch new_useless_feature

Ты хоть понимаешь, что твоя команда не означает «создать новую ветку»? Маны читать кто будет? Попробуй такой солюшен

git branch new_name
git branch #убедись, что ты на старом и перейди на него
git reset --hard <хэш-коммита-перед-фичей> #здесь убедись, что нет незакомиченных изменений. 

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

не спорь с ним, он упоротый, ты не докажешь что он делает криво

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

Не понял, что такое «знать Git»?

P.S. Меряться количеством коммитов — это уж совсем последнее дело, тем более, если их не так уж и много, что, в любом случае, ни о чем не говорит.

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

Не понял, что такое «знать Git»?

Понимать его же, очевидно. ОП простейшую операцию сделать не может, потому что не понимает как работают ветки, комиты, ресеты и пр.

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

git checkout -b создаёт ветку и переходит на неё. Сам бы почитал маны, прежде чем с умным видом других носом тыкать.

И да, ТС, подтверждаю, stash не нужен, git checkout -b не трогает working tree даже при наличии в нём изменений.

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

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

Именно! Но это не «создание ветки». А ТС жалуется, что у него всегда когда он ветку создает происходит на нее переход. Ветку создают не так. Я лишь об этом сказал. Создание + переход != созданию. А умничаешь как раз ты - придираешься к словам в отрыве от контекста, я с гитом знаком крайне хорошо.

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

Именно! Но это не «создание ветки».

Wut?

Давай я процитирую тебе ман git-branch.

git checkout -b|-B <new_branch> [<start point>]
           Specifying -b causes a new branch to be created as if git-branch(1) were called and then checked out.
intelfx ★★★★★
()
Ответ на: комментарий от Dudraug

Смотрим стартовый пост:

как сделать новый коммит так, чтобы образовалась новая ветка, и в нее поместилась последняя правка проекта?

ТС нужен именно git checkout -b и затем git commit -a.

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

checkout -b - это создание бранча + переход на новый бранч, что не равно просто созданию бранча. ОПу надо просто создать бранч, он просто не в курсе, что просто создание бранча делается иначе.

5+1 != 5 понимаешь?

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

Зачем? Я так понял ОП уже сделал коммит, а потом понял, что последний коммит нужно было делать в новом бранче, разве нет?

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

Для глупых поясню так «создание ветки + перключение на нее» не равно «созданию ветки». Что тут непонятного? Создавать ветки через git checkout -b - это использовать некий инструмент не по назначению. git checkout -b нужен только если ты прямо сейчас планируешь работать с новой веткой (то есть переключиться на нее).

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

..., потом стал править код. Под конец правки осознал, что эта правка уже тянет на отдельную ветку.

Вторая фраза в ОП.

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

Так вот что ты имеешь в виду.

Из твоих слов можно посчитать, что git checkout -b не создаёт новых веток вообще.

Ну и да, топикстартеру всё же нужно создать новую ветку и в неё сделать новый коммит.

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

Человеку, не осилившему почитать маны и поиск, советует человек, не осилившей прочитать ОП. Лор такой лор.

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

ТС действует по старой доброй трольской методичке: задает вопрос, одобряет «плохой» ответ, откидывает хорошие ответы как не рабочие/ламерские.

язабан

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

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

Именно! Но это не «создание ветки».

Капец.

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