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


1798

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

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

Ответы:


2547

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

git branch branchname <sha1-of-commit>

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

git branch branchname HEAD~3

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

git checkout -b branchname <sha1-of-commit or HEAD~3>

42
Git 1.8.2 позвольте мне использовать короткий sha1 для первой формы.
Дэн Бенами

53
@MattFenwick Git позволит вам использовать укороченные хеши везде, где разрешен хеш, если укороченный хеш является «уникальным» в хранилище. Так что, если это не сработало, попробуйте добавить еще один символ из хэша.
тыкай

29
Чтобы правильно перенести новую ветку на сервер .. нужен этот последний шаг:git push origin BRANCH_NAME
Джин Бо

3
запустить ветку из <sha1-of-commit>прогона, git checkout -b <name-of-branch> <sha1-of-commit>но если ветка уже существуетgit checkout -B <name-of-branch> <sha1-of-commit>
мостафаж

258

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

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

4
Вопрос не в github, а в git. Большинство git-серверов не являются github.
Андерс Торнблад

46
Несмотря на то, что это Github, а не Git, он все равно был очень полезным!
Лиз

К сожалению, он все еще показывает изменения от других коммитов, которых я хотел избежать, поэтому я искал этот вопрос
Максим

83

Волшебство может быть сделано путем сброса 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).


7
Это то, что я искал, так как он удаляет коммиты из Мастера и делает так, как если бы вы запомнили создание ветки до того, как эти коммиты были сделаны. Спасибо.
Superbeck

7
Только не забывайте, что это git reset --hardне очень хорошая идея, если вы уже выдвинули коммит на источник ...
LuisF

1
Вы можете, git push --force если вы уже нажали на ветку раньше
милан

Но будьте очень осторожны при использовании --force blog.developer.atlassian.com/force-with-lease
Peater

74

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

git checkout <sha1-of-commit>

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

git checkout -b <branch_name>

22
git checkout -b <branch-name> <sha1-of-commit>

1
Чем это отличается от " git branch branchname <sha1-of-commit>" (от принятого ответа)?
Питер Мортенсен

Я не знаю. Я думаю, что они эквивалентны. Я всегда использую, git checkout -bчтобы создать новую ветку.
Тайлер Лонг

10
stackoverflow.com/a/7987711/3590629 git branch ... создает ветку, но оставляет вас в текущей ветке. git checkout -b ... создает ветку и переключает вас на нее.
esme_louise

9

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

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

1
Это на самом деле устарело
regetskcob

2
Вопрос не в github.
Андерс Торнблад

8

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

git checkout -b branch-name <commit>

Например :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

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


1
Мне очень нравится этот. Спасибо
Дурак

Можно ли создать ветку на основе фиксации SHA ветви функции, которая была удалена с помощью запроса на извлечение? Или я должен перейти от фиксации запроса на получение на мастере?
user2966445

запустите git fetch& git branchкоманду на папке вашего проекта с помощью терминала, затем проверьте, существует ли ветвь функции, если это так, то да, конечно, вы не сможете создать ветку из удаленных ветвей, вы также можете отменить удаление ветки в случае, если ветка ушла
d1jhoni1b

4

Большой связанный вопрос: Как, черт возьми, вы можете понять это, используя --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.

Мы куда-то добираемся!

Теперь сфокусируйтесь на этой строчке гобледека:

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

Конденсировать это к этому:

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

И сделано.


1
Я ненавижу мерзавца. Спасибо.
Байрон Уитлок

4

Для этого в Eclipse:

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

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


3

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

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

Что это за графический интерфейс? GitHub?
страусофевил

Atlassian Stash
Дэвид Руан

3

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

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

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


4
Почему бы просто не использовать HEAD~1(где 1 указывает 1 коммит обратно)?
jduncanator

1
Ваш путь покрыт выбранным ответом и работает нормально. Мой другой способ, чем выбранный ответ.
Майк Граф

3

Это создает ветку одной командой:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Я предпочитаю этот способ лучше, чем опубликованные выше, потому что он сразу создает ветку (не требует дополнительной команды push потом).


3

Используя Sourcetree | Самый простой способ.

  • Во-первых, извлеките ветку, в которой вы хотите взять конкретный коммит для создания новой ветки.
  • Затем посмотрите на панель инструментов, выберите «Хранилище»> «Ветвь» ... это сочетание клавиш Ctrl + Shift + B.
  • И выберите конкретный коммит, который вы хотите взять. И дайте имя новой ветви, затем создайте ветку!

введите описание изображения здесь


наконец нашел этот полезный ответ. Спасибо
Фирда Сахиди

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-репозитория

Иногда при работе с 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
Suhaib

0

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

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

Введите название филиала

Визуализируйте всю историю


Это будет работать, только если пользователь использует любую основанную на пользовательском интерфейсе ОС, такую ​​как Windows и MAC
Saurabhcdt

Вот так. Мой ответ начинается со слов «Для пользователей Git GUI ...». Я не дал ответа, который будет работать для всех - это уже сделано. Я дал альтернативный метод, который может быть проще для многих людей. Я думаю, что причина моего ответа не нравится, потому что это не решение для всех, но это уже существует с парой тысяч голосов. Однако это не делает мой ответ неправильным «Для пользователей Git GUI!». Создать новый филиал есть в графическом интерфейсе. Я сомневаюсь, что я единственный человек в мире, использующий это!
Иван

0

Чтобы сделать принятый ответ в Visual Studio 2015 & 2017:

Нажмите в изменениях

Нажмите на изменения (красная стрелка выше)

Нажмите Действия, чтобы просмотреть историю

Нажмите «Действия» (красная стрелка вверху) и выберите «Просмотреть историю» в меню DropDown.

И новая вкладка откроется:

Вкладка История

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

Выберите, чтобы оформить заказ на новую ветку и вуаля!

Ниже, хотя это и не часть вопроса OP, но я делаю и то, и другое, и этот шаг для меня, по крайней мере, для меня: если вы хотите вернуться к предыдущему коммиту, без проверки новой ветки, НЕ выбирайте revert (! ?); Вы должны выбрать переопределить --mixed или --hard:

щелкните правой кнопкой мыши предыдущий коммит и переопределите


Пожалуйста, поделитесь своими ответами на английском языке, так как большинство из нас здесь не говорят или знают другие иностранные языки, кроме английского.
Шамиул Хасан Румман

@ShamiulHasanRumman, в тексте, который объясняет изображения - как правило, ниже - я перевел указанную красную стрелку термин на английский, например, Click in Actions (красная стрелка вверху) Это было недостаточно?
Марсело Скофано,

@MarceloScofano, трудно ли было переключать редактор на английском, прежде чем делать снимки экрана?
Эндрю Сурду

1
@AndreiSurdu: поскольку у меня никогда не было необходимости делать это, я ожидал, что для перехода на английский мне пришлось установить какой-то дополнительный пакет. Но вы правы, требуется только перезагрузка VS, никакой установки. Я постараюсь изменить изображения выше, как только у меня будет свободное время.
Марсело Скофано

0

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

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

0

Если вы ищете решение на основе командной строки, вы можете проигнорировать мой ответ. Я собираюсь предложить вам использовать GitKraken . Это необычный пользовательский интерфейс Git. Это показывает дерево Git на главной странице. Вы можете просто посмотреть на них и узнать, что происходит с проектом. Просто выберите определенный коммит, щелкните его правой кнопкой мыши и выберите опцию «Создать ветку здесь». Это даст вам текстовое поле для ввода названия филиала. Введите название филиала, выберите «ОК» и все готово. Это действительно очень легко использовать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.