一些提交后创建一个分支

时间:2014-07-11 16:14:53

标签: git branch git-branch

昨天,开发人员在主服务器中进行了大量提交,破坏了一些代码并且之前没有创建分支来执行此操作。

提交列表是:

+ da1cd10  --> HEAD
+ 48f70a1
+ 3b94ae5
+ a808c65
+ 92ee96f  --> Commit starting changes
+ 194dc5c
+ 2e2c5e0
|
master

提交“92ee96f”移动文件,添加了几个影响其他开发人员的文件夹。上面列出的所有提交都在bitbucket中。

现在,我需要在特定分支中分离提交“92ee96f”,并继续使用下面的其他提交主机:

        master   
        |
        | new branch
        | |
da1cd10 + |  
48f70a1 + | 
3b94ae5 + | 
a808c65 + | 
        | + 92ee96f  --> Commit starting changes
        |/
        + 194dc5c
        + 2e2c5e0
        |
       master

这可能吗?以及我如何做到这一点?

2 个答案:

答案 0 :(得分:2)

编辑:再次阅读问题后,我不确定我的回答是你想要的。我假设您希望将所有从92ee96f开始的提交移动到新分支。

我的回答是基于此great article的示例。

当您检出主分支时,请执行

git branch new-branch

“master”和“new-branch”都会指向最后一次提交 - da1cd10

  git checkout master

#小心下一个命令:确保“git status”为
  #clean,你肯定是在“主人”和   #“new-branch”分支在提交194dc5c之后进行了所有提交。

  git reset --hard <SHA1sum of commit 194dc5c>

现在主人会指向194dc5c和新分支到da1cd10。

然后当你向master添加新的提交(例如a808c65)时,你会得到你想要的东西

  2e2c5e0--194dc5c---- ... --- ... ---  ... ("master")
               \
                92ee96f  --- ... --- da1cd10   ("new-branch")

答案 1 :(得分:1)

我们将分两步打破您的解决方案:

第1步: 92ee96f 提交创建分支。

因此,使用以下命令创建新分支:

  

git checkout -b new-branch 194dc5c

现在你的新分支在194dc5c提交时有HEAD。 Cherry-选择你对这个新分支的必要提交。

  

git cherry-pick 92ee96f

现在你有了一个新的分支,根据需要提交92ee96f。

第2步:从主分支树中删除 92ee96f 提交。

如果您已经推送了提交,那么请使用&#34; git revert 92ee96f&#34; 命令。

否则,请使用以下命令删除此提交。

  

git rebase -i HEAD

这将在交互模式下启动rebase -i,就在您要进行提交之前的那一刻。编辑器将从那时开始列出所有提交。删除包含要删除的提交的行并保存文件。 Rebase将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中。 然后,如果你想推动你的改变,

  

git push --force origin master

我希望我的回答能够满足你提问的意图。