Ветка из предыдущего коммита с использованием Git

1440

Если у меня есть n коммитов, как я могу перейти с n-3 коммитов?

Я вижу хэш каждого коммита.

Теги:
git-branch
branch

15 ответов

2027
Лучший ответ

Вы можете создать ветку через хеш:

git branch branchname <sha1-of-commit>

Или с помощью символической ссылки:

git branch branchname HEAD~3

Чтобы оформить ветку при ее создании, используйте

git checkout -b branchname <sha1-of-commit or HEAD~3>
  • 30
    Git 1.8.2 позвольте мне использовать короткий sha1 для первой формы.
  • 45
    @MattFenwick Git позволит вам использовать укороченные хэши везде, где разрешен хеш, если укороченный хеш является «уникальным» в хранилище. Так что, если это не сработало, попробуйте добавить еще один символ из хэша.
Показать ещё 2 комментария
201

Для этого на github.com:

  1. Перейти к вашему проекту.
  2. Нажмите на "Коммиты".
  3. Нажмите <> ("Просмотреть репозиторий на этом этапе истории") на коммите, с которого вы хотите разветкиться.
  4. Нажмите на "tree: xxxxxx" вверху слева. Чуть ниже языковой статистики вы получите возможность "Найти или создать ветку" (просто введите новое имя ветки) Изображение 7515
  • 0
    Вопрос не в github, а в git. Большинство git-серверов не являются github.
  • 8
    Несмотря на то, что это Github, а не Git, он все равно был очень полезным!
63

Магия может быть выполнена с помощью git reset.

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

    git checkout -b your_new_branch

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

    git checkout master

  • Удалите последние х фиксации, сохраните мастер чистой

    git reset --hard HEAD~x # in your case, x = 3

С этого момента все последние коммиты x находятся только в новой ветке, а не в вашей предыдущей рабочей ветке (мастер).

  • 5
    Это то, что я искал, так как он удаляет коммиты из Мастера и делает так, как если бы вы запомнили создание ветки до того, как эти коммиты были сделаны. Благодарю.
  • 6
    Только не забывайте, что git reset --hard не очень хорошая идея, если вы уже git reset --hard коммит в origin ...
Показать ещё 1 комментарий
59

Если вы не знаете, с какой фиксацией вы хотите вступить в ветку, вы можете проверить фиксацию и проверить свой код (см. источник, скомпилировать, проверить) на

git checkout <sha1-of-commit>

как только вы обнаружите, что фиксация, которую вы хотите разветкить, вы можете сделать это изнутри фиксации (т.е. не возвращаясь к первому мастеру), просто создав ветвь обычным способом:

git checkout -b <branch_name>
18
git checkout -b <branch-name> <sha1-of-commit>
  • 0
    Чем это отличается от " git branch branchname <sha1-of-commit> " (от принятого ответа)?
  • 0
    Я не знаю. Я думаю, что они эквивалентны. Я всегда использую git checkout -b для создания новой ветки.
Показать ещё 1 комментарий
7

Быстрый способ сделать это в вашем реестре Github будет следующим:

  • Найти конкретную фиксацию из вашей ветки
  • Рядом с идентификатором SHA нажмите "Обзор репо на этом этапе истории"
  • Здесь вы можете создать новую ветку из этой фиксации Изображение 7516
  • 1
    Это на самом деле устарело
  • 0
    Эй, проверьте это на github.com, он все еще работает
Показать ещё 1 комментарий
4

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

  • Нажмите фиксацию
  • В правой верхней части экрана нажмите "Отметить эту фиксацию"
  • Затем вы можете создать новую ветку из только что созданного тега.
  • 0
    Что это за графический интерфейс? GitHub?
  • 0
    Атласский сундук
4

Для этого в Eclipse:

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

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

3

Отличный вопрос: как вы это понимаете, используя параметр --help для git? Попробуем это:

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.

Мы где-то попадаем!

Теперь сосредоточьтесь на этой строке gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Сложите это на следующее:

git branch <branchname> [<start-point>]

И сделано.

  • 1
    Я ненавижу мерзавца. Благодарю.
3

Я смог сделать это так:

git branch new_branch_name 'git log -n 1 --skip 3 --format=%H'

Где вы должны ввести значение пропуска. 0 - последний, 1 - предыдущий, 2 - коммит до этого и т.д.

  • 4
    Почему бы просто не использовать HEAD~1 (где 1 указывает 1 коммит обратно)?
  • 1
    Ваш путь покрыт выбранным ответом и работает нормально. Мой другой способ, чем выбранный ответ.
1

Вот что я сделал:

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 ветки.

1

Вы можете создать ветвь, используя хэш этого коммита,

git branch branchname <sha1 of the commit>
0

Просто запустите:

git checkout -b branch-name <commit>

Например:

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

Команда checkout с параметром -b создаст новую ветку и переключит вас на нее

0

Изображение 7517

Для пользователей Git GUI вы можете визуализировать всю историю (при необходимости), а затем щелкнуть правой кнопкой мыши на коммите, с которого вы хотите разветкиться, и ввести имя ветки.

Изображение 7518

Изображение 7519

  • 0
    Это будет работать, только если пользователь использует любую ОС на основе пользовательского интерфейса, например Windows & MAC
  • 0
    Вот так. Мой ответ начинается со слов «Для пользователей Git GUI ...». Я не дал ответа, который будет работать для всех - это уже сделано. Я дал альтернативный метод, который может быть проще для многих людей. Я думаю, что причина моего ответа не нравится, потому что это не решение для всех, но это уже существует с парой тысяч голосов. Однако это не делает мой ответ неправильным «Для пользователей Git GUI!». СОЗДАТЬ НОВЫЙ ФИЛИАЛ есть в GUI. Я сомневаюсь, что я единственный человек в мире, использующий это!
0

Перейти к конкретному коммиту из 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.

  • 2
    спасибо за ваш ответ, к вашему сведению: это: git log --abbrev-commit --pretty=oneline может быть сокращено до git log --oneline

Ещё вопросы

Сообщество Overcoder
Наверх
Меню