如何查看Github提交何时来自请求请求/合并而不是直接提交?

时间:2019-01-02 19:00:06

标签: github

我们更喜欢GitHub的功能分支工作流程(主要是github工作流程)。我的职责之一是检查此工作是否完好无损,但是当我查看keyboardType={"phone-pad"}时,当审阅并接受PR时,在提交直接位于回购Vs上时,我看不到任何界限。

我绝对看不到将提交链接到PR或类似对象的方法。这可能/容易吗,我是否只是在Web UI上丢失了它?

1 个答案:

答案 0 :(得分:1)

简单的答案是,您可以告诉Github禁止直接推送到master。这样可以使您的工作自动化。所有提交给master的内容都必须来自PR。 https://help.github.com/articles/about-protected-branches/

您还可以要求某些自动状态检查通过,然后才能合并PR,例如自动代码审查和CI。 https://help.github.com/articles/about-required-status-checks/


更复杂的答案...

PR与其他任何提交都没有明显不同。但是根据您合并PR和查看提交的方式,会有很多线索。

git log和Github提交历史对您有所帮助。 Git历史是相互关联的提交与实际分支的提交,看起来像这样。

A - B - F - G - H - I [master]
     \         /
      ----C - D 

每个字母都是一个提交。它们相互连接。仓库从A开始。[master]是一个“分支标签”,但实际上只是一个指向提交I的标签。我们可以看到C,D和E是分支的一部分,而H是提交合并到母版中。

即使在分支被“删除”之后,所有这些都可以在历史记录中看到,因为这只会删除标签。如果您知道外观,仍可以查看历史记录。 git log --graph --decorate --all和其他各种存储库查看工具揭示了真实的历史。

$ git log --graph --decorate --all --oneline

*   f164d0e (HEAD -> master) Merge branch 'feature'
|\  
| * ae7b325 feature 2
| * 562cb51 feature 1
* | 2504fb9 master 4
* | a3e73ae master 3
|/  
* e8bd7c4 commit 2
* 46edb1d commit 1

我们可以清楚地看到合并点和在分支中完成的提交。当您合并PR时,Github会将更多信息添加到合并提交的消息中,例如PR#,以便可以追溯到其来源。以后对人们来说这是无价之宝。

不幸的是,Github和git log(默认情况下)构成了一个线性的历史记录,它整洁,易于阅读且错误。这是很多与Git混淆的原因。

$ git log --all --oneline

f164d0e (HEAD -> master) Merge branch 'feature'
2504fb9 master 4
a3e73ae master 3
ae7b325 feature 2
562cb51 feature 1
e8bd7c4 commit 2
46edb1d commit 1

除提交消息外,所有分支和合并的指示均丢失。因此,请务必查看真实的历史记录。


丢失历史记录的另一种方法是合并PR。壁球,变基和快速合并将丢失分支的历史记录。

南瓜

这是最糟糕的情况。它把分支中的所有提交都粉碎成一个提交。如果您的分支包含经过仔细考虑的提交和消息,它们清楚地说明了每次更改的原因,那么所有这些都将混杂在一起。

Before squash

* eb54d0d (feature) feature 2
* 218a926 feature 1
| * 2504fb9 (HEAD -> master) master 4
| * a3e73ae master 3
|/  
* e8bd7c4 commit 2
* 46edb1d commit 1

After squash

* d6054cf (HEAD -> master) Squashed commit of the following:
* 2504fb9 master 4
* a3e73ae master 3
* e8bd7c4 commit 2
* 46edb1d commit 1

虽然这对于进行合并的人员可能非常方便,但是对于以后尝试弄清楚该分支中的操作及其原因的任何人来说,这都是可怕的。

变基

有很多很多很好的基础用途。例如,更新功能分支最好使用rebase来完成,以避免历史记录中发生许多不必要的簿记合并。但是,当分支完成时,应将其合并,而不是重新建立基础。重定基消除了该分支的存在。

Before rebase

* eb54d0d (feature) feature 2
* 218a926 feature 1
| * 2504fb9 (HEAD -> master) master 4
| * a3e73ae master 3
|/  
* e8bd7c4 commit 2
* 46edb1d commit 1

After rebase

* aff85f0 (HEAD -> master) feature 2
* aa8bc45 feature 1
* 2504fb9 master 4
* a3e73ae master 3
* e8bd7c4 commit 2
* 46edb1d commit 1

至少个人提交仍然存在,但是拓扑证据表明,它们是作为解决问题的分支的一部分作为一个单元完成的。

快进

类似于重新设置基准,如果Git不需要合并,则不需要合并。它将向前移动分支标签。如果自建立分支以来在master上没有完成任何工作,就会发生这种情况。例如。

Before

* eb54d0d (feature) feature 2
* 218a926 feature 1
* e8bd7c4 (HEAD -> master) commit 2
* 46edb1d commit 1

After fast forward

$ git merge feature

* eb54d0d (HEAD -> master, feature) feature 2
* 218a926 feature 1
* e8bd7c4 commit 2
* 46edb1d commit 1