我希望使用rebase
而不是merge
来避免我的远程存储库上的重复分支交叉点。
为了让您更好地了解我想要达到的目标,请考虑以下情况:
$ git lg
* 2345678 hotfix (HEAD -> master)
* 1234567 foo (origin/master, origin/HEAD)
$ git push
! [rejected] master -> master (fetch first)
$ git fetch
$ git lg
* 2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
通常,解决此问题的标准方法是merge
后跟push
。
$ git merge origin/master
$ git lg
* 4567890 Merge remote-tracking branch 'origin/master'
|\
* | 2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
$ git push
我不喜欢这种解决方案,因为在这种特殊情况下我可以轻松避免分支。所以,让我们用git reset --hard head~1
恢复更改并尝试另一种解决方案:
$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: hotfix
$ git lg
* 2345678 hotfix (master)
| * 5678901 hotfix (HEAD)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
现在出现了令人不快的部分,我必须将master
移回HEAD
:
$ git branch -D master
$ git checkout -b master
$ git push
$ git branch --set-upstram-to=origin/master master
Branch master set up to track remote branch master from origin.
$ git lg
* 5678901 hotfix (HEAD -> master, origin/master, origin/HEAD)
* 3456789 other change
* 1234567 foo
我的问题是如何简化我的rebase
并避免令人不快的部分?
答案 0 :(得分:3)
我认为最简单的方法是改变拉动工作流程。这里有几个选项。
首先,您可以使用out
标记来提取
str
根据文档,--rebase
在其默认配置中执行git pull --rebase
后跟git pull
。使用fetch
标记会将merge
替换为--rebase
:)
其次,您可以将默认值设置为始终使用merge
rebase
我会推荐第一种方法,因为设置rebase的默认值会让我感到紧张。我为git pull
创建了一个别名git config --global pull.rebase true
,以便更轻松。这样我就能做出决定。
答案 1 :(得分:2)
问题是您直接在本地主分支上工作。当您对主分支进行一些本地更改并且在您启动之后还有上游更改时,您将遇到问题中描述的冲突。因此,避免这种情况的解决方案只是不直接在主分支上工作,而是在一个或多个其他本地分支上工作。
因此,您将修补程序更改放在单独的分支上,比如说hotfix_branch
,然后正常获取/拉取主分支(没有任何冲突!)。当您想要提供修补程序更改时,请重新设置botfix分支以保持在新拉出的主分支之上,将修补程序分支合并到主分区并推送。
示例命令:
$ git pull master
$ git checkout -b hotfix_branch master
$ $EDITOR some.file
# Time passes and changes are made on origin/master
$ git add some.file
$ git commit -m "hotfix"
$ git pull master # No conflicts sine master is "clean"
$ git rebase master hotfix_branch # This step might have merge conflicts but
# if so those will come no matter what you
# do with regards to branching
$ git checkout master
$ git merge hotfix_branch
$ git push
有一个很小的窗口,你可以在拉动和尝试推动主人之间对原点/主人进行新的更改,但如果是这样你只需要做
$ git checkout master # if not already on the master branch
$ git reset origin/master
然后再次从上面列表中的第二个pull master
命令开始。