git合并分支后修复主题的正确方法

3

我是Git的新手,目前只在本地存储库中工作,但最终会与其他开发人员共享我的工作。我正在尝试弄清楚在将主题分支合并回主分支后修复代码的正确方法。这是我的情况:

enter image description here

我的主题在主题分支中的C2中实现,然后合并到主分支上。对于另一个主题,主分支上已经有了另一个提交C5。现在我发现了使用C2实现的功能存在问题。我应该在主题分支中修复它作为C6,然后再次合并到主分支上吗?还是应该直接在主分支上解决,因为主题分支已经合并了?

理想情况下,我希望将C2和C6保留在单个提交中,以便在实现远程存储库时可以推送干净的历史记录。但是,由于合并,我不认为我可以简单地压缩C2和C6。有什么办法吗?

在合并后修复主题的良好做法是什么?

2个回答

1

好的,我可以想到一种方法来实现这个。它只在主分支包含在远程仓库中并且您可以随时从那里拉取时才有效。然后您应该在本地仓库中执行以下步骤:

  1. git checkout master
  2. git reset --hard <C3> - 将其重置为合并提交之前的提交
  3. git checkout topic
  4. 在 C6 中进行您想要做的操作
  5. git commit --amend - 这允许您将 C6 实际保存在 C2 中
  6. git checkout master
  7. git pull origin master - 拉取您已重置的所有提交来自远程仓库
  8. git merge topic

请注意,只有当主分支不是您的本地分支而存储在远程仓库中时,才能执行此操作。此外,仅当您尚未将工作推送到远程仓库时才有效。


我能否创建此存储库的副本并将其用作远程来实现您所描述的“hack”? - scharette
在这种情况下,解决方案会更加丑陋:我可以考虑从主分支创建另一个分支,例如 git branch temp,与主分支相同,然后执行我的答案中的所有操作。我们不是从源存储库拉取,而是从 temp 分支使用 git cherry-pick C5。最后删除 temp 分支。 - ZuoLi
@loopkin,我认为最好将所有相关内容保留在同一个分支中。你说你现在正在本地存储库中工作,这意味着所有这些技巧都是可行的,并且在推送到远程存储库后它们看起来不会很丑陋,因为它们是无法跟踪的。 - ZuoLi
@ZuoLi 嗯,假设我有一个远程 repo,并且当我在 C0 时拉取了主分支,那么当我推送我的更改时,它会推送我主分支上的所有提交,对吧?因此,C4 和 C7 将显示为 2 个不同的提交。这就是我想要避免的。或者我想太多了吗?我应该不用在意吗? - scharette
@loopkin,在两个答案中,您最终将在主题分支中只有一个(修改后的)提交C2,并且在主分支中只有一个合并提交(在C5之后,例如C7)。 - ZuoLi
显示剩余2条评论

1

如果你学习了 git rebase ,它将有助于你管理本地历史记录。例如,考虑以下命令的历史记录,我认为大致重现了你的情况,并使用 git rebase -i 来重新排列你的本地历史记录可能会有解决方案:

mkdir tmpfoo
cd tmpfoo/
git init
touch bar
git add .
git commit -am 'c1'
git checkout -b topic
touch baz
git add .
git commit -am 'c2'
git checkout master
touch foo 
git add .
git commit -am 'c3'
git merge topic
touch quux
git add .
git commit -am 'c5'
git checkout topic 
echo b >> baz 
git commit -am 'c6'
git checkout master
git merge topic
git log --oneline --graph --decorate --all
*   577f974 (HEAD, master) Merge branch 'topic'
|\
| * 6750b0d (topic) c6
* | 08ebbf2 c5
* |   0cef647 Merge branch 'topic'
|\ \
| |/
| * f1e6882 c2
* | 0e19228 c3
|/
* 90e6149 c1
19933  git rebase -i 90e6149
>>edit the sequence of commits to something like the following:
pick 0e19228 c3
pick 08ebbf2 c5
pick f1e6882 c2
s 6750b0d c6
19934  git log --oneline --graph --decorate --all
* 0e3afe0 (HEAD, master) c2
* 7611fb9 c5
* 0e19228 c3
| * 6750b0d (topic) c6
| * f1e6882 c2
|/
* 90e6149 c1
git diff ORIG_HEAD # no output here, the rebase didn't change the working tree's state

谢谢@jonderry,这看起来就是我需要的。如果我理解正确,您使用交互式变基从历史记录中删除c4,而不是合并主题分支,您将其留在那里,如果需要其他变基,则可以潜在地稍后使用它? - scharette
如果您认为在重新排列之前可能需要旧工作,那么最好将分支保留一段时间,这样您就不必搜索reflog以查找旧的部分工作。交互式变基可以重新排序提交并将几个提交“压缩”为一个较大的提交。 - jonderry
你可能想要编辑你的答案,替换掉commitcheckout的别名。 - Andrew C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接