gpt4 book ai didi

git - 我如何从另一个 git 分支 merge ,接受一些提交,并具有相同/易于查询的历史记录?

转载 作者:太空狗 更新时间:2023-10-29 13:56:55 24 4
gpt4 key购买 nike

简短版本:我有一个 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 上)

现在我们遇到了这样的情况,其中 foomaster 之后的两个提交,并且它自己有三个提交。在这一点上,我想将第一次和第三次提交从 foo 带回 master 但不是第二次。

根本问题是 foo 头部提交的父级是我不想想要 merge 的提交,但由于提交的父级是该提交的哈希值的一部分 没有办法在 foo 的头部保留提交的哈希值,而不创建 git branch --contains foo^ 为 true 的情况大师。

例如,如果我执行 git merge foo,它将 merge 从 foomaster 的所有提交。这样做之后,我可以说 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 包含该提交。

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

有人有什么想法吗?

最佳答案

我认为 git-cherry 是您正在寻找的命令。

git cherry -v master foo

这显示 foo 中尚未(尚未) merge 到 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

来自手册:

The ones that have equivalent change already in the upstream branch are prefixed with a minus (-) sign, and those that only exist in the head branch are prefixed with a plus (+) symbol:

关于git - 我如何从另一个 git 分支 merge ,接受一些提交,并具有相同/易于查询的历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10834593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com