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