有没有一种方法可以;隐藏“;比较分支时,是否在GitHub中合并提交?

有没有一种方法可以;隐藏“;比较分支时,是否在GitHub中合并提交?,git,github,Git,Github,我的10人左右的团队正在使用GitHub进行我们的开发项目。我们有一个主要的develope分支,我们从中创建功能分支来执行开发任务,然后将功能分支合并回develope。我们使用Pull请求进行代码审查。所有标准的东西 然而,有一件事一直困扰着我 假设开发人员A创建了一个名为myFeature的功能分支。在这个分支中,他对单个文件进行了一行更改,比如Loop.java 同时,其他开发人员从其他分支将100个不相关的提交合并到develope 现在,在开发人员A推送他的更改并发出请求之前,他希望

我的10人左右的团队正在使用GitHub进行我们的开发项目。我们有一个主要的
develope
分支,我们从中创建功能分支来执行开发任务,然后将功能分支合并回
develope
。我们使用Pull请求进行代码审查。所有标准的东西

然而,有一件事一直困扰着我

假设开发人员A创建了一个名为
myFeature
的功能分支。在这个分支中,他对单个文件进行了一行更改,比如
Loop.java

同时,其他开发人员从其他分支将100个不相关的提交合并到
develope

现在,在开发人员A推送他的更改并发出请求之前,他希望确保他的更改与最新的
develope
分支一起工作。因此,他将
develope
的负责人并入他的分支机构:

git checkout develop
git pull
git checkout myFeature
git merge develop
# testing and stuff
git push origin myFeature
最后一个命令(
git merge develope
)总是导致新的提交。因此,当开发人员A推送他的更改并发出对
myFeature
的拉取请求时,拉取请求的审阅者将看到101个提交被添加到分支
myFeature
:一个提交更改为
Loop.java
,另外100个提交与之无关,实际上已经合并到
develop
。在这里,它们只是用来掩盖developerA在这个分支中真正改变了什么

是否有一种简单的方法让审阅者能够告诉开发者的A更改改变了什么,并以某种方式“隐藏”来自与
develope
合并的提交?
我特别考虑的是Pull Request视图中的“Files changed”选项卡。 (我意识到我可以使用“提交”选项卡,一步一步地查看所有提交,以查看更改了什么,但如果有大量提交,这可能会很烦人。我喜欢“文件更改”选项卡的单一最终视图。)

EDIT
git-rebase-develope
已被提议作为一个选项,但我认为它不适合我们的目的。通常,多个开发人员将在
myFeature
上工作,因此,由于rebase重写了历史,因此它可能会把每个人都搞糟


编辑2:正如@kan在下面善意地指出的,GitHub实际上表现得很好:是的,它将在Pull请求的“提交”选项卡中显示合并提交(这非常好),但在“文件更改”选项卡下,仅列出此功能分支上更改的文件(而不是来自合并的文件)。这正是我想要的。

一种方法是
git-merge
而不是
git-rebase-develope
。这不会导致合并提交发生,并将新提交放在develop中新提交的末尾


然后,历史应该只显示一个新的提交,作为拉请求中的更改。在我看来,这也使历史保持了相当的线性,并且更容易理解。

是的,您可以使用rebase来实现

git checkout myFeature
git fetch
git rebase origin/develop
git checkout develop
git merge @{upstream}
git merge myFeature # it will do fast-forward, so no merge commit
但是,您应该知道,只有当myFeature没有在其他开发人员之间共享时,才应该使用rebase


顺便说一句,我们正在使用gerrit。它允许在合并之前进行修改。当然,如果只有在没有冲突的情况下才有效,如果有冲突,您应该在本地重新设置基础并重新提交变更集。

如果A的
myFeature
分支来自
develop
,并且他合并了
develop
的最新更改,我认为GitHub中不应该出现数百个额外的提交,我认为应该只有该分支所特有的提交。A是否将请求拉入错误的分支,如进入
master
而不是develope?@coldhawaian:否,A是从
develope
进行分支,然后合并
develope
,然后执行拉入请求以合并到
develope
。这也是我感到困惑的原因。另一种可能是A的开发历史版本已经被修改(即提交SHA在相应的提交上是不同的)。可能A的提交已经被重写为
rebase
cherry pick
,或者
commit--amend
?是从命令行使用Git,还是像GitHub for Windows这样的gui?GitHub for Windows隐式地进行了一些奇怪的重定基调工作。@Coldhawaian:不,没有那么复杂。我们在Ubuntu上使用命令行,而不是使用
rebase
或任何东西。我能够在测试存储库上重新创建场景,执行非常简单的提交和更改:我将创建一个新分支
myFeature
,进行更改,并提交和推送。我将查看GitHub,并可以在
myFeature
上看到单个提交。然后我将签出
开发
,进行一个不相关的更改,然后提交。然后我将再次签出
myFeature
,并
git merge develope
,然后推送。我在GitHub上查看了branch
myFeature
的比较视图,它列出了两个提交。从我所读到的内容(包括下面的@kan)来看,
git rebase
如果功能分支已经被推到远程服务器上,那就不是一个好主意,因为其他开发人员也可能已经拉到了该分支。这是真的吗?此外,重基如何处理合并冲突?是的,这是正确的。因为这将改写被挤出的历史。rebase的工作方式是git回滚到分支发散的地方,从远程引入更改,并应用回滚提交,每次提交一个。因此,当发生冲突时,您将在继续之前修改提交。由于历史的这种变化,您需要小心处理它。@doofuslarge是的,这基本上意味着所有获得分支的开发人员也应该进行重新调整。如果您仔细阅读git help rebase
,他们会将其描述为“连锁反应”。gerrit引入了变更集的概念,允许在mor中处理它