【问题标题】:Branch from a previous commit using Git使用 Git 从先前的提交分支
【发布时间】:2011-02-18 11:47:34
【问题描述】:

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

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

【问题讨论】:

    标签: git branch git-branch


    【解决方案1】:

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

    git branch branchname <sha1-of-commit>
    

    或者通过使用符号引用:

    git branch branchname HEAD~3
    

    要在创建分支时检查分支,请使用

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

    【讨论】:

    • Git 1.8.2 让我使用短 sha1 作为第一种形式。
    • @MattFenwick Git 将允许您在任何允许哈希的地方使用缩短的哈希,只要缩短的哈希在存储库中是“唯一的”。因此,如果它不起作用,请尝试从哈希中添加另一个字符。
    • 要将新分支正确推送到服务器.. 需要最后一步:git push origin BRANCH_NAME
    • &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;
    • 还有:git branch branchname HEAD^^^
    【解决方案2】:

    我可以这样做:

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

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

    【讨论】:

    • 为什么不直接使用HEAD~1(其中 1 指定 1 次提交)?
    • 所选答案涵盖了您的方式,并且工作正常。我的方式与所选答案不同。
    【解决方案3】:

    在 Eclipse 中执行此操作:

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

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

    【讨论】:

      【解决方案4】:

      在 github.com 上执行此操作:

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

      【讨论】:

      • 问题不是关于github,而是关于git。大多数 git 服务器不是 github。
      • 尽管这是 Github 而不是 git,但它仍然非常有帮助!
      • 不幸的是,它仍然显示来自其他提交的更改,这是我想避免的,这就是我搜索这个问题的原因
      【解决方案5】:

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

      git checkout <sha1-of-commit>
      

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

      git checkout -b <branch_name>
      

      【讨论】:

        【解决方案6】:

        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 中删除提交,并让您好像在提交这些提交之前记得创建分支。谢谢。
        • 不要忘记git reset --hard 不是一个好主意,如果您已经将提交推送到原点...
        • 之前已经推送过分支的可以git push --force
        • 但是使用时要非常小心 --force blog.developer.atlassian.com/force-with-lease
        • 我不明白这个答案的逻辑。发帖人想用上一次提交的代码创建一个新分支。这似乎是从当前 master 创建一个分支,然后将 master 恢复到以前的提交。我错了吗?
        【解决方案7】:

        一个很好的相关问题是:你到底是如何使用 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>]
        

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

        完成了。

        【讨论】:

          【解决方案8】:

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

          • 从您的分支中查找特定提交
          • 在 SHA id 旁边,点击“浏览历史上此时的 repo”
          • 在这里你可以从这个提交创建一个新分支

          【讨论】:

          • 这其实已经过时了
          • 问题不在于github。
          【解决方案9】:

          你可以在 Stash 中做到这一点。

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

          【讨论】:

          • 这是什么图形用户界面? GitHub?
          • Atlassian 藏匿处
          【解决方案10】:
          git checkout -b <branch-name> <sha1-of-commit>
          

          【讨论】:

          • 这与“git branch branchname &lt;sha1-of-commit&gt;”(来自已接受的答案)有何不同?
          • 我不知道。我认为它们是等价的。我总是使用git checkout -b 来创建一个新的分支。
          • stackoverflow.com/a/7987711/3590629 git branch... 创建分支但将您留在当前分支上。 git checkout -b... 创建分支并切换到它。
          【解决方案11】:

          这就是我所做的:

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

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

          【讨论】:

            【解决方案12】:

            转到 git 存储库的特定提交

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

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

            这将为您提供所有提交的紧凑列表和 SHA-1 哈希的简短版本。

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

            git checkout HASH
            

            git reset --hard HASH
            

            结帐

            git checkout &lt;commit&gt; &lt;paths&gt;

            告诉 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

            【讨论】:

            • 谢谢你的回答,仅供参考:这个:git log --abbrev-commit --pretty=oneline 可以缩写为git log --oneline
            【解决方案13】:

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

            【讨论】:

            • 这仅在用户使用任何基于 UI 的操作系统(如 Windows 和 MAC)时才有效
            • 没错。我的回复特别以“For Git GUI users ...”开头。我还没有给出对每个人都有效的答复——这已经完成了。我给出了另一种方法,它可能对很多人来说更容易。我认为我的回复不受欢迎的原因是因为它不是每个人的解决方案,但已经存在几千个赞成票。但是,这不会使我的回复错误“对于 Git GUI 用户!”。 GUI 中有 CREATE NEW BRANCH。我怀疑我是世界上唯一使用它的人!
            【解决方案14】:

            简单运行:

            git checkout -b branch-name <commit>
            

            例如:

            git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8
            

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

            【讨论】:

            • 是否可以根据通过拉取请求删除的功能分支的 SHA 提交创建分支?还是我必须从 master 上的 pull request 提交分支?
            • 使用终端在项目文件夹上运行git fetch & git branch 命令,然后检查功能分支是否存在,如果是这种情况,那么是的,当然你将无法创建分支从已删除的分支中,您还可以在分支消失的情况下恢复分支删除
            【解决方案15】:

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

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

            【讨论】:

              【解决方案16】:

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

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

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

              【讨论】:

                【解决方案17】:

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

                【讨论】:

                  【解决方案18】:

                  使用 Sourcetree |最简单的方法。

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-01-15
                    • 2016-03-01
                    • 2012-07-03
                    • 2018-12-05
                    • 2017-09-11
                    • 2020-05-07
                    • 2011-01-26
                    相关资源
                    最近更新 更多