使用Git从先前的提交分支


1797

如果我有n次提交,如何从n-3次提交中分支出来?

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

Answers:


2543

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

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。
Dan Benamy 2013年

53
@MattFenwick Git将允许您在允许散列的任何地方使用缩短的散列,只要在存储库中缩短的散列是“唯一的”即可。因此,如果不起作用,请尝试从哈希中添加另一个字符。

29
要将新分支正确推送到服务器,请执行此最后一步:git push origin BRANCH_NAME
Gene Bo

3
<sha1-of-commit>运行开始分支,git checkout -b <name-of-branch> <sha1-of-commit>但是如果分支已经存在git checkout -B <name-of-branch> <sha1-of-commit>
mostafazh

258

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

  1. 转到您的项目。
  2. 点击“提交”。
  3. 单击要分支的提交上的<>(“在历史记录中此时浏览存储库”)。
  4. 单击左上方的“树:xxxxxx”。在语言统计信息栏的下方,您将获得“查找或创建分支”的选项(只需在此处输入新的分支名称)从上一次提交分支

4
问题不是关于github,而是关于git。大多数git服务器不是github。
Anders Tornblad

46
尽管事实上这不是Github,但仍然很有帮助!
丽兹

不幸的是,它仍然显示了其他提交的更改,我想避免这样做,这就是为什么我搜索这个问题的原因
Maxim

83

魔术可以通过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

从这一刻起,所有最新的x提交都仅在新分支中,而不再在先前的工作分支(主节点)中。


7
这就是我一直在寻找的内容,因为它从Master删除了提交,并使其好像您记得在进行这些提交之前创建分支一样。谢谢。
superbeck

7
只是不要忘记,git reset --hard如果您已经将提交推向原点,那么这不是一个好主意...
LuisF

1
git push --force 如果您之前已经推动过分支机构,那么可以
米兰


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>”(已接受的答案)有何不同?
Peter Mortensen

我不知道。我认为它们是等效的。我总是git checkout -b用来创建一个新的分支。
泰勒·朗

10
stackoverflow.com/a/7987711/3590629 git branch ...创建分支,但将您留在当前分支上。git checkout -b ...创建分支并将您切换到该分支。
esme_louise

9

在您的Github存储库上执行此操作的快速方法如下:

  • 从您的分支中找到特定的提交
  • 在SHA ID旁边,点击“在历史记录中的这一点浏览存储库”
  • 在这里,您可以根据该提交创建一个新分支 在此处输入图片说明

1
这实际上已经过时了
regetskcob

2
问题不是关于github。
Anders Tornblad

8

只需运行:

git checkout -b branch-name <commit>

例如 :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

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


1
我很喜欢这个。谢谢
傻瓜

是否可以基于通过拉取请求删除的功能分支的SHA提交创建分支?还是我必须从提交对master的pull request分支出来?
user2966445 '19

使用终端在项目文件夹中运行git fetchgit branch命令,然后检查功能分支是否存在,如果是这种情况,那么是的,当然,您将无法从已删除的分支创建分支,如果出现这种情况,还可以还原分支删除分支不见了
d1jhoni1b

4

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

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。

在后续文本中搜索单词“ 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>]

并做了。


1
我讨厌git。谢谢。
拜伦·惠特洛克

4

要在Eclipse中执行此操作:

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

它将为您创建一个本地分支。然后,每当您推送更改时,您的分支便会被推送到远程服务器。


3

您可以在Stash中进行。

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

这是什么GUI?GitHub?
ostrichofevil

Atlassian Stash
David Ruan

3

我能够这样做:

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

您必须在其中输入跳过值的地方。0是最新的,1是前一个,2是在此之前的提交,依此类推。


4
为什么不仅仅使用HEAD~1(其中1表示1次提交)?
jduncanator

1
所选答案将覆盖您的方法,并且效果很好。我的选择与选择的答案不同。
Mike Graf

3

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

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

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


3

使用Sourcetree | 最简单的方法。

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

在此处输入图片说明


终于找到了这个有用的答案。谢谢
Firda Sahidi

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

在这种情况下,8a75b001096536b3216022484af3026aa9c7bb5bwas和old提交属于该master分支。


1

转到git仓库的特定提交

有时在git存储库上工作时,您想返回到特定的提交(修订)以在特定的时间获得项目的快照。为此,您只需要提交的SHA-1哈希即可,您可以使用以下命令轻松地检查日志:

git log --abbrev-commit --pretty=oneline

这将为您提供所有提交的简要列表以及SHA-1哈希的简短版本。

现在,您知道要提交的哈希值,您可以使用以下两个命令之一:

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用户,您可以可视化所有历史记录(如有必要),然后右键单击要从其分支的提交,然后输入分支名称。

输入分行名称

可视化所有历史


仅当用户使用任何基于UI的操作系统(例如Windows和MAC)时,此方法才有效
Saurabhcdt

那就对了。我的回复特别以“ For Git GUI用户...”开头。我尚未给出对所有人都适用的答复-已经完成。我提供了一种替代方法,对于许多人来说可能更容易。我认为我不喜欢我的答复的原因是,它不能为每个人提供解决方案,但是已经有成千上万的支持。但是,这并不会使我的回答错误“对于Git GUI用户!”。GUI中有CREATE NEW BRANCH。我怀疑我是世界上唯一使用它的人!
伊万,

0

在Visual Studio 2015和2017中执行可接受的答案:

点击更改

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

单击操作以查看历史记录

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

新的标签页将打开:

历史记录标签

并且您应该右键单击您希望代码还原为的上一个提交: 右键单击上一次提交

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

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

右键单击上一个提交并重新定义


请以英语分享您的答案,因为我们大多数人不会说英语,也不会说其他外语。
Shamiul Hasan Rumman

@ShamiulHasanRumman,在解释图片的文字中-通常在下面-我将红色箭头指向的术语翻译成英文,就像单击动作(上面的红色箭头),这还不够吗?
Marcelo Scofano

@MarceloScofano,在截屏之前很难用英语切换编辑器吗?
Andrew Surdu

1
@AndreiSurdu:因为我从来不需要这样做,所以我希望将其更改为英语,我必须安装一些额外的软件包。但是您是对的,它只需要重新启动VS,就完全不需要安装。我会在业余时间尝试更改以上图像。
Marcelo Scofano

0

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

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

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.