Ветка из предыдущего коммита с использованием 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:

  1. Перейти к вашему проекту.
  2. Нажмите на "Коммиты".
  3. Нажмите <> ("Просмотреть репозиторий на этом этапе истории") на коммите, с которого вы хотите разветвиться.
  4. Нажмите на "tree: xxxxxx" вверху слева. Чуть ниже языковой статистики вы получите возможность "Найти или создать ветку" (просто введите имя новой ветки) Ветка из предыдущего коммита

Волшебство может быть сделано путем сброса git.

  1. Создайте новую ветку и переключитесь на нее (чтобы все ваши последние коммиты хранились здесь)

    git checkout -b your_new_branch

  2. Вернитесь к своей предыдущей рабочей ветке (предположите, что это мастер)

    git checkout master

  3. Удалите последние х коммиты, держите мастера в чистоте

    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 checkout -b <branch-name> <sha1-of-commit>

Это создает ветку с помощью одной команды:

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 будет следующим:

  • Найдите конкретный коммит из вашей ветки
  • Рядом с идентификатором SHA нажмите "Просмотреть репозиторий на данный момент в истории"
  • Здесь вы можете создать новую ветку из этого коммита

Для этого в Eclipse:

  • Перейти к перспективе "Git Repository Exploring".
  • Разверните "Теги" и выберите коммит, из которого вы хотите создать ветку.
  • Щелкните правой кнопкой мыши на коммите и выберите "Создать ветку".
  • Укажите название филиала.

Это создаст для вас местный филиал. Затем, когда вы отправляете свои изменения, ваша ветвь будет отправлена ​​на удаленный сервер.

Вы можете сделать это в Stash.

  1. Нажмите коммит
  2. В правой верхней части экрана нажмите "Пометить этот коммит"
  3. Затем вы можете создать новую ветку из тега, который вы только что создали.

Выберите совершить

Для пользователей 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]

  1. Откройте историю в исходном дереве

  1. В главном окне будут перечислены все коммиты.
  2. Щелкните правой кнопкой мыши нужный коммит и нажмите кнопкуBranch...вариант.
  3. Дайте имя ветке в новом окне и нажмитеCreate branch.
  4. Новая ветвь (локальная для вашей системы) появится слева вместе с другими существующими ветвями, которые вы можете отправить в источник, чтобы получить ее в репозиторий, таким образом, она станет доступной для других пользователей.

Я не знаю, почему людям нравится все усложнять. Вот простой однострочник для

      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).

  1. В строке меню откройте меню « Ветвь» и выберите « Создать... ».
  2. Укажите имя для новой ветки в разделе Имя ветки
  3. Выберите Revision Expression: в разделе Start Revision и введите идентификатор фиксации (я просто использовал 8-значный идентификатор из Visual Studio, и это сработало)

Если вы используете исходное дерево, это довольно просто.

  • Щелкните правой кнопкой мыши на коммите, откуда вам нужно создать новую ветку
  • Нажмите на "ветку"
  • Введите имя новой ветви в появившемся диалоговом окне и нажмите "создать ветку"
Другие вопросы по тегам