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

dol*_*oug 1658 git branch git-branch

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

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

CB *_*ley 2327

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

git branch branchname <sha1-of-commit>
Run Code Online (Sandbox Code Playgroud)

或者使用符号引用:

git branch branchname HEAD~3
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b branchname <sha1-of-commit or HEAD~3>
Run Code Online (Sandbox Code Playgroud)

  • @MattFenwick Git将允许您在允许散列的地方使用缩短的散列,只要缩短的散列在存储库中是"唯一的".因此,如果它不起作用,请尝试从哈希中添加另一个字符. (50认同)
  • Git 1.8.2让我使用短sha1作为第一种形式. (38认同)
  • 要将新分支正确地推送到服务器..需要最后一步:`git push origin BRANCH_NAME` (27认同)
  • 从 `&lt;sha1-of-commit&gt;` 开始一个分支,运行 `git checkout -b &lt;name-of-branch&gt; &lt;sha1-of-commit&gt;` 但如果分支已经存在 `git checkout -B &lt;name-of -branch&gt; &lt;sha1-of-commit&gt;` (4认同)
  • 这也适用于使用创建选项的更新的“switch”命令:“git switch -cbranchname &lt;sha1-of-commit or HEAD~3&gt;” (2认同)

One*_*oob 238

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

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

  • 虽然这是Github不是git,但它仍然非常有用! (28认同)
  • 问题不是关于github,而是关于git。大多数git服务器不是github。 (2认同)

Jin*_* Li 78

魔法可以通过git reset来完成.

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

  • 我不明白这个答案的逻辑。发布者想要使用先前提交的代码创建一个新分支。这似乎是从当前的 master 创建一个分支,然后将 master 恢复到以前的提交。我错了吗? (9认同)
  • 这就是我一直在寻找,因为它会从主服务器的提交,并使其仿佛你已记得使分支作了这些提交之前.谢谢. (7认同)
  • 只是不要忘记,如果你已经将提交推送到原点,那么`git reset --hard`不是一个好主意... (7认同)
  • 如果你之前已经推送过分支,你可以`git push --force` (2认同)

sta*_*anm 68

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

git checkout <sha1-of-commit>
Run Code Online (Sandbox Code Playgroud)

一旦你发现你想要分支的提交,你就可以在提交中做到这一点(即不先回到master),只需通过常规方式创建一个分支:

git checkout -b <branch_name>
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ong 21

git checkout -b <branch-name> <sha1-of-commit>
Run Code Online (Sandbox Code Playgroud)

  • /sf/answers/559139801/ git branch ...创建分支,但离开当前分支.git checkout -b ...创建分支并切换到它. (9认同)
  • 这与“`git branch branchname &lt;sha1-of-commit&gt;`”(来自接受的答案)有什么不同? (4认同)

Jai*_*oya 16

这就是我所做的:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\[path]\app>git branch
  master
* responsivenavigation
Run Code Online (Sandbox Code Playgroud)

在本例中,8a75b001096536b3216022484af3026aa9c7bb5bwas 和旧提交属于该master分支。


小智 14

还没人提到git switch吗?

你可以做:

git checkout <commit-hash>

或者使用符号引用:

git checkout HEAD~3

进而:

git switch -c my-new-feature-branch


Pur*_*ket 12

一个很好的相关问题是:您如何使用--helpgit 选项来解决这个问题?让我们试试这个:

git branch --help
Run Code Online (Sandbox Code Playgroud)

我们看到这个输出:

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>]
Run Code Online (Sandbox Code Playgroud)

狼吞虎咽。

在随后的文本中搜索“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.
Run Code Online (Sandbox Code Playgroud)

我们正在到达某个地方!

现在,专注于 gobbledegook 的这一行:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
Run Code Online (Sandbox Code Playgroud)

将其浓缩为:

git branch <branchname> [<start-point>]
Run Code Online (Sandbox Code Playgroud)

并做了。


Ale*_*lov 10

这将使用一个命令创建分支:

git push origin <sha1-of-commit>:refs/heads/<branch-name>
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方式而不是上面发布的方式,因为它会立即创建分支(之后不需要额外的推送命令)。


Vat*_*ekh 9

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

  • 从您的分支中查找特定的提交
  • 在SHA id旁边,点击"在历史记录中的此处浏览回购"
  • 在这里,您可以从此提交创建一个新分支 在此输入图像描述

  • 这实际上已经过时了 (2认同)
  • 问题不是关于github。 (2认同)

Dar*_*ary 8

使用Sourcetree | 最简单的方法。

  • 首先,签出要进行特定提交的分支以创建新分支。
  • 然后查看工具栏,选择 Repository > Branch ... 快捷方式是 Command + Shift + B。
  • 并选择您要进行的特定提交。并给出一个新的分支名称然后创建一个分支!

在此处输入图片说明


d1j*_*i1b 7

只需运行:

git checkout -b branch-name <commit>
Run Code Online (Sandbox Code Playgroud)

例如 :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8
Run Code Online (Sandbox Code Playgroud)

checkout带有参数的命令-b将创建一个新分支并将您切换到该分支