我有一种情况,我在一个特定的分支上从事两个不同的项目。我已经完成了项目“A”,提交了更改,并将更改推送到远程。此更改“A”目前正在审核中,因此尚未合并到分支。同时,我已经开始为同一分支中的另一个项目进行不相关的更改,将此更改称为“B”。我也完成了这个更改的编码,我准备提交并推送它。但我不确定这应该如何完成,因为更改“A”尚未合并。如何将这两个更改“A”和“B”作为不依赖于彼此的单独更改推送?
2 回答
首先,您需要确定将成为更改 A 和 B 的共同父级的提交。正如您所描述的,这是提交 A 的父级。git log
用于查找 A 之前提交的哈希值。请注意,您只需键入提交哈希的前几个字母/数字。让我们假设它是“parent_commit”
现在签出这个提交,我们将把它用作变更 B 的新分支的负责人。
git checkout parent_commit
接下来从它创建一个新分支,我们将在其中提交 B 更改。
git checkout -b changeB
最后,使用git add
并git commit
在这个新分支上提交您的更改 B。完成后,执行 agit push
从独立于更改 A 的新分支推送您的提交 B。或者,如果您已经提交了更改 B,则使用git cherry-pick commitB
then git pull
。
现在,您将拥有 A 的原始分支和 B 的新分支,将历史共享到 A 的父级。
结束语:如果您已经提交了 B 并为它创建了一个分支(并已将其签出),那么您可以完成另一个答案中提到的 rebase one-liner:
git rebase --onto master commit_A_sha
与 Shelhamer 的反应基本相同的结果;但是您可以使用git rebase --onto
单个命令来实现相同的结果。找到“旧”父级的 SHA id(在您的示例中为 A),以及新父级的 SHA id(例如master)。然后假设您已签出有问题的分支 (B),请运行:
git rebase --onto <new parent> <old parent>
这将实质上从 A 开始“拾取”分支 B 上的所有内容,并将其移动,使其基于主节点。然后就git push
和平常一样。