2013-02-14 109 views
7

所以,假设我有一个主分支,我们将调用'master'。我做了一个叫'新功能'的分支。我在这个分支中做了大量的提交,所以我可以及时回溯,但是在开发这个功能的时候,我已经做了很多事情,所以提交日志非常混乱。Git分支差异到一个新的提交

如果我想看看 git diff master..new-feature 例如。

如果我想在'master'上创建一个包含两个分支之间所有更改的新鲜提交,那么最有效的方法是什么?

回答

17
git checkout master 
git merge --squash new-feature 
git commit 

的提交信息开始时会显示提交是 的整个列表合并/压扁,但你当然可以编辑的,要成为任何你想要的。

+0

美味简单:) – hhh 2013-02-14 22:25:05

1

您可以使用交互式底线:git rebase --interactive。然后只需使用压扁选项。它只使用来自提交的更新,但不创建提交。

+0

这似乎是更换挑选南瓜一吨搜索,还是我错过了什么? – hhh 2013-02-14 21:59:10

0

您可以在您的功能分支中提交所有内容,然后合并到接受所有更改的“主题”中。

这里有一个堆栈溢出问题,就如何做一个伟大的回答: Is there a "theirs" version of "git merge -s ours"?

+0

嗯,这是否只会导致一个代表功能分支的提交? – hhh 2013-02-14 22:01:03

+0

如果你首先在特征分支中重新绑定(就像上面的William所说的那样),但这可能是不可取的。关于源代码管理的一件伟大的事情就是具有你如何到达你的位置的历史。我想这是一个偏好问题!更多关于交互式rebase [here](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)。 – 2013-02-14 22:15:21

+0

是的,我希望有历史记录,但不同的人:) – hhh 2013-02-14 22:29:02

1

使用git变基--interactive HEAD〜(然而,许多提交想壁球)。例如,git rebase --interactive HEAD〜5。这会加载你最近的5次提交,并弹出一个编辑窗口。每条消息在开始时都会有“挑选”。回到最后一条消息,将'pick'改为'squash'然后退出。将打开一个新窗口询问提交消息。这将是squash提交的新提交消息。退出并将压缩所有提交到一个新的。

这里有一个例子: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

看起来像这样可能会产生一些问题,看到我在一个团队中,并经常需要从其他团队成员拉动变化。那,我宁可不计数:) – hhh 2013-02-14 21:58:47

+0

如果你正在研究一个新功能的分支,我假设你正在自己的分支上工作。如果你不是,你/你在工作的其他人可能有自己的分支机构。如果其他人已经提取代码,使用rebase通常是一个糟糕的主意,因为它可能会导致问题,因为您正在重写历史记录 – 2013-02-14 22:00:54

+0

因此,〜5不会计算我已经提取的主人提交的提交只要我是分支机构中唯一承诺的人? '5'是指最后五个独立于该分支,还是最后五个提交? – hhh 2013-02-14 22:03:00

2

另一个可能对您更好的选择是生成一个带有git diff --patch > "patch filename"的补丁文件,然后使用git apply "patch file name"将它们修补到您的主分支中。对于GIT-DIFF

手册页(尤其是 “生成与-p补丁”): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

的手册页git的申请: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

git apply ...有趣:)很高兴知道! – hhh 2013-02-16 02:23:08

相关问题