ChatGPT解决这个技术问题 Extra ChatGPT

使用 Git 从之前的提交分支

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

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


N
NextInLine

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

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
<sha1-of-commit> 开始一个分支运行 git checkout -b <name-of-branch> <sha1-of-commit> 但如果该分支已经存在 git checkout -B <name-of-branch> <sha1-of-commit>
另外:git branch branchname HEAD^^^
P
Peter Mortensen

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

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


尽管这是 Github 而不是 git,但它仍然非常有帮助!
不幸的是,它仍然显示来自其他提交的更改,这是我想避免的,这就是我搜索这个问题的原因
v
vinzee

魔术可以通过 git reset 来完成。

创建一个新分支并切换到它(所以你所有的最新提交都存储在这里) git checkout -b your_new_branch 切换回你以前的工作分支(假设它是主分支) git checkout master 删除最新的 x 提交,保持 master 干净 git reset --hard HEAD~x # 在你的情况下,x = 3

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


这就是我一直在寻找的,因为它会从 Master 中删除提交,并让您好像在提交这些提交之前记得创建分支。谢谢。
只是不要忘记,如果您已经将提交推送到原点,则 git reset --hard 不是一个好主意......
如果您之前已经推送过分支,则可以git push --force
但是在使用 --force blog.developer.atlassian.com/force-with-lease 时要非常小心
我不明白这个答案的逻辑。发帖人想用上一次提交的代码创建一个新分支。这似乎是从当前 master 创建一个分支,然后将 master 恢复到以前的提交。我错了吗?
s
stanm

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

git checkout <sha1-of-commit>

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

git checkout -b <branch_name>

d
d1jhoni1b

只需运行:

git checkout -b branch-name <commit>

例如 :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

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


是否可以基于通过拉取请求删除的功能分支的 SHA 提交创建分支?还是我必须从 master 上的 pull request 提交分支?
运行 git fetch & git branch 使用终端对项目文件夹执行命令,然后检查功能分支是否存在,如果是这种情况,那么是的,当然您将无法从已删除的分支创建分支,您也可以恢复分支删除以防万一树枝不见了
T
Tyler Liu
git checkout -b <branch-name> <sha1-of-commit>

这与“git branch branchname <sha1-of-commit>”(来自接受的答案)有何不同?
我不知道。我认为它们是等价的。我总是使用 git checkout -b 创建一个新分支。
stackoverflow.com/a/7987711/3590629 git branch... 创建分支但将您留在当前分支。 git checkout -b... 创建分支并将您切换到它。
A
Alexander Samoylov

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

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

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


我什至不知道这就是我要找的东西。谢谢。
J
Jaime Montoya

这就是我所做的:

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 分支的旧提交。


P
Pengguna

使用 Sourcetree |最简单的方法。

首先,签出要进行特定提交以创建新分支的分支。

然后查看工具栏,选择 Repository > Branch ... 快捷方式是 Command + Shift + B。

并选择您要进行的特定提交。并给一个新的分支名称然后创建一个分支!

https://i.stack.imgur.com/c6rox.jpg


P
Purplejacket

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

并做了。


V
Vatsal Parekh

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

从您的分支中查找特定的提交

在 SHA id 旁边,单击“浏览历史记录中此时的存储库”

在这里,您可以从此提交创建一个新分支


这实际上已经过时了
问题与 github 无关。
这个答案的重复? stackoverflow.com/a/18137009/1175496
P
Peter Mortensen

要在 Eclipse 中执行此操作:

转到“Git 存储库探索”透视图。

展开“标签”并选择要从中创建分支的提交。

右键单击提交并选择“创建分支”。

提供分支名称。

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


D
David Ruan

您可以在 Stash 中执行此操作。

点击提交 在屏幕的右上方点击“标记这个提交”然后你可以从你刚刚创建的标签创建新的分支。


这是什么图形用户界面? GitHub?
Atlassian 藏匿处
P
Peter Mortensen

我能够这样做:

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

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


为什么不直接使用 HEAD~1 (其中 1 指定 1 次提交)?
所选答案涵盖了您的方式,并且工作正常。我的方式与所选答案不同。
L
L Y E S - C H I O U K H

转到 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


感谢您的回答,仅供参考:这:git log --abbrev-commit --pretty=oneline 可以缩写为 git log --oneline
I
Ivan

https://i.stack.imgur.com/m9oKm.png

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

https://i.stack.imgur.com/yE8u8.png

https://i.stack.imgur.com/wGPzg.png


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

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


T
Trisped

我使用了 Git Gui(Windows 版 GIT 附带)。

在菜单栏上,打开 Branch 菜单并选择 Create... 在 Branch Name 部分中指定新分支的名称 Select Revision Expression: 在 Start Revision 部分中并输入提交 ID(我只是使用了来自Visual Studio 和它的工作)

https://i.stack.imgur.com/HWQWQ.png


j
jlaurens

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


A
Arun Sudhakaran

使用源树 [当前使用的版本:3.1.3]

在源代码树中打开历史记录

https://i.stack.imgur.com/G16vF.png

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


I
Ibtisam Asif

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

右键单击需要创建新分支的提交

点击“分支”

在出现的对话框中输入新分支的名称,然后单击“创建分支”