5个提交到错误的分支并推送到远程/原点

1.6*_*618 3 git github

所以我不小心做了5次提交分支"A",但我打算把它分成"B".我还将所有提交推送到远程/原点.我意识到我已将所有提交到错误的分支.有没有什么方法可以将所有这5个提交转移到分支"B"并使我的分支"A",因为它是5次提交之前?

Saj*_*han 8

结帐到A.按顺序复制并粘贴5个提交哈希值.

例如5(最老) - > 4 - > 3 - > 2 - > 1(最新),假设1是你的最高git log命令提交.

$ git checkout A
$ git log
# copy the 5 commit hashes
Run Code Online (Sandbox Code Playgroud)

结帐B并采取(樱桃挑选)5提交到B分支.

$ git checkout B

$ git cherry-pick <commit-hash>
# repeat 5 times with new commit hash each time (old to new)

# Or, you can cherry-pick a range of commits by 'git cherry-pick <from-commit>^..<to-commit>', note '^' sign
$ git cherry-pick <commit-5>^..<commit-1>  
Run Code Online (Sandbox Code Playgroud)

现在,撤消(hard reset)最新的5次提交A.请注意,硬重启会改变你的A的git的历史记录(如果有其他人拉到一个分支已经在本地,那么你可以使用revert代替hard reset).因此,需要推推分支A.

$ git checkout A
$ git branch A.bac           # backup branch 'A' for safety 

$ git reset --hard HEAD~5    # undo last 5 commits from branch A
$ git push -f origin HEAD    # need force push since history is changed
Run Code Online (Sandbox Code Playgroud)

注意:采摘一系列提交的樱桃的基本形式是:

$ git cherry-pick abc1234..def5678
Run Code Online (Sandbox Code Playgroud)

abc1234是最早的提交,def5678是最新的提交.abc1234不包括在提交中但def5678包括在内.如果您要包括abc1234,然后开始从以前的范围内提交的abc1234通过将一个^经过abc1234这样的:

$ git cherry-pick abc1234^..def5678
Run Code Online (Sandbox Code Playgroud)