繁体   English   中英

我如何从另一个git分支合并,除了一些提交,并且有理智/易于查询的历史记录?

[英]How do I merge from another git branch, excepting some commits, and have sane/easily queried history?

简短版本:我有一个master分支,人们正在努力并承诺。 然后我有一个master的分支,称之为foo ,人们也正在努力并承诺。 我想定期将一些但不是全部的变化从foo带回到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并且有三个提交它自己的。 此时我想将第一次和第三次提交从foo恢复为master而不是第二次提交。

最根本的问题是,在头提交父foo是承诺,我不想合并,但由于提交的父母都是犯的哈希值的部分有没有办法保存的提交的哈希foo头部也没有创建一个git branch --contains foo^对于master来说是真的情况。

例如,如果我执行git merge foo它会将所有提交从foo合并到master 在这之后,我可以说git branch --contains foo^并且它会说foomaster都包含该提交。 我尝试然后做一个git revert foo^但是git branch --contains foo^仍然报告master包含foo^

如果我git cherry-pick foo foo^^这两个相关的修订版,那么我从那些应用于master foo修改了这两个修订版的差异,但git branch --contains foo^表示只有分支foo包含该提交。

我在这里想要实现的是查询历史记录的一些方法(没有手动关联在提交消息中存储为文本的哈希),因此我可以看到哪些提交已经并且尚未合并到主服务器中。 如上所述,我知道有几种方法可以让master的状态等同于我想要的东西(cherry-pick,merge + revert,format-patch / am,diff / patch等)我正在寻找的是某种方式来查询我需要的信息的历史 我得到那个git branch --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

从手册:

已经在上游分支中具有等效变化的那些前缀带有减号( - ),而仅存在于头分支中的那些前缀带有加号(+)符号:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM