使用Git从以前的提交分支

如果我有N提交,我如何从N-3提交分支?

1038513 次浏览

使用提交哈希创建分支:

git branch branch_name <commit-hash>

或者使用符号引用:

git branch branch_name HEAD~3

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

git checkout -b branch_name <commit-hash or HEAD~3>

我可以这样做:

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

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

在Eclipse中执行此操作:

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

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

在github.com:

  1. 去你的项目。
  2. 点击“提交”。
  3. 单击要从其分支的提交上的<>(“在此历史记录中浏览存储库”)。
  4. 单击左上角的“tree: xxxxxx”。就在语言统计栏下方,您将获得“查找或创建分支”的选项(只需在那里输入一个新的分支名称)

如果您不确定要从哪个提交中提前分支,您可以通过以下方式检查提交并检查它们的代码(请参阅源代码、编译、测试)

git checkout <sha1-of-commit>

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

git checkout -b <branch_name>

魔法可以由git重置完成。

  1. 创建一个新分支并切换到它(因此您的所有最新提交都存储在此处)

    git checkout -b your_new_branch
  2. 切换回以前的工作分支(假设它是master)

    git checkout master
  3. 删除最新的x提交,保持master干净

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

从这一刻起,所有最新的x提交都只在新分支中,不再在您以前的工作分支(master)中。

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

git branch --help

我们看到这个输出:

NAMEgit-branch - List, create, or delete branches
SYNOPSISgit 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>]

鬼怪。

在随后的文本中搜索“提交”这个词。我们发现:

   <start-point>The new branch head will point to this commit. It may be given as a branch name, acommit-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>]

完成了。

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

  • 从你的分支中找到具体的提交
  • 在SHA id旁边,单击“在历史中的此点浏览存储库”
  • 在这里,您可以从此提交输入图片描述创建一个新分支

您可以在Stash中使用它。

  1. 点击提交
  2. 在屏幕的右上角单击“标记此提交”
  3. 然后,您可以从刚刚创建的标记创建新分支。
git checkout -b <branch-name> <sha1-of-commit>

这就是我所做的:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5bSwitched to a new branch 'responsivenavigation'
C:\Users\jaimemontoya\[path]\app>git branchmaster* responsivenavigation

在这种情况下,8a75b001096536b3216022484af3026aa9c7bb5b是属于master分支的旧提交。

转到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重置只会移动HEAD要重置分支,首先检查它。

如果你想了解更多关于git重置和git签出之间的区别,我建议阅读官方git博客

选择提交

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

输入分支名称

可视化所有历史记录

只需运行:

git checkout -b branch-name <commit>

例如:

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

带有参数-bcheckout命令将创建一个新的分支,它会将您切换到它

如果你使用源代码树,这是非常直接的。

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

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

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

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

如果您正在寻找基于命令行的解决方案,您可以忽略我的答案。我建议你使用GitKraken。这是一个非凡的git UI客户端。它在主页上显示了Git树。你可以只看它们并知道项目发生了什么。只需选择一个特定的提交,右键单击它并选择选项“在此处创建分支”。它会给你一个输入框来输入分支名称。输入分支名称,选择“确定”,你就设置好了。这真的很容易使用。

使用源树|最简单的方法。

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

在此处输入图片描述

我使用了gitgui(GIT for Windows附带)。

  1. 在菜单栏上,打开菜单并选择创建…
  2. 分支机构名称部分中指定新分支的名称
  3. 开始修订部分中选择修改表达式:并输入提交ID(我刚刚使用了Visual Studio中的8位ID并且它起作用了)

创建新分支对话框窗口

使用GitHub Desktop,显示历史窗格并右键单击您想要的提交,然后选择菜单项“从提交创建分支”。

带有源代码树[当前使用的版本:3.1.3]

  1. 在源代码树中打开历史

在源代码树中查找历史记录

  1. 它将列出主窗口中的所有提交
  2. 右键单击所需的提交,然后单击Branch...选项。
  3. 在新窗口中为分支命名,然后单击Create branch
  4. 新分支(系统本地)将与其他现有分支一起位于左侧,您可以将其推送到源以将其带到存储库,这样其他用户就可以使用它。

还没有人提到git开关吗?

你可以这样做:

git checkout <commit-hash>

或者使用符号引用:

git checkout HEAD~3

然后:

git switch -c my-new-feature-branch