Git (bitbucket) 将之前的提交合并到 master

Git (bitbucket) merge a previous commit to master

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

是否有可能 push/merge 我的生产代码(即开发分支中的早期提交)到 master 中?

a (master branch)

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

编辑:我不希望从 develop merged/pushed 到 master 的所有提交,这很容易。我只想将之前提交(而不是最后一次提交)的代码合并到 master 中。我在测试服务器中有此代码。

您不能在不更改 c 的情况下在 ac 之间插入提交。由于您已经推送了 c,有人可能会用它来开始他们的工作,我的建议是避免在两者之间变基 b

话虽如此,您最好的选择可能是将 b 推送到一个新分支,然后将 git merge c 推送到 b,以便您现在拥有以下内容,然后合并到主分支。

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

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

编辑

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

git 重置 --hard git 添加 . git 提交 -m "rolling back c" git推

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

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

你的开发现在看起来像:

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

您的问题的解决方案就是将提交 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

如果您描述的情况如下:

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确实是一个"fast forward"操作,
  • 或者什么都没有发生,你将不得不查看 masterb 的历史记录来确定你应该做什么