对不起,我是 git/github 的新手,即使我不知道如何使用正确的词来回答这些问题,所以我画了一些图表。
在分支 dev 中,我有两个提交,一个是对文件 a.py 的更改(提交 2),另一个是对文件 b.py 的更改(提交 3)。
我的第一个问题是现在我希望我的主人,在未来的提交 4 中,具有提交 3 中的文件 b.py 所具有的功能,但不是更改后的 a.py。如何用 git 来做?
我的第二个问题是,假设 github 中存储库的所有者是 A,然后我从提交 1 中分叉/克隆存储库,并按照描述使用两个提交 2 和 3 自己创建了 dev 分支。 A 同时已经有一些提交,说 1' 和 1''。现在我想将我对文件 b.py 而不是 a.py 的更改贡献给主分支。我该怎么做呢。我知道它一定是带有拉取请求的东西,但我还没有弄清楚。
对于这两个问题的具体答案,我将不胜感激,但也非常感谢一些指向某些免费 git 课程/书籍的适当部分的指针。谢谢。
更新:
我在这里将另一个分支命名为“dev”的坏处,实际上这是一个“功能”分支,并且该功能是通过在提交 2 时更改文件 a.py 启用的。所以直到我能够以某种方式在文件a.py的代码中做一种组合来覆盖这两种情况,master是一个软件,“dev”/“feature”分支是另一个软件。
但是文件 b.py 和 commit 3 的更改对两个分支/软件都有好处。问题是,如果我在“dev”/“feature”分支中的文件 a.py 之前更改了文件 b.py,则完全没有问题。在这种情况下,我可以将文件 b.py 上的更改合并到 master,并通过更改文件 a.py 继续开发功能分支。我知道现在的情况不太好,但两个变化都没有错,我不想摆脱它们。
我的(理论)解决方案:
这是一种明智的做法吗?
答案 0 :(得分:1)
很大程度上取决于您创建此分支的原因 (dev
)。这里的目标是什么?如果这是一个功能分支,并且您提交了第 2 次和第 3 次提交,而您只想丢弃第 2 次提交(这是一个彻头彻尾的错误),那么这是可能的。现在没有人会得到它。
但是如果你不想想扔掉提交 2,但你不想 master
或 PR 拥有它,那么问题是,这个分支是什么无论如何?在我看来,在这种情况下,这只是错误的分支。如果您要将 3 但不是 2 合并到事物中,您应该创建一个 不同的 分支,它有 3 但没有 2。
换句话说,如果你只为文件 b 贡献了一些东西,那么你只需要一个分支来处理文件 b 上的更改。
所以我要做的就是彻底重组这些分支。我会将我的更改分为影响文件 a 的分支和影响文件 b 的另一个分支。现在你可以将影响文件 b 的分支合并到 master,或者将它作为 PR 发送,或者其他什么。
然后,在本地,您可以将 file-b 分支合并到 file-a 分支中。现在你和你一个人有两组提交,你可以继续在 file-a 分支上工作,它现在也包含 file-b 更改。
答案 1 :(得分:1)
你有选择。我认为第一个问题是您是否完全想要 commit 2 中的更改,或者它们是否是一个错误并且您想摆脱它们。如果它们是错误的,那么最简单的方法就是在您的 dev
分支上执行“git revert” commit 2。然后 dev
将只有提交 3 次更改,然后您可以继续将该分支合并到您希望提交 3 次更改去的任何位置。
如果你仍然想要提交 2,而你只是想把 2 和 3 分开,那么事情就更复杂了,你做什么取决于你想要在 dev
分支中得到什么......只是2 或只是 3。如果您希望 3 留在 dev
中,则从 2 中创建一个分支,然后为它创建一个新分支,然后执行我上面描述的相同操作...应用提交 2 的还原到 dev
分支。如果您希望 dev
分支中有 2 个,而其他地方有 3
,那么您可能希望将 3 选到您希望这些更改发生的任何位置,然后从 dev
恢复 3分支,以便它只包含提交 2。
答案 2 :(得分:0)
使用樱桃。
git log
- 查找提交哈希。
git cherry-pick "commit hash"
- 应用特定提交的更改。
最简单的方法是从 master 创建新的分支,并从 dev 分支中挑选必要的提交,然后发出拉取请求。