3

简短版本:我有一个master分支,人们正在努力并致力于。然后我有一个分支master,称之为foo人们也在努力并致力于的分支。定期,我想带来一些,但不是全部,从fooback 到master. 我希望通过某种方式master来查询历史记录的存在和不存在foo。这似乎有问题。我该怎么做呢?

长版:创建一个示例 git repo,如下所示:

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并且自己有三个提交的情况。在这一点上,我想将第一个和第三个提交从footomaster但不是第二个带回。

根本问题是,提交的父级foo是我不想合并的提交,但是由于提交的父级是该提交的哈希的一部分,因此无法保留头部提交的哈希也foo没有创造一个git branch --contains foo^对主人来说是真实的情况。

例如,如果我这样做git merge foo了,它将合并所有从footo的提交master。在这样做之后,我可以git branch --contains foo^说它会说两者foomaster包含该提交。然后我尝试做一个git revert foo^git branch --contains foo^仍然报告master包含foo^.

如果我git cherry-pick foo foo^^有两个相关的修订,那么我有来自foo应用的这两个修订的差异的更改master,但git branch --contains foo^说只有分支foo包含该提交。

我在这里尝试实现的是某种查询历史记录的方法(无需手动关联存储为提交消息中的文本的哈希),因此我可以查看哪些提交已合并到主控中,哪些尚未合并到主控中。如前所述,我知道几种方法可以让 master 的状态与我想要的一样(cherry-pick、merge+revert、format-patch/am、diff/patch 等)我正在寻找的是某种方式来查询我需要的信息的历史记录。我知道这git branch --contains可能永远不会以我想要的方式工作,但如果有一些替代方法来查询历史,我没有想到,我全神贯注。

有人有想法么?

4

1 回答 1

5

我认为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

从手册:

在上游分支中已经具有等效更改的以减号 (-) 为前缀,仅在头分支中存在的以加号 (+) 为前缀:

于 2012-05-31T13:46:57.003 回答