如何从另一个git分支进行合并(除了一些提交),并拥有正常/易于查询的历史记录?

如何从另一个git分支进行合并(除了一些提交),并拥有正常/易于查询的历史记录?,git,git-merge,Git,Git Merge,简短版本:我有一个master分支,人们正在致力于此。然后我得到了master的一个分支,称之为foo,人们也在致力于此。定期地,我想把从foo到master的一些变化带回来,但不是全部。我想通过某种方式查询master的历史记录,以查看foo中是否存在提交。这似乎有问题。我该怎么做 长版本:创建一个git回购示例,如下所示: cd /tmp && mkdir gitrepo && cd gitrepo/ && git init echo "Som

简短版本:我有一个
master
分支,人们正在致力于此。然后我得到了
master
的一个分支,称之为
foo
,人们也在致力于此。定期地,我想把从
foo
master
的一些变化带回来,但不是全部。我想通过某种方式查询
master
的历史记录,以查看
foo
中是否存在提交。这似乎有问题。我该怎么做

长版本:创建一个git回购示例,如下所示:

cd /tmp && mkdir gitrepo && cd gitrepo/ && git init
echo "Something shared" > myFile.txt && git add myFile.txt && git commit -m "Added myFile.txt to master"
git checkout -b foo master
echo "Something else shared" > anotherFile.txt && git add anotherFile.txt && git commit -m "Added anotherFile.txt to foo"
echo "Something specific to foo" > foochange.txt && git add foochange.txt && git commit -m "Added foochange.txt to foo"
echo "Something else shared again" > yetAnotherFile.txt && git add yetAnotherFile.txt && git commit -m "Added yetAnotherFile.txt to foo"
git checkout master
echo "Something specific to master" > masterchange.txt && git add masterchange.txt && git commit -m "Added masterchange.txt to master"
echo "Specific to master" > masterchange.txt && git add masterchange.txt && git commit -m "Added masterchange.txt on master"
(从这里开始的所有讨论都假设我们是在
master

现在我们有了这样的情况,
foo
master
之后有两个提交,并且有三个自己的提交。此时,我想将第一次和第三次提交从
foo
带回
master
,但不是第二次

基本问题是
foo
开头的提交的父级是我不想合并的提交,但由于提交的父级是该提交哈希的一部分,因此无法在
foo
的开头保留提交哈希,而不创建这样一种情况,即
git branch--contains foo^
对master是正确的

例如,如果我执行了
gitmergefoo
,它会将
foo
master
的所有提交合并。在这样做之后,我将能够说
git分支——包含foo^
,它将说
foo
master
都包含该提交。然后我尝试执行一个
git revert foo^
但是
git分支--contains foo^
仍然报告
master
contains
foo^

如果我
git cherry pick foo foo ^ ^
这两个相关的修订,那么我在
master
中应用了来自
foo
的这两个修订差异的更改,但是
git branch——包含foo ^
表示只有分支
foo
包含提交

我在这里试图实现的是某种查询历史记录的方法(无需手动关联作为文本存储在提交消息中的散列),这样我就可以看到哪些提交已经和没有合并到master中。如前所述,我知道有几种方法可以使master的状态与我想要的状态相同(cherry pick、merge+revert、format patch/am、diff/patch等)。我正在寻找的是一种查询历史以获取我需要的信息的方法。我知道,
git分支--contains
可能永远不会以我希望的方式工作,但是如果有其他方法来查询历史,我没有想到,我洗耳恭听


有人有什么想法吗?

我想
git cherry
是您要找的命令

git cherry -v master foo
这显示了
foo
中尚未(尚未)合并到
master
中的提交

$ git cherry -v master foo
+ 1cffcfb1d061d308e8d33c262e30282a26b195cb Added anotherFile.txt to foo
+ fe0599190a6953c970cd3f94e18ff0c282e89e2c Added foochange.txt to foo
+ 1b548eb45ff50e59f3522ee63edd0c177e842645 Added yetAnotherFile.txt to foo

$ git cherry-pick 1cffcfb1d061d308e8d33c262e30282a26b195cb
...

$ git cherry-pick 1b548eb45ff50e59f3522ee63edd0c177e842645
...

$ git cherry -v master foo
- 1cffcfb1d061d308e8d33c262e30282a26b195cb Added anotherFile.txt to foo
+ fe0599190a6953c970cd3f94e18ff0c282e89e2c Added foochange.txt to foo
- 1b548eb45ff50e59f3522ee63edd0c177e842645 Added yetAnotherFile.txt to foo
从手册中:

上游分支中已发生同等变化的分支 前缀为负号(-)的,以及仅存在于 头部分支的前缀为加号(+):


有没有办法像这样使用
git cherry
并且仍然合并分支?