![](/img/trans.png)
[英]How to easily examine empty commits on a git branch from some point on?
[英]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^
并且它会说foo
和master
都包含该提交。 我尝试然后做一个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.