题 使用Git从先前的提交中分支


如果我有n次提交,我怎样才能从n-3提交中分支?

我可以看到每个提交的哈希值。


1275
2018-05-12 07:21


起源




答案:


您可以通过哈希创建分支:

git branch branchname <sha1-of-commit>

或者使用符号引用:

git branch branchname HEAD~3

要在创建分支时签出分支,请使用

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

1780
2018-05-12 07:24



你也可以使用 git checkout -b branchname <commit> - Ajedi32
Git 1.8.2让我使用短sha1作为第一种形式。 - Dan Benamy
@MattFenwick Git将允许您在允许散列的地方使用缩短的散列,只要缩短的散列在存储库中是“唯一的”。因此,如果它不起作用,请尝试从哈希中添加另一个字符。 - poke
要将新分支正确地推送到服务器..需要最后一步: git push origin BRANCH_NAME - gnB
对那些不确定的人, git checkout -b branchname <commit> 使新分支AND切换到它 - information_interchange


要在github.com上执行此操作:

  1. 转到您的项目。
  2. 点击“提交”。
  3. 点击 <> (对于要分支的提交,“在历史记录中此时浏览存储库”)。
  4. 单击左上角的“tree:xxxxxx”。在语言统计栏下方,您将获得“查找或创建分支”选项(只需在其中键入新的分支名称) Branch from previous commit

176
2017-08-08 22:08



这仍然可用吗?我根本找不到它。 - Instantsoup
看起来它现在已经消失了。 - OneSolitaryNoob
它还在那里!他们只是搬了它。我更新了说明。顺便说一句,很棒的提示! - bfred.it
谢谢!它肯定是隐藏的。 - OneSolitaryNoob
你是一个救生员。我做了最糟糕的事情,今天用力推动掌握,这使我的心率恢复正常。 - bitwit


如果您不确定要提前分支哪个提交,可以检查提交并检查其代码(请参阅源代码,编译,测试)

git checkout <sha1-of-commit>

一旦你找到你想要分支的提交,你可以在提交中做到这一点(即不首先回到主服务器),只需通过通常的方式创建一个分支:

git checkout -b <branch_name>

54
2018-02-10 16:43





魔术可以通过 git重置

  1. 创建一个新分支并切换到它(所以你的所有最新提交都存储在这里)

    git checkout -b your_new_branch

  2. 切换回上一个工作分支(假设它是主人)

    git checkout master

  3. 删除最新的x提交,保持master清理

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

从此刻起,所有最新的x提交仅在新分支中,而不再在您之前的工作分支(master)中。


50
2017-08-03 09:04



这就是我正在寻找的东西,因为它删除了Master的提交,并使它好像你记得在提交之前创建了分支。谢谢。 - superbeck
只是不要忘记一个 git reset --hard 如果你已经将提交推送到原点,那不是一个好主意... - LuisF


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

17
2017-07-11 07:11



这有什么不同于“git branch branchname <sha1-of-commit>“(从接受的答案)? - Peter Mortensen
我不知道。我认为它们是等价的。我总是用 git checkout -b 创建一个新的分支。 - Tyler Long
stackoverflow.com/a/7987711/3590629 git branch ...创建分支,但离开当前分支。 git checkout -b ...创建分支并切换到它。 - esme_louise


在Github回购中快速完成此操作的方法如下:

  • 从您的分支中查找特定的提交
  • 在SHA id旁边,点击“在此历史中浏览回购”
  • 在这里,您可以通过此提交创建一个新分支 enter image description here 

6
2018-01-14 17:51



这实际上已经过时了 - regetskcob
嘿,在github.com上查看,它仍然有效 - Vatsal Parekh
问题不在于github。 - Anders Tornblad


你可以在Stash中完成。

  1. 单击提交
  2. 在屏幕的右上角,单击“标记此提交”
  3. 然后,您可以从刚刚创建的标记创建新分支。

4
2018-01-18 17:20



这是什么GUI? GitHub的? - ostrichofevil
Atlassian Stash - David Ruan


要在Eclipse中执行此操作:

  • 转到“Git Repository Exploring”透视图。
  • 展开“标签”,然后选择要从中创建分支的提交。
  • 右键单击提交,然后选择“创建分支”。
  • 提供分支名称。

它将为您创建一个本地分支。然后,无论何时推送更改,您的分支都将被推送到远程服务器。


4
2018-05-17 12:03





一个很大的相关问题是:你怎么用这个来解决这个问题 --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>]

官样文章。

在后续文本中搜索“commit”一词。我们发现这个:

   <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>]

并做了。


3
2017-07-19 16:35



我讨厌git。谢谢。 - Byron Whitlock


我能够这样做:

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

您必须输入跳过值的位置。 0是最新的,1是前一个,2是之前的提交,等等。


3
2018-01-31 21:36



为什么不用 HEAD~1 (其中1指定1次提交)? - jduncanator
选择的答案涵盖了您的方式,并且工作正常。我的选择方式与选定答案不同。 - Mike Graf


这就是我做的:

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
2018-06-14 08:23