我有一个develop分支(例如,在提交c处),它比master前面的许多提交(例如在提交a处)。但是我忘了将生产代码(例如在提交b处)推入master或单独的分支中。
是否可以将我的生产代码(即,develop分支中的较早提交)推送/合并到master中?
a (master branch)
a b c (develop branch)
(Need this commit
merged to master)
编辑:我不希望将开发中的所有提交合并/推送到主提交,这很容易。我只希望将直到上一个提交(而不是最后一个提交)的代码合并到master。我在测试服务器中有这段代码。
答案 0 :(得分:1)
在不更改a
的情况下,您不能在c
和c
之间插入提交。由于您已经推送了c
,所以有人可以使用它来开始工作,我的建议是避免在两者之间重新设置b
。
话虽如此,最好的选择可能是将b
推到一个新分支,然后将git merge c
推到b上,这样您现在拥有以下内容,然后合并到master。
d <-- merge devel into new branch
/|
| b <-- new branch
| |
c | <-- develop HEAD
| /
a <-- master HEAD
一旦您在这里,请合并到master上,或重新开发。这很丑陋,但避免破坏任何人的工作。
编辑
如果您不希望将c
合并为master,而仅合并b
,则情况会有所不同。方案A:您想像gitflow一样保留分支develop
。然后,您需要(在开发中):
git reset --hard git添加 git commit -m“回滚c” git push
这将在c
之后添加一个新提交,该提交与a
相同。记住,我们不想破坏其他人的生命。
然后,git push
将b提交到开发。怎么样?可能您有一些未提交的更改。确保暂时git stash
处理这些develop
,先回滚c
然后回滚git stash pop
,解决所有冲突并创建新的提交b
>
您的开发现在将如下所示:
a -> c -> a(rollback) -> b
答案 1 :(得分:1)
您的问题的解决方案是简单地将提交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
答案 2 :(得分:1)
如果您要描述的情况如下:
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
的确是“快进”操作,master
和b
的历史来确定您应该做什么