Ветка из предыдущего коммита с использованием Git
Если у меня есть n коммитов, как я могу перейти с n-3 коммитов?
Я вижу хэш каждого коммита.
24 ответа
Вы можете создать ветку через хеш:
git branch branchname <sha1-of-commit>
Или с помощью символической ссылки:
git branch branchname HEAD~3
Чтобы оформить ветку при ее создании, используйте
git checkout -b branchname <sha1-of-commit or HEAD~3>
Для этого на github.com:
- Перейти к вашему проекту.
- Нажмите на "Коммиты".
- Нажмите <> ("Просмотреть репозиторий на этом этапе истории") на коммите, с которого вы хотите разветвиться.
- Нажмите на "tree: xxxxxx" вверху слева. Чуть ниже языковой статистики вы получите возможность "Найти или создать ветку" (просто введите имя новой ветки)
Волшебство может быть сделано путем сброса git.
Создайте новую ветку и переключитесь на нее (чтобы все ваши последние коммиты хранились здесь)
git checkout -b your_new_branch
Вернитесь к своей предыдущей рабочей ветке (предположите, что это мастер)
git checkout master
Удалите последние х коммиты, держите мастера в чистоте
git reset --hard HEAD~x # in your case, x = 3
С этого момента все последние x коммиты находятся только в новой ветке, а не в вашей предыдущей рабочей ветке (master).
Если вы не уверены, с какого коммита вы хотите разветвляться заранее, вы можете проверить коммиты и изучить их код (см. Исходный код, компиляцию, тестирование)
git checkout <sha1-of-commit>
как только вы найдете коммит, от которого вы хотите разветвиться, вы можете сделать это из коммита (то есть, не возвращаясь к мастеру сначала), просто создав ветку обычным способом:
git checkout -b <branch_name>
Просто запустите:
git checkout -b branch-name <commit>
Например:
git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8
checkout
команда с параметром -b
создаст новую ветку и переключит вас на нее
Это создает ветку с помощью одной команды:
git push origin <sha1-of-commit>:refs/heads/<branch-name>
Я предпочитаю этот способ лучше, чем опубликованные выше, потому что он создает ветвь сразу (после этого не требуется дополнительная команда push).
Использование Sourcetree | Самый простой способ.
- Сначала проверьте ветку, в которой вы хотите сделать конкретную фиксацию, чтобы создать новую ветку.
- Затем посмотрите на панель инструментов, выберите Репозиторий> Ветвь... сочетание клавиш - Command + Shift + B.
- И выберите конкретную фиксацию, которую хотите принять. И дайте новое имя ветке, затем создайте ветку!
Вот что я сделал:
C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'
C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
master
* responsivenavigation
В этом случае, 8a75b001096536b3216022484af3026aa9c7bb5b
был и старый коммит принадлежащий master
ветка.
Никто еще не упомянул git switch ?
Ты можешь сделать:
git checkout <commit-hash>
Или с помощью символической ссылки:
git checkout HEAD~3
А потом:
git switch -c my-new-feature-branch
Большой связанный вопрос: Как, черт возьми, вы можете понять это, используя --help
вариант мерзавца? Давайте попробуем это:
git branch --help
Мы видим этот вывод:
NAME
git-branch - List, create, or delete branches
SYNOPSIS
git branch [--color[=<when>] | --no-color] [-r | -a]
[--list] [-v [--abbrev=<length> | --no-abbrev]]
[--column[=<options>] | --no-column]
[(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
[--points-at <object>] [<pattern>...]
git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>...
git branch --edit-description [<branchname>]
Gobbledegook.
Поиск в последующем тексте по слову "совершить". Мы находим это:
<start-point>
The new branch head will point to this commit. It may be given as a branch name, a
commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.
Мы куда-то добираемся!
Теперь сфокусируйтесь на этой строчке гобледека:
git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
Конденсировать это к этому:
git branch <branchname> [<start-point>]
И сделано.
Быстрый способ сделать это на вашем репозитории Github будет следующим:
Для этого в Eclipse:
- Перейти к перспективе "Git Repository Exploring".
- Разверните "Теги" и выберите коммит, из которого вы хотите создать ветку.
- Щелкните правой кнопкой мыши на коммите и выберите "Создать ветку".
- Укажите название филиала.
Это создаст для вас местный филиал. Затем, когда вы отправляете свои изменения, ваша ветвь будет отправлена на удаленный сервер.
Вы можете сделать это в Stash.
- Нажмите коммит
- В правой верхней части экрана нажмите "Пометить этот коммит"
- Затем вы можете создать новую ветку из тега, который вы только что создали.
Для пользователей Git GUI вы можете визуализировать всю историю (при необходимости), а затем щелкнуть правой кнопкой мыши на коммите, с которого вы хотите разветвиться, и ввести имя ветки.
Я смог сделать это так:
git branch new_branch_name `git log -n 1 --skip 3 --format=%H`
Где вы должны ввести значение пропуска. 0 - последний, 1 - предыдущий, 2 - коммит до этого и т. Д.
Перейти к конкретному коммиту из git-репозитория
Иногда при работе с git-репозиторием вы хотите вернуться к определенной фиксации (ревизии), чтобы получить снимок вашего проекта в определенное время. Для этого вам понадобится хэш SHA-1 коммита, который вы легко найдете, проверив журнал командой:
git log --abbrev-commit --pretty=oneline
который даст вам компактный список всех коммитов и короткую версию хеша SHA-1.
Теперь, когда вы знаете хеш коммита, на который хотите перейти, вы можете использовать одну из следующих 2 команд:
git checkout HASH
или же
git reset --hard HASH
проверять, выписываться
git checkout <commit> <paths>
Говорит git заменить текущее состояние путей на их состояние в данном коммите. Пути могут быть файлами или каталогами.
Если ветка не указана, git принимает коммит HEAD.
git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.
Если путь не указан, git перемещается HEAD
на данный коммит (тем самым меняя коммит, на котором вы сидите и работаете).
git checkout branch //means switching branches.
сброс
git reset <commit> //re-sets the current pointer to the given commit.
Если вы находитесь на ветке (как правило, вы должны быть), HEAD
и эта ветка перенесена на коммит.
Если вы в отстраненном HEAD
состояние, git reset только перемещается HEAD
, Чтобы сбросить ветку, сначала проверьте это.
Если вы хотите узнать больше о разнице между git reset и git checkout, я бы порекомендовал прочитать официальный блог git.
С исходным деревом [В настоящее время используется версия: 3.1.3]
- Откройте историю в исходном дереве
- В главном окне будут перечислены все коммиты.
- Щелкните правой кнопкой мыши нужный коммит и нажмите кнопку
Branch...
вариант. - Дайте имя ветке в новом окне и нажмите
Create branch
. - Новая ветвь (локальная для вашей системы) появится слева вместе с другими существующими ветвями, которые вы можете отправить в источник, чтобы получить ее в репозиторий, таким образом, она станет доступной для других пользователей.
Я не знаю, почему людям нравится все усложнять. Вот простой однострочник для
git checkout <commit_id> //gives a snapshot of repo at this commit
git switch -c <new_branch_name> // creates a new branch from that commit
В GitHub Desktop отобразите панель истории и щелкните правой кнопкой мыши нужную фиксацию, затем выберите пункт меню «Создать ветку из фиксации».
Чтобы сделать принятый ответ в Visual Studio 2015 & 2017:
Нажмите на изменения (красная стрелка выше)
Нажмите "Действия" (красная стрелка вверху) и выберите "Просмотреть историю" в меню DropDown.
И новая вкладка откроется:
И вы должны щелкнуть правой кнопкой мыши предыдущий коммит, к которому вы хотите вернуть свой код:
Выберите, чтобы оформить заказ на новую ветку и вуаля!
Ниже, хотя это и не часть вопроса OP, но я делаю и то, и другое, и этот шаг для меня, по крайней мере, для меня: если вы хотите вернуться к предыдущему коммиту без извлечения новой ветки, НЕ выбирайте revert(!?); Вы должны выбрать переопределить --mixed или --hard:
Если вы ищете решение на основе командной строки, можете проигнорировать мой ответ. Я предлагаю вам использовать GitKraken. Это необычный клиент пользовательского интерфейса git. Он показывает дерево Git на главной странице. Вы можете просто посмотреть на них и узнать, что происходит с проектом. Просто выберите конкретный коммит, щелкните его правой кнопкой мыши и выберите опцию "Создать здесь ветку". Это даст вам текстовое поле для ввода имени ветки. Введите название ветки, выберите "ОК", и все готово. Это действительно очень просто.
Я использовал Git Gui (который поставляется с GIT для Windows).
- В строке меню откройте меню « Ветвь» и выберите « Создать... ».
- Укажите имя для новой ветки в разделе Имя ветки
- Выберите Revision Expression: в разделе Start Revision и введите идентификатор фиксации (я просто использовал 8-значный идентификатор из Visual Studio, и это сработало)
Если вы используете исходное дерево, это довольно просто.
- Щелкните правой кнопкой мыши на коммите, откуда вам нужно создать новую ветку
- Нажмите на "ветку"
- Введите имя новой ветви в появившемся диалоговом окне и нажмите "создать ветку"