如果我有n次提交,我怎么能从n-3提交分支?
我可以看到每个提交的哈希值。
答案 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上执行此操作:
答案 2 :(得分:68)
魔术可以通过 git reset 完成。
创建一个新分支并切换到它(所以你的所有最新提交都存储在这里)
git checkout -b your_new_branch
切换回上一个工作分支(假设它是主人)
git checkout master
删除最新的x提交,保持主干净
git reset --hard HEAD~x # in your case, x = 3
从现在开始,所有最新的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)
答案 6 :(得分:4)
要在Eclipse中执行此操作:
它将为您创建一个本地分支。然后,无论何时推送更改,您的分支都将被推送到远程服务器。
答案 7 :(得分:4)
你可以在Stash中完成。
答案 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 |最简单的方法。
答案 15 :(得分:0)
答案 16 :(得分:0)
要在Visual Studio 2015和2017中执行公认的答案:
点击更改(上方红色箭头)
单击“操作”(上方的红色箭头),然后单击“下拉菜单”上的“查看历史记录”
新标签页将打开:
选择签出一个新的分支并瞧瞧!
下面,虽然这不是OP问题的一部分,但是我做了很多事情,而且这是一个技巧步骤,至少对我来说是这样:如果您想恢复到先前的提交,而没有签出新的分支,请不要选择还原(!?);您应该选择重新定义--mixed或--hard:
答案 17 :(得分:0)
如果您使用的是非常简单的源代码树。
答案 18 :(得分:0)
如果您正在寻找基于命令行的解决方案,则可以忽略我的答案。 我建议您使用GitKraken。这是一个非凡的git UI客户端。它在主页上显示Git树。您只需要看一下它们,就可以知道项目的进展情况。只需选择一个特定的提交,右键单击它,然后选择选项“在此处创建分支”。它会给您一个文本框来输入分支名称。输入分支名称,选择“确定”,您便已设置好。真的非常好用。