问题描述
场景如下:
对于一个项目,比如github上的Spring Security,完成如下:
- 分叉和克隆
git remote add upstream URL-Remote-Repository
git fetch upstream
- 在 master 分支
git merge upstream/master
第一次使用,一切正常。
一个新的分支被创建来修复或添加一些东西 - git checkout -b gh-150
被执行了(还没有 git commit
被执行),完成工作需要几天时间,一旦完成,在执行 { {1}}(第一次为该分支执行该命令),我确认在过去的日子里,原始(远程)存储库代码发生了变化
从远程存储库获取新代码到 master 并避免丢失本地分支中的任何数据的正确方法是什么?它的目的是稍后向服务器发送拉取请求。因此我们的目标是,保留本地分支的新代码,从 master 获取新代码(不丢失任何数据),并将 pull request 发送到服务器。
即使我在本地分支中提交并返回主分支,执行提取和合并,我的本地分支还没有针对主分支进行更新。如果我返回本地分支并尝试从主分支合并到本地分支,我将丢失更新的代码(当然,如果编辑了相同的组件)
假设理想的场景应该如下所示:
- 我创建了新分支并编辑了我的更改
- 我确认在那几天远程存储库中没有任何更改,因此不需要它进行提取和合并 - 所以新的更改只存在于我身边
- 所以我可以放心地发送拉取请求
考虑:(不关闭这篇文章):我知道 git 和 github 多年前就可用了,但我假设存在一个标准(主要是新的或当前的标准/方法)来平静地处理这种情况,而不会有因错误丢失任何数据的风险 - 例如这些年来经验的最佳实践。
解决方法
“如果我返回本地分支并尝试从主分支合并到本地分支,我将丢失更新的代码(当然,如果编辑了相同的组件)”--> 您不会丢失它们, 合并 会将 master 的新修改应用到您分支中的 新提交 如果没有任何冲突,它是透明的,您也可以直接在拉取请求中执行(或使用命令 git merge master
)
或者,可以选择使用 master 重新设置分支,其主要优点是使您的分支与 master 位于同一历史线(如果您希望 master 分支具有历史记录,这很棒没有任何合并提交)。代价是 master 的新提交可能会出现在您的分支上,并使其不太清楚。
rebase 非常简单:
git checkout yourbranch
-
git rebase master
-- 这里 git 会提示你解决所有冲突
我认为最好的做法是从 master 变基,但这实际上取决于您的用例。