【问题标题】:Git (bitbucket) merge a previous commit to masterGit(bitbucket)将以前的提交合并到master
【发布时间】:2020-09-05 04:31:04
【问题描述】:

我有一个开发分支(例如在提交 c 处),它比 master 之前的许多提交(例如在提交 a 处)。但是我忘记将我的生产代码(比如在提交 b 处)推送到 master 或单独的分支。

是否可以将我的生产代码(即开发分支中的早期提交)推送/合并到 master 中?

a (master branch)

a           b                   c (develop branch)
            (Need this commit               
            merged to master)

编辑:我不希望将开发中的所有提交合并/推送到主控,这很容易。我只想将上一次提交(而不是最后一次提交)的代码合并到主控。我在测试服务器中有这段代码。

【问题讨论】:

    标签: git bitbucket git-merge


    【解决方案1】:

    如果不更改 c,则无法在 ac 之间插入提交。由于您已经推送了c,因此有人可以使用它来开始他们的工作,我的建议是避免在两者之间重新设置b

    话虽如此,您最好的选择可能是将b 推送到新分支,然后将git merge c 推送到b,这样您现在就有了以下内容,然后合并到master。

      d    <-- merge devel into new branch
     /|
    | b    <-- new branch
    | |
    c |    <-- develop HEAD
    | /
    a      <-- master HEAD
    

    一旦你在这里,合并到 master,或者回到 development。这很丑,但可以避免干扰任何人的工作。

    编辑

    如果你不想将c合并到master,而只是b,情况就不同了。场景 A:你想保持分支 develop 就像在 gitflow 开发中一样。然后你需要(在开发中):

    git reset --hard 混帐添加。 git commit -m "回滚 c" git推送

    这将在c 之后添加一个新提交,它是a 的相同副本。请记住,我们不想破坏其他人的生命。

    然后,git push 将 b 提交到开发中。如何?可能您有一些未提交的更改。确保暂时git stash 那些,同时处理develop,回滚c 然后git stash pop,解决任何冲突并创建新的提交b

    您的开发现在将如下所示:

    a -> c -> a(rollback) -> b
    

    【讨论】:

    • 如何将 b 推入不同的分支?我在测试服务器中有 b 。另外,我不希望 c 在 master 中。我只需要b。
    • @Justin 如果是这样的话,我把你的问题完全弄错了。我会更新我的答案。
    【解决方案2】:

    解决您的问题的方法是将提交 b 之前的所有内容合并到 master 中。

    在你的情况下,以下命令应该是你想要做的:

    git checkout develop
    git rebase master # Always suggested to avoid unneeded merge c onflicts
    git checkout master
    git merge <commit-id of b>
    

    下面的小脚本允许您创建一种沙盒来玩这个场景

    mkdir sandbox
    cd sandbox
    git init
    touch a.txt
    git add a.txt
    git commit -m "Added a.txt" a.txt
    git checkout -b develop
    touch b.txt
    git add b.txt
    git commit -m "Added b.txt" b.txt
    touch c.txt
    git add c.txt
    git commit -m "Added c.txt" c.txt
    git rebase master
    git checkout master
    

    【讨论】:

    • 这行得通。我没有做 git rebase master。 git checkout developgit checkout mastergit merge &lt;commit Id&gt; 工作了吗?谢谢。
    • 是的,你最后只需要一个合并。关于提交 c 的那部分是白噪声。
    【解决方案3】:

    如果您描述的情况如下:

    a--*--*--*--b--*--*--*--c
    ^           ^           ^
    master      |           |
                |           develop
                |
     (not marked by a branch, but this is the commit in production)
    

    只需将 master 移到 b :

    # one the many ways to do this :
    git checkout master
    git merge --ff-only b
    

    --ff-only 不是强制性的,您只需 100% 确定:

    • masterb 确实是“快进”操作,
    • 否则什么都不会发生,您将不得不查看masterb 的历史记录以确定您应该做什么

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多