压缩并将master合并到同一个分支中

时间:2018-01-05 20:14:11

标签: git github

有没有办法压缩并将master合并到同一个分支中?有效地获取所有挂起的提交并将它们置于1次提交中?

我最初的想法是一个脚本,它需要my-branch并执行git checkout master && git pull && git checkout my-branch-squashed然后git merge --squash my-branch(处理任何合并冲突),然后最终删除my-branch并重命名{ {1}}至my-branch-squash

这似乎非常圆润,可能很糟糕,所以我试图看看是否还有其他办法。我试图解决的目的是当我在github上放置分支时,它们被压缩并合并在一起#34;在master中,本地机器上存在的分支与合并到master中的分支不匹配,因此在使用my-branch时它不会正确删除已经合并为master的分支。我想要的是一种自动删除已合并为主

的旧分支的方法

4 个答案:

答案 0 :(得分:8)

您可以使用git rebase执行此操作,并修复要合并的提交:

$ git rebase -i HEAD~5

pick c2e2c87 commit 1
f 689d474 commit 2
f aa9d9b4 commit 3
f 888a009 commit 4
f d396e75 commit 5

# Rebase 2f7f53e..d396e75 onto 2f7f53e (5 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

您可以使用git rebase -i --root从第一次提交中重新绑定。

答案 1 :(得分:0)

如果您真正想要的是在提交拉取请求之前压缩本地开发历史记录,最简单的方法是在本地功能分支上进行开发,这与您想要影响的上游分支不同。

然后,将它压缩到母版上的程序是

git checkout master
git merge --squash feature

(将master替换为integration或其他)。

我会使用rebase -i进行精细控制,但是对于这个简单的情况,我们可以使用git对你的历史知识来自动找出最后一个共同的祖先。

答案 2 :(得分:0)

将合并壁球工作流程的问题放在一边,这些问题已经在许多地方进行了彻底的讨论,因为工作流程往往是你无法控制的。

您可以使用一种方法,虽然它不是100%有效,但它在我的经验中确实有相当好的记录,并且始终无法安全。

如果没有祖先可依赖,您需要一种确定两个快照是否相同的方法。您可以使用提交的哈希值。使用此命令的树:

git show --format="%T" <committish>

为了检查是否可以删除分支,首先将master合并到您的分支中。如果此合并中存在冲突,或者原始壁球存在冲突,则您无法使用此方法(这是不到100%的有效部分)。

由于git的性质,如果不发生冲突,应用一组补丁的顺序并不重要。因此,如果您的分支已合并,则此合并的结果应与master的head相同。这可以通过比较两个分支头的树形哈希来确认,如果分支上存在任何未合并的代码,您可以找到它们。

这可以归结为一次性使用的命令,可以很容易地使用别名:

if [ $(git show --format="%T" origin/master) = $(git show --format="%T" HEAD) ]; then echo Merged; else echo Unmerged; fi

或者内置到shell脚本中,该脚本将循环遍历所有本地分支,合并它们,测试它们并删除已合并的分支。

所有这一切,使用交互式rebase来展平你的分支并让维护者在pull请求上使用快速合并策略会使所有这些都变得不必要。

答案 3 :(得分:0)

您可以软复位以在那里进行上次提交并重新提交。

enter image description here

enter image description here