如何使用自定义差异创建一个git分支到master分支?

时间:2019-05-20 20:37:14

标签: git git-branch

抱歉,问题标题含糊,我不知道该如何措辞更好。基本上,我有一个master分支,其中有两个提交c1c2

    +-----> dummy1   +-----> dummy2
    |                |
    |                |
    |                |
    |                |
  c1+              c2+
   .                 .
   └── a.txt +       ├── a.txt
                     ├── b.txt +
                     ├── not-wanted.txt +
                     └── c.txt +

c1已添加a.txt文件。如您所见,c2已添加了另外三个文件。现在我想有两个伪分支,一个分支c1,另一个分支c2,这样当我执行git diff dummy1..dummy2时,我只会看到文件b.txtc.txt在差异。因此,dummy1<-dummy2之间的最终PR仅显示b.txtc.txt,而不显示not-wanted.txt

这可能吗?

3 个答案:

答案 0 :(得分:2)

由于您不希望显示not-wanted.txt,因此看起来您需要在删除not-wanted.txt之后创建新的提交。

Delete not-wanted.txt
git commit -m "c3"

现在从c1和c3创建两个分支

git branch dummy-1 c1
git branch dummy-2 c3

如果您还希望在某些分支中备份not-wanted.txt文件,则可以在c2处创建分支:

git branch backup-branch c2

答案 1 :(得分:2)

TL; DR:您将需要一些 new 提交。现有的提交无法满足您的需求。

Git与分支或文件无关:Git与提交有关。拉请求 2 使用分支名称,但这仅是为了让Git可以找到提交

换句话说,一切总是关于提交。名称,例如masterdevelop之类的分支名称,或v2.1之类的标签名称,或origin/master之类的远程跟踪名称,甚至是GitHub上的pull request —真的只能识别< em>一个特定的提交。每次提交都保存文件(实际上是所有 文件的完整快照)以及元数据,例如创建者(用户名和电子邮件地址),时间(日期和-时间戳),以及原因(日志消息)。

在分支或拉取请求中存在多个提交的事实是因为每个提交都通过哈希ID记录了其 parent 提交。每个提交都有自己唯一的哈希ID,每个commit 1 都表示 ...,如果您想知道我之前发生的事情,请提交XXXXXX ,其中{ {1}}是上一次提交的哈希ID。

因此,在您的设置中,您的母版上进行了一系列提交,这些提交以X结尾或进一步进行:

c2

其他人可能在其存储库中有一系列以...--B--c1--c2--D--E--F--G <--master 结尾的提交。如果是这样,您可以命名一个指向B的名称,为您提供:

c1

如果您现在使用...--B--c1 <-- name1 \ c2--D--...--G <-- master 向其他人发出拉取请求,则您是在要求其他人(其提交链以name1结尾)将您的提交B复制到他们的存储库,并设置的名称以指向c1

您也可以指向c1命名:

c2

,然后使用您的...--B--c1 <-- name1 \ c2 <-- name2 \ D--...--G <-- master 发出拉取请求,该请求要求某人将 name2c1 合并到他们的存储库中并设置他们的名字之一指向c2

无论您做什么,总是会问他们(无论他们是谁)采用他们的分支名称,该分支名称指向现有的共享提交c2,该共享提交已经存在于他们的存储库中,并且在您的文件中,并在其提交B的末尾添加新的提交。您控制的是您要求他们使用哪个特定提交。他们将把每次提交(从他们的B副本开始)到新的提示提交。因此,您可以进行一次新的提交,将其命名为B之后的c3,您可以通过分支名称c1来记住:

name3

此提交 c3 <-- name3 / ...--B--c1--c2--D--E--F--G <--master 具有您喜欢的任何内容。然后,您向他们发送拉取请求,要求他们设置 c3(或其他任何分支名称),以便他们复制提交{{而不是指向共享的提交master}。 1}}和B放入其存储库,然后将其名称设置为指向c1

要这样做:

c3

创建新的提交c3,分支名称$ git checkout -b name3 <hash-of-c1> ... make whatever changes you like, e.g., git cherry-pick -n <hash-of-c2> ... fix things up, git add files as needed ... $ git commit 将指向该提交。然后,您可以使用此c3名称和新的name3提交进行拉取请求。


1 在每个非空存储库中至少有一个提交具有 no 父级:这是第一个提交,没有以前的提交,因为它不能。有些提交有两个甚至更多的父级:这些是 merge 提交。不过,大多数提交只有一个父母。 Git的历史记录是 提交,通过使用从 last 提交向后工作(通过某个分支名称找到)一次生成一次(或合并时两个或多个)。

2 拉请求实际上并不是Git本身的一部分:它们是附加组件,由GitHub和Bitbucket之类的地方提供。 Git提供的是提交本身和方法(name3c3),用于在对等存储库之间接收和发送提交。在GitHub之前,人们会克隆一个Linux存储库,进行新的提交,然后通过电子邮件发送补丁以供审核和修订……事实上,他们仍然会这样做。

答案 2 :(得分:1)

无需创建单独的分支。您可以在当前分支中的提交之间进行区分:

git diff c1 c2

然后,如果需要,使用差异来创建补丁:How to see the changes between two commits without commits in-between?