如何从另一个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
containsfoo^
如果我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
并且仍然合并分支?