我意外地对本地主机进行了提交,正在等待其通过代码审查过程。我不想失去这种改变。但是,与此同时,我想从事其他工作。当我尝试签出新分支时,我在主分支上的最新提交也随之转移。
如何获得一个新的本地分支,该分支反映原始主服务器的状态,而无需最近对本地主服务器进行提交?
答案 0 :(得分:0)
您可以使用上游主分支重置主分支
git checkout master
git reset --hard origin/master
请注意,使用reset --hard会导致您未提交的更改丢失,如果要保留未提交的更改,请进行软重置
答案 1 :(得分:0)
创建分支时(无论如何创建),都会从存储库中选择一些现有提交以标识该分支名称,因此您要做的就是选择正确的提交。 / p>
将提交视为由箭头连接的,充满了所有内容(数据和元数据)的实体节点。很难很好地绘制箭头,但是我们可以像这样:
... <-F <-G <-H
其中每个大写字母代表某个实际提交的实际哈希ID。 (例如,您将在git log
输出中看到这些笨拙的哈希哈希ID。)箭头是提交的元数据的一部分:每个提交都存储其父级的原始哈希ID。因此,箭头全部指向向后。
如果您正在进行某些分支,则它看起来像这样:
H
/
...--F--G
\
I
请注意,最末端的提交中有一个箭头出来,但没有箭头可让您找到。但是,提交哈希ID看起来是随机的,因此我们需要使用 箭头来查找它们。那就是分支名称!
H <-- master
/
...--F--G
\
I <-- develop
从这里到达那里:
...--F--G--H <-- master
您只需要在较高的线条上绘制master
(仅出于绘制目的),然后命名一个指向现有提交develop
的名称G
:
H <-- master
/
...--F--G <-- develop
您现在可以git checkout develop
,进行操作并进行新的提交。进行 new 提交会使它指向当前提交,然后更新 current分支名称以指向新提交。所以:
<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
这很方便。