我正在开展的项目有许多分支,其中有两个我关注的分支Rat
和Mouse
。我从分支sprint1
为我的工作sprint2
创建了一个新分支,并使lexis
提交到分支sprint1
。后来我的队友说我应该从1
而不是lexis
分支。所以他做了以下
sprint2
然后他告诉我使用sprint1
在分支On branch lexis he deleted my commit
git fetch origin/sprint2
git reset --hard origin/sprint2
Then he cherry picked my commit from reflog
上推送我的提交。
我的怀疑是
lexis
与push -f
完全相同。但他为什么要做lexis
?sprint 2
? 答案 0 :(得分:4)
但为什么他会做git fetch?
确保使用最新更新的sprint2
分支
为什么使用
git push -f
?
如果您已经推送lexis
,则需要强制推送它,考虑其历史记录会发生变化(因为其基数不再是sprint1
而是sprint2
)
答案 1 :(得分:3)
我认为看到这里发生的事情的图表对你最有利。
最初,我们假设lexis
和sprint2
开始时都是一样的:
sprint2: ... A -- B -- C
lexis: ... A -- B -- C
在这里,我使用省略号来表示之前的所有内容。据推测,他们在某些时候都是一个共同的基础,但这与你的问题并不相关。您向lexis
提交了一个提交,同时,其他人向sprint2
提交了一些数字(比如说2)提交。此时,图表如下所示:
sprint2: ... A -- B -- C -- D -- E
lexis: ... A -- B -- C -- F
此时,您应该位于sprint2
之上,但您承诺sprint1
。然后,您的同事核实了您的提交F
,请留下我们:
sprint2: ... A -- B -- C -- D -- E
lexis: ... A -- B -- C
然后,他从分支lexis
执行了以下两个命令:
git fetch origin/sprint2 # update local tracking branch for sprint2
git reset --hard origin/sprint2 # reset local lexis to sprint2
这使得图表看起来像这样:
sprint2: ... A -- B -- C -- D -- E
lexis: ... A -- B -- C -- D -- E
最后,他选择了你的提交F
到这个新基地:
sprint2: ... A -- B -- C -- D -- E
lexis: ... A -- B -- C -- D -- E -- F'
现在,你就是你想去的地方。您在当前基础sprint2
之上只有一次提交。
请注意,最后一步看起来像这样:
git push --force origin lexis
这是必要的,因为分支的基础发生了变化,需要强行覆盖。
答案 2 :(得分:1)
<local:HamburgerMenuItem ... SelectedItem="{Binding YourSourceProperty}" />
只是为了确保您拥有git fetch
的最新快照。
sprint2
是必要的,因为git push -f
之后lexis
的本地副本已偏离远程副本。 (将其视为git reset
的{{1}}版本;无论push
看起来如何,请立即将其视为本地git reset --hard
。)