抱歉,问题标题含糊,我不知道该如何措辞更好。基本上,我有一个master
分支,其中有两个提交c1
和c2
:
+-----> 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.txt
和c.txt
在差异。因此,dummy1<-dummy2
之间的最终PR仅显示b.txt
和c.txt
,而不显示not-wanted.txt
。
这可能吗?
答案 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可以找到提交。
换句话说,一切总是关于提交。名称,例如master
或develop
之类的分支名称,或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
发出拉取请求,该请求要求某人将 name2
和c1
合并到他们的存储库中并设置他们的名字之一指向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提供的是提交本身和方法(name3
和c3
),用于在对等存储库之间接收和发送提交。在GitHub之前,人们会克隆一个Linux存储库,进行新的提交,然后通过电子邮件发送补丁以供审核和修订……事实上,他们仍然会这样做。
答案 2 :(得分:1)
无需创建单独的分支。您可以在当前分支中的提交之间进行区分:
git diff c1 c2
然后,如果需要,使用差异来创建补丁:How to see the changes between two commits without commits in-between?