被git diff搞糊涂了

被git diff搞糊涂了,git,bitbucket,diff,patch,git-diff,Git,Bitbucket,Diff,Patch,Git Diff,我想生成分支和主分支之间差异的补丁文件。但是这个分支的使用时间很长,所以我只是从master那里合并了一个分支来更新它。如果我开始在Bitbucket中创建pull请求,我可以很好地看到这些差异。但是当我在我的分支上执行git diff master..时,我看到的差异并不存在。它们是合并的结果吗?我如何获得与Bitbucket相同的差异列表?仅是我的分支和主分支之间的差异?TL;博士 我不清楚您的困惑是从哪里开始的,但值得注意的是,使用git diff与生成pull请求是完全不同的。最终,它将

我想生成分支和主分支之间差异的补丁文件。但是这个分支的使用时间很长,所以我只是从master那里合并了一个分支来更新它。如果我开始在Bitbucket中创建pull请求,我可以很好地看到这些差异。但是当我在我的分支上执行
git diff master..
时,我看到的差异并不存在。它们是合并的结果吗?我如何获得与Bitbucket相同的差异列表?仅是我的分支和主分支之间的差异?

TL;博士 我不清楚您的困惑是从哪里开始的,但值得注意的是,使用
git diff
与生成pull请求是完全不同的。最终,它将归结为在正确的特定提交上运行
git diff
。诀窍在于找到正确的答案

长的 存储库中有什么 首先,记住Git保留的是什么。在某种基本级别上,Git关心的是以提交形式保存的源快照。提交包含某个源树的完整快照。提交还包含一些元数据:提交人的姓名和电子邮件地址,有时两个人(作者和提交人:可能相同,也可能不同)以及提交时间戳;父提交ID,以便Git可以将提交序列显示为谁(作者)做了什么(见下文)以及何时(时间戳)的历史记录;还有一条日志信息,提供作者对他们为什么这么做的描述

由于每次提交都是一个完整的快照,为了查看谁实际做了什么,我们必须使用类似于
gitdiff
的命令。假设我们在分支
master
上连续完成了两次提交,如下所示:

(parent)   (child)
df731ac <- 049a12b   <-- master
添加一个新的提交只需编写提交
D
,将
C
作为其父级,并使
master
指向
D

A--B--C--D   <-- master
比如说。但您必须找到这些提交,或者Git将转换为这些提交的名称

(不管你说
git diff A B
还是
git diff A..B
,它们的意思是完全相同的。这与
git log
和大多数其他git命令不同:只有
git diff
对两个点
语法有这种特殊处理。
但是,如果名称丢失,这是git diff和其他git命令所共有的。)


1Git的
git diff
可以产生一种称为组合diff的东西,但这些东西相当复杂,在这里不相关


旁白:
git show
git log-p
我在上面提到了
git show
git show
所做的是为您自动查找父提交,然后首先显示元数据、作者(姓名、电子邮件、时间戳)和日志消息,然后显示父级与子级之间的差异

当您运行
git log-p
时,这类似于在每次提交时运行
git show
,从最子级开始并向后运行(注意
git log
默认从
头开始)也就是说,首先,
git log
显示当前分支的tip commit,就像通过
git show HEAD
一样,然后它显示commit的父级,就像通过
git show
一样,然后它显示父级,依此类推

有一个相当大的区别:
git show
将在任何合并提交时调用特殊的组合diff机制,而
git log
默认情况下只显示日志消息,跳过任何区分合并的尝试。(有一些标志可用于更改此行为。)

拉取请求 Pull请求更复杂,因为为了发出Pull请求,您必须向能够运行
git Pull
2的其他人打开存储库——这就是术语的来源,也是Pull请求的原始含义,或者查找或创建共享存储库,将一些提交推送到该共享位置,然后然后让另一个人从共享位置获取您的提交。我将忽略“pull request”的原始含义——本质上只是一封电子邮件,要求其他人运行
git fetch
——而是跳转到这些网站处理它的方式

对于像GitHub和Bitbucket这样的服务,现在至少还涉及到另外两个存储库。它们甚至运行了一个试用合并(虽然这并不重要,只是为了验证拉取请求是否合理)。我对GitHub比Bitbucket更熟悉(我自己使用GitHub),但至少从足够高的层次来看,两者的工作方式相同

在您考虑拉取请求之前,您必须“fork”存储库。fork是一个克隆,但是有一些额外的内存,关于它是从哪个存储库克隆来的。3在幕后,以一种你通常不必关心的方式,4提供商进行大量的存储共享,因此每个fork在提供商的服务器上占用很少的空间

不过,这种分叉正是涉及到两个额外存储库的原因。这为我们提供了三个必须跟踪的存储库:

  • 您自己的Git存储库,在您的计算机上。这是您的,您可以随意使用。您也可以在这里运行
    Git diff
  • 原始存储库的分支。您的机器和Git将把它称为
    远程
  • 原始存储库。此存储库中不一定有任何名称。您可以也可能应该添加另一个远程存储库,在其他示例中称为
    上游
    。并不总是要求您添加此存储库,但假设您添加了。如果没有,请运行:

    git remote add upstream <url>
    
    而你
    git推原始主机
    ,你让你的git调用他们的git并说“我想让你设置你的git diff 0123456 fedcba9
    
    git remote add upstream <url>
    
     ...--H--I--J   <-- master
    
    ...--H--K   <-- master
    
           K   [abandoned]
          /
    ...--H--I--J   <-- master