ChatGPT解决这个技术问题 Extra ChatGPT

从另一个分支在 Git 中创建一个分支

我有两个分支:master 和 dev

我想从 dev 分支创建一个“功能分支”。

目前在分支开发,我做:

$ git checkout -b myfeature dev

... (一些工作)

$ git commit -am "blablabla"
$ git push origin myfeature

但是,在可视化我的分支之后,我得到了:

--**master**
------0-----0-----0-----0-----0
------------------------**dev**----**myfeature**

我的意思是分支似乎合并了,我不明白为什么......

我做错了什么?

你能解释一下你是如何从另一个分支分支出来并推回功能分支的远程存储库的吗?

所有这些都在像 the one described here 这样的分支模型中。

需要明确的是,您是在问为什么 myfeature 分支是 ff 合并的,而不是其他形式的合并?或者你在问为什么它被合并了?后一个问题对我来说更有意义,因为我在明显的 ff 合并观察之前没有看到合并命令。
在您的情况下, myfeature 只是在 dev 之前提交了几个提交,这就是它以这种方式可视化的原因。他们没有并指出提交分歧的地方。一旦 dev 分支获得了一些额外的提交,您将看到它是具有分歧提交的分支,不能只是快进。

P
Paul Reiners

如果您喜欢您发布的链接中的方法,请查看 Git Flow

这是他为该工作流程创建的一组脚本。

但要回答你的问题:

$ git checkout -b myFeature dev

从 dev 创建 MyFeature 分支。做你的工作然后

$ git commit -am "Your message"

现在将您的更改合并到 dev 无需快进

$ git checkout dev
$ git merge --no-ff myFeature

现在将更改推送到服务器

$ git push origin dev
$ git push origin myFeature

你会看到你想要的样子。


dev 合并后推送 myFeature 的重要性是什么?
@spartacus 如果 myFeature 分支在合并之前被推送到服务器,那么什么都没有。但如果 myFeature 尚未推送到服务器并且您希望它出现在服务器中,则必须将其推送到 appart。
git checkout -b myFeature dev 是否与以下 3 个命令相同:git checkout dev,然后是 git branch myFeature,然后是 git checkout myFeature
是,或者应该是。你看到了什么不同的东西吗?
为了澄清其他新手,this is what a --no-ff merge looks like
S
Sampath

如果您想从 Git 中的任何现有分支创建新分支,只需按照选项操作即可。

首先更改/签出到要创建新分支的分支。例如,如果您有以下分支,例如:

掌握

开发者

分支1

因此,如果您想在名为“branch1”的分支下创建一个名为“subbranch_of_b1”的新分支,请按照以下步骤操作:

签出或更改为“branch1” git checkout branch1 现在使用以下命令在“branch1”下创建名为“subbranch_of_b1”的新分支。 git checkout -b subbranch_of_b1 branch1 上面将在分支 branch1 下创建一个名为 subbranch_of_b1 的新分支(请注意,上述命令中的 branch1 不是强制性的,因为 HEAD 当前指向它,如果您在不同的分支虽然)。现在,在使用 subbranch_of_b1 之后,您可以在本地或远程提交和推送或合并它。

https://i.stack.imgur.com/6qEWk.jpg

将 subbranch_of_b1 推送到远程

 git push origin subbranch_of_b1 

如何将 subbranch_of_b1 推送到远程?
@user269867:“ git push origin subbranch_of_b1 ”将为您完成这项工作。
现在,如果我将更改推送到 master ,它会自动发生在 branch1 中吗?
请注意,上述命令中的 branch1 不是强制性的,因为 HEAD 当前指向它,如果您在不同的分支上,您可以精确它,尽管这就是我正在寻找的
我来到这里想知道 git checkout -b some-branch 是否是 git checkout -b some-branch master 的简写。原来 git checkout -b some-branchgit checkout -b some-branch <current_active_branch> 的简写
G
Gnanasekar S

创建一个分支

签出主分支时创建分支。这里 master 中的提交将同步到您创建的分支。 $ git 分支分支 1

签出 branch1 时创建分支。这里 branch1 中的提交将同步到 branch2 $ git branch branch2

结帐一个分支

git checkout 命令切换分支或恢复工作树文件

git checkout 分支名称

重命名分支

git 分支 -m 分支 1 新分支名称

删除分支

git branch -d 分支删除

git branch -D branch-to-delete(强制删除而不检查合并状态)

创建和切换分支

git checkout -b 分支名

完全包含的分支

git 分支 --merged

****************************** 分支差异 [ git diff branch1..branch2 ] ************** **********

多行差异

git diff master..branch1

单行差异

git diff --color-words branch1..branch2


同样在重命名分支后使用 git push origin :old-name new-name 删除旧名称远程分支并推送新名称本地分支。
G
Gabriel Staples

从另一个分支在 git 中创建分支的各种方法:

这个答案增加了一些额外的见解,现有答案中还没有,仅涉及问题本身的标题(从另一个分支在 Git 中创建一个分支),但没有解决已经有足够答案的问题的更狭窄细节这里。

我之所以添加这个,是因为我现在真的需要知道如何在下面执行#1(从我没有签出的分支创建一个新分支),而且如何做到这一点并不明显,谷歌搜索导致到这里作为热门搜索结果。所以,我将在这里分享我的发现。如果有的话,这里的任何其他答案都没有很好地涉及到这一点。

在此期间,我还将在下面添加我在常规工作流程中使用的其他最常见的 git branch 命令。

1. 要从您尚未签出的分支创建新分支:

在您签出任何分支时从 branch1 创建 branch2(例如:假设您已签出 master):

git branch branch2 branch1

一般格式为:

git branch <new_branch> [from_branch]

man git branch 如下所示。我所说的 <new_branch> 就是他们所说的 <branchname>,我所说的 [from_branch] 就是他们所说的 [<start-point>]

git 分支 [--track | --no-track] [-l] [-f] []

2. 要从您已签出的分支创建新分支:

git branch new_branch

这对于在变基、压缩、硬重置等之前进行备份非常有用——在做任何可能严重破坏你的分支的事情之前。

例如:我在 feature_branch1,我即将使用 git rebase -i master 将 20 个提交压缩为 1 个。如果我想“撤消”这个,让我们先备份这个分支!我这样做 ALL...THE...TIME 并发现知道我总是可以轻松回到这个备份分支并重新分支,这非常有帮助和安慰如果我在此过程中搞砸feature_branch1,请再试一次:

git branch feature_branch1_BAK_20200814-1320hrs_about_to_squash

20200814-1320hrs 部分是格式为 YYYYMMDD-HHMMhrs 的日期和时间,即 2020 年 8 月 14 日 13:20 小时(下午 1:20)。这样我可以轻松找到备份分支,直到我确定我已经准备好删除它们了。如果你不这样做并且你搞砸了,你必须在搞砸之前使用 git reflog 去找到你的分支,这更加困难,压力更大,更容易出错。

感叹词:关于 git checkout 与 git switch 的注释

可以做 1000 件事的经典通用“瑞士军刀”:git checkout。 git checkout 的新的和实验性的替代命令:git switch + git restore。

git switch 最近在 Git v2.23 中添加。使用 git --version 查看您的 git 版本。它被设计为 git checkout 的一种极其有限的形式,用于切换分支,而不是像 git checkout 那样具有签出或恢复文件的能力。在此处阅读更多信息:https://www.git-tower.com/learn/git/commands/git-switch.

另请参阅:What does git checkout still do after git switch got introduced?git restore 提供了 git switch 不包含的 git checkout 的一些其余功能。

man git switchman git restore 警告:

此命令是实验性的。行为可能会改变。

因此,如果您愿意,请随意使用 git checkout。它的行为不太可能改变。

我自己几乎只使用 git checkout,但如果您愿意,欢迎您使用 git switch(和 git restore 来恢复或“签出”文件)。

3. 要从您已签出的分支创建并签出新分支:

# the standard, "classic" command most people still use; `-b` stands
# for "create 'b'ranch"
git checkout -b new_branch

# the newer, "experimental" command now available as of Git v2.23; `-c` stands 
# for "'c'reate branch"
git switch -c new_branch

为了清楚那里发生的事情,请知道上面的这个命令等同于这两个单独的命令:

# classic
git branch new_branch
git checkout new_branch

# OR: new/experimental as of Git v2.23
git branch new_branch
git switch new_branch

4. 要从您尚未签出的分支创建和签出新分支:

# classic
git checkout -b new_branch from_branch

# OR: new/experimental as of Git v2.23
git switch -c new_branch from_branch

为了清楚那里发生的事情,请知道上面的这个命令等同于这三个单独的命令:

# classic
git checkout from_branch
git branch new_branch
git checkout new_branch

# OR: new/experimental as of Git v2.23
git switch from_branch
git branch new_branch
git switch new_branch

5.重命名分支

就像重命名终端中的常规文件或文件夹一样,git 认为“重命名”更像是一个 'm'ove 命令,因此您使用 git branch -m 重命名分支。这是一般格式:

git branch -m <old_name> <new_name>

man git branch 显示如下:

git 分支 (-m | -M) []

示例:让我们将 branch_1 重命名为 branch_1.5

git branch -m branch_1 branch_1.5

或者,如果您已签出 branch_1,则可以将 currently-checked-out 分支 重命名为 branch_1.5,如下所示:

git branch -m branch_1.5

也可以看看:

我经常参考并认为是“git 基础知识”的答案的快速链接: 从另一个分支在 git 中创建分支的各种方法 所有关于在 git 中检查文件或目录的内容 谁是“我们”,谁是“他们”吉特?如何通过 --diff-filter= 使用 git diff 过滤器


最佳答案。其他答案令人困惑,因为它们倾向于使用 git checkout 同时关注分支和切换到创建的分支。
S
Sumit Ghewade

要从本地目录中的另一个分支创建分支,您可以使用以下命令。

git checkout -b <sub-branch> branch

例如:

要创建的新分支的名称 'XYZ'

必须在其下创建 XYZ 的分支 ABC 的名称

git checkout -b XYZ ABC

J
JSON C11

Git 2.23 引入 git switchgit restore 来拆分 git checkout 的职责

从 git 2.23 的现有分支创建新分支:

git switch -c my-new-branch

切换到新分支“我的新分支”

-c 是 --create 的缩写,它取代了众所周知的 git checkout -b

查看 this Github 博客文章,更详细地解释更改:

Git 2.23 为现有的套件带来了一对新的实验性命令:git switch 和 git restore。这两个旨在最终为众所周知的 git checkout 提供更好的界面。新的命令打算每个都有一个明确的分离,巧妙地划分了 git checkout 的许多职责


m
michaelmoo

dev 分支上同时工作。发生的情况是,在您的场景中,功能分支从 dev 分支的尖端向前移动,但 dev 分支不会改变。它更容易画成一条直线,因为它可以被认为是向前运动。您到达了 dev 上的 A 点,然后您只需继续沿着平行路径前进。这两个分支并没有真正分道扬镳。

现在,如果您在 dev 上进行提交,在合并之前,您将再次从同一个提交 A 开始,但现在功能将转到 C,将 dev 转到 B。这将显示您尝试可视化的拆分,作为分支现在已经分道扬镳了。

*-----*Dev-------*Feature

相对

       /----*DevB
*-----*DevA
       \----*FeatureC

b
bdkopen

如果您想从另一个分支创建一个分支,请按照以下步骤操作:

假设:

您目前在 master 分支中。您没有要提交的更改。 (如果您有任何更改要提交,请将其隐藏起来!)。 BranchExisting 是您需要从中创建一个名为 BranchMyNew 的新分支的分支的名称。

脚步:

将分支获取到本地计算机。 $ git fetch origin BranchExisting : BranchExisting

此命令将在您的本地创建一个具有相同分支名称的新分支。

现在,从 master 分支 checkout 到新获取的分支 $ git checkout BranchExisting 你现在在 BranchExisting 中。现在从这个现有分支创建一个新分支。 $ git checkout -b BranchMyNew

干得好!


A
Alexander Samoylov

要从另一个分支创建分支,也可以使用以下语法:

git push origin refs/heads/<sourceBranch>:refs/heads/<targetBranch>

它比“git checkout -b”+“git push origin”短一点


B
Ben Naim Naim

切换到开发分支:

$ git checkout develop

创建开发的 feature/foo 分支。

$ git checkout -b feature/foo develop

合并更改以开发而无需快进

$ git checkout develop
$ git merge --no-ff myFeature

现在将更改推送到服务器

$ git push origin develop
$ git push origin feature/foo

不确定为什么需要此评论,因为它与已接受的答案非常一致并且评论中的上下文也较少。
D
Dharmendra Prajapati

它对我有用:

转到您的 github 存储库并选择要从中创建新分支的分支名称,如下图所示

https://i.stack.imgur.com/5IJ1R.png

然后键入您要创建的分支名称,然后单击创建分支。

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


这个问题是关于 Git,而不是 Github。不是每个人都使用 Github。