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

时间:2010-05-12 07:21:56

标签: git branch git-branch

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

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

19 个答案:

答案 0 :(得分:2105)

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

git branch branchname <sha1-of-commit>

或者使用符号引用:

git branch branchname HEAD~3

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

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

答案 1 :(得分:217)

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

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

答案 2 :(得分:68)

魔术可以通过 git reset 完成。

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

    git checkout -b your_new_branch

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

    git checkout master

  3. 删除最新的x提交,保持主干净

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

  4. 从现在开始,所有最新的x提交仅在新分支中,而不再在之前的工作分支(master)中。

答案 3 :(得分:63)

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

git checkout <sha1-of-commit>

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

git checkout -b <branch_name>

答案 4 :(得分:20)

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

答案 5 :(得分:9)

在Github回购中快速完成此操作将如下:

  • 查找分支机构的具体提交
  • 在SHA ID旁边,点击历史记录中的&#39;浏览回购&#39;
  • 您可以在此处通过此提交enter image description here
  • 创建新分支

答案 6 :(得分:4)

要在Eclipse中执行此操作:

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

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

答案 7 :(得分:4)

你可以在Stash中完成。

  1. 点击提交
  2. 点击屏幕右上角的&#34;标记此提交&#34;
  3. 然后,您可以从刚刚创建的标签创建新分支。

答案 8 :(得分:3)

我能够这样做:

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

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

答案 9 :(得分:3)

一个很大的相关问题是:你是如何使用git的--help选项来解决这个问题的?我们试试这个:

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

完成了。

答案 10 :(得分:2)

只需运行:

git checkout -b branch-name <commit>

例如:

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

带有参数checkout的{​​{1}}命令将创建一个新分支 AND ,它将切换到该分支

答案 11 :(得分: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分支。

答案 12 :(得分: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之间的区别,建议阅读the official git blog

答案 13 :(得分:1)

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

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

与上面发布的方法相比,我更喜欢这种方式,因为它可以立即创建分支(此后不需要额外的push命令)。

答案 14 :(得分:1)

使用 Sourcetree |最简单的方法。

  • 首先,签出您要进行特定提交以创建新分支的分支。
  • 然后查看工具栏,选择“存储库”>“分支” ...快捷键是Command + Shift + B。
  • 然后选择您要执行的特定提交。 并命名一个新的分支,然后创建一个分支!

enter image description here

答案 15 :(得分:0)

Select Commit

对于Git GUI用户,您可以可视化所有历史记录(如有必要),然后右键单击要从中分支的提交并输入分支名称。

Enter Branch name

Visualize all the history

答案 16 :(得分:0)

要在Visual Studio 2015和2017中执行公认的答案:

Click in alterations

点击更改(上方红色箭头)

Click Actions to View History

单击“操作”(上方的红色箭头),然后单击“下拉菜单”上的“查看历史记录”

新标签页将打开:

History tab

并且您应该右键单击您希望代码还原为的上一个提交: right click the previous commit

选择签出一个新的分支并瞧瞧!

下面,虽然这不是OP问题的一部分,但是我做了很多事情,而且这是一个技巧步骤,至少对我来说是这样:如果您想恢复到先前的提交,而没有签出新的分支,请不要选择还原(!?);您应该选择重新定义--mixed或--hard:

right click the previous commit and redefine

答案 17 :(得分:0)

如果您使用的是非常简单的源代码树。

  • 在需要创建新分支的位置右键单击提交
  • 点击“分支”
  • 出现对话框中新分支的类型名称,然后单击“创建分支”

答案 18 :(得分:0)

如果您正在寻找基于命令行的解决方案,则可以忽略我的答案。 我建议您使用GitKraken。这是一个非凡的git UI客户端。它在主页上显示Git树。您只需要看一下它们,就可以知道项目的进展情况。只需选择一个特定的提交,右键单击它,然后选择选项“在此处创建分支”。它会给您一个文本框来输入分支名称。输入分支名称,选择“确定”,您便已设置好。真的非常好用。