我不小心对我的本地主节点做出了承诺,正在等待它通过代码审查过程。我不想失去这种变化。但是,我想在此期间做其他事情。当我尝试签出新分支时,我在我的主分支上的最新提交也会随之而来。
如何获得反映源主节点状态的新本地分支,而无需最近在本地主服务器上提交?
当你创建一个分支时——无论你如何创建它——你从仓库中挑选一些现有的提交,以便识别该分支名称,所以你所要做的就是选择正确的提交。
将提交视为充满东西(数据和元数据(的实心节点,由箭头连接。 画好箭头有点困难,但我们可以像这样做:
... <-F <-G <-H
其中每个大写字母代表某个实际提交的实际哈希 ID。 (例如,您会git log
输出中看到这些丑陋的大哈希 ID。 箭头是提交元数据的一部分:每个提交都存储其父级的原始哈希 ID。 因此,箭头都指向后方。
如果你有一些分支正在进行,它看起来更像这样:
H
/
...--F--G
I
请注意,最末端的提交有一个箭头,但没有箭头让你找到它们。但是,提交哈希 ID 看起来是随机的,因此我们需要箭头来查找它们。 这就是分支名称!
H <-- master
/
...--F--G
I <-- develop
要从这里到达那里:
...--F--G--H <-- master
您只需要在更高的行上绘制master
(仅用于绘制目的(,然后创建一个指向现有提交G
的名称develop
:
H <-- master
/
...--F--G <-- develop
您现在可以git checkout develop
、执行操作并进行新的提交。 进行新提交使其指向当前提交,然后更新当前分支名称以指向新提交。 所以:
<make branch name "develop" identifying commit G>
git checkout develop
... develop and commit ...
你有:
H <-- master
/
...--F--G
I <-- develop (HEAD)
(HEAD)
仅在此处显示哪个是当前分支。
困难的部分是找到G
的哈希 ID ,但这并不难:git log
告诉你。 然后你可以做:
git branch develop <hash>
或者,您可以使用特殊语法:master~1
表示查找名称master
指向的提交,然后后退一个父级。所以:
git branch develop master~1
做正确的事:找到H
,倒数1到G
,并创建名称develop
。
最后,您可以将创建新分支名称和签出名称操作合并为一个:
git checkout -b develop master~1
这很方便。
您可以使用上游主分支重置主分支
git checkout master
git reset --hard origin/master
请注意,使用 reset --hard 将导致未提交的更改丢失,如果要保留未提交的更改,请执行软重置