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

时间:2014-10-20 19:42:24

标签: git merge git-rewrite-history

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

enter image description here

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

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

在合并主题后修复主题会有什么好处?

2 个答案:

答案 0 :(得分:1)

好吧,我可以想到一个黑客来做到这一点。仅当主分支包含在远程存储库中并且您始终可以从那里拉出它时,它才有效。然后,您应该在本地存储库中执行以下步骤:

  1. git checkout master
  2. git reset --hard <C3> - 重置为合并提交前的提交
  3. git checkout topic
  4. 在C6
  5. 做你想做的事
  6. git commit --amend - 这允许您实际将C2保存在C2中
  7. git checkout master
  8. git pull origin master - 提取您已从远程存储库重置的所有提交
  9. git merge topic
  10. 请注意,只有当master分支不是您的本地分支,而是存储在远程存储库中时,才能执行此操作。此外,只有当您还没有将工作推送到远程存储库时,它才有效。

答案 1 :(得分: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