3

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

在此处输入图像描述

我的主题是在 C2 中的一个主题分支中实现的,然后在主分支上合并。对于另一个主题,master 上还有另一个提交 C5。现在我刚刚发现在 C2 中实现的功能存在问题。我应该在主题分支中将其修复为 C6,然后在主分支上再次合并吗?或者我应该摆脱主题分支,因为它已经合并并直接在主分支中修复它?

理想情况下,我希望将 C2 和 C6 保留在一次提交中,这样当我们实现远程存储库时,我可以推送干净的历史记录。但我认为我不能因为合并而压缩 C2 和 C6。有没有办法做到这一点?

合并后修复主题的最佳做法是什么?

4

2 回答 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

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

于 2014-10-20T20:30:46.947 回答
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
于 2014-10-20T20:51:54.567 回答