我如何将我最近的承诺转移到一个新的分支机构,并在这些承诺完成之前重新定义主? 例如:
master A - B - C - D - E
为此:
newbranch C - D - E
/
master A - B
我如何将我最近的承诺转移到一个新的分支机构,并在这些承诺完成之前重新定义主? 例如:
master A - B - C - D - E
为此:
newbranch C - D - E
/
master A - B
当前回答
對於那些想知道為什麼它工作(正如我開始的那樣):
你想回到C,然后移动D和E到新分支。
A-B-C-D-E (HEAD)
↑
master
在Git分支新Branch之后:
newBranch
↓
A-B-C-D-E (HEAD)
↑
master
此分類上一篇: git reset --hard HEAD~2:
newBranch
↓
A-B-C-D-E (HEAD)
↑
master
因为一个分支只是一个指标,大师指向最后一个承诺。当你做了新的Branch,你只是做一个新的指标到最后一个承诺. 然后使用Git重新设置你移动了大师指标回两个承诺. 但因为你没有移动新的Branch,它仍然指向承诺它最初做了。
其他回答
你可以做到这一点只是我使用的3个简单步骤。
1)做一个新的分支,你想承诺你最近的更新。
git branch <branch name> 品牌名称
2) 查找最近的承诺 ID 为承诺新分支。
登录
3) 复制的承诺ID 注意,最最近的承诺列表发生在顶部,所以你可以找到你的承诺。
git cherry-pick d34bcef232f6c...
你也可以提供一些承诺ID的范围。
git cherry-pick d34bcef...86d2aec
现在你的工作完成了,如果你选择了正确的ID和正确的分支,那么你会成功,所以在做这件事之前要小心,否则另一个问题可能会出现。
现在你可以按下你的代码
点击Push
大多数以前的答案都是危险的错误!
不要这样做:
git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick ..HEAD@{2}
首先,它放弃了3个最新的承诺( - 保持像 - 硬,但更安全,因为它失败,而不是扔掉未承诺的变化)。 然后它放弃了新分支. 然后它将这些3个承诺返回新分支. 因为它们不再被一个分支提到,它这样做,使用 git 的回归: HEAD@{2} 是 HEAD 使用的承诺提到 2 个操作之前,即在我们 1 检查之前。
# newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3
技术解释
假设你分离起源 / 主,当它包含的承诺M1,M2,M3,然后做三个承诺自己:
M1--M2--M3 <-- origin/master
\
T1--T2--T3 <-- topic
但然后有人用强迫起源/大师重新编写历史,以删除M2:
M1--M3' <-- origin/master
\
M2--M3--T1--T2--T3 <-- topic
M1--M3' <-- origin/master
\
T1'--T2'--T3' <-- topic (rebased)
因此,下列命令失败的原因:
git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
但在这个特殊情况下,我们希望这些3个承诺被视为主题分支的一部分,为了实现这一点,我们需要在以前的修订中排除上流,这不包括3个承诺。
我怎么能离开这
A - B - C - D - E
|
master
到此?
A - B - C - D - E
| |
master newbranch
兩個命令
吉特分支 -m 主新分支
给予
A - B - C - D - E
|
newbranch
和
吉特分支大师B
给予
A - B - C - D - E
| |
master newbranch
这里的大多数解决方案计算了你想回去的承诺数量,我认为这是一个错误的方法,计算需要计算。
你可以简单地通过你想要的承诺的承诺,或者换句话说,你想要的承诺是最后的承诺:
(重定向自Commit Hash)
为了避免这一点:
1) git checkout master
2) git branch <feature branch> master
3) git reset --hard <commit hash>
4) git push -f origin master
还有另一种方法来做到这一点,只使用2个命令,同时保持您的当前工作树无缝。
git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit
旧版本 - 在我学到 git branch -f 之前
git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit
能夠推到. 是一個好技巧知道。