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
的情况下在 a
和 c
之间插入提交。由于您已经推送了 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% 确定:
- 从
master
到b
确实是一个"fast forward"操作,
- 或者什么都没有发生,你将不得不查看
master
和 b
的历史记录来确定你应该做什么
我有一个开发分支(比如在提交 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
的情况下在 a
和 c
之间插入提交。由于您已经推送了 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% 确定:
- 从
master
到b
确实是一个"fast forward"操作, - 或者什么都没有发生,你将不得不查看
master
和b
的历史记录来确定你应该做什么