创建了一个来自 master
的新分支,我们将其称为 test
.
有几个开发人员要么提交 master
,要么创建其他分支,然后合并到 master
.
假设 test
上的工作需要几天时间,并且您希望通过 master
内的提交继续保持 test
更新 .
我会从 test
做 git pull origin master
.
Question 1: 这是正确的做法吗?其他开发人员可以轻松地处理相同的文件,就像我工作顺便说一句 .
我在 test
上的工作已经完成,我准备将它合并回 master
. 以下是我能想到的两种方式:
A:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
我没有使用 --rebase
因为根据我的理解,rebase将从 master
获得更改并将我的堆叠放在其上,因此它可以覆盖其他人所做的更改 .
Question 2: 这两种方法中哪一项是对的?那有什么区别?
所有这一切的目标是让我的 test
分支更新 master
中发生的事情,之后我可以将它们合并回 master
,希望尽可能保持时间线的线性 .
8 回答
我该怎么做
如果我有一个来自远程的本地分支机构,我对我想要推送的内容感到满意,而且我根本不会推送那些只针对我和我的本地存储库的东西 . 在您的描述中,似乎
test
仅适合您?所以没有理由发表它 .git总是试图尊重你和其他人的变化,所以
--rebase
. 我不认为我可以适当地解释它,所以看一下the Git book - Rebasing或git-ready: Intro into rebasing进行一些描述 . 这是一个非常酷的功能这是一个非常实际的问题,但上述所有答案都不切实际 .
喜欢
这种方法有 two issues :
这是不安全的,因为我们不知道测试分支和主分支之间是否存在任何冲突 .
它会将所有测试提交“挤压”到master上的一个合并提交中;也就是说在master分支上,我们看不到测试分支的所有更改日志 .
所以,当我们怀疑会有一些冲突时,我们可以进行以下git操作:
在
commit
之前测试merge
,避免--no-ff
的快进提交,如果遇到冲突,我们可以运行
git status
来检查有关冲突的详细信息并尝试解决一旦我们解决了冲突,或者没有冲突,我们就会
commit
和push
但是这种方式将丢失测试分支中记录的更改历史记录,并且它会使主分支很难让其他开发人员了解项目的历史记录 .
所以最好的方法是我们必须使用
rebase
而不是merge
(假设,在这个时候,我们已经解决了分支冲突) .以下是一个简单的示例,对于高级操作,请参阅http://git-scm.com/book/en/v2/Git-Branching-Rebasing
是的,当你完成鞋面时,所有Test分支的提交都将转移到Master分支的头部 . 变基的主要好处是可以获得线性且更清晰的项目历史记录 .
你唯一需要避免的是:永远不要在公共分支上使用
rebase
,就像master branch一样 .Never do operations 如下:
https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing的详细资料
附录:
我会使用rebase方法 . 主要是因为它在语义上完美地反映了你的情况,即 . 你想要做的是刷新当前分支的状态并“假装”,就好像它是基于最新的 .
所以,即使没有查看
master
,我也会:当然,只是从原点获取不会刷新
master
的本地状态(因为它不执行合并),但它完全可以达到我们的目的 - 我们希望避免切换,以节省时间 .合并后,如果文件被更改,那么当你合并它将通过“Resolve Conflict”错误
那么你需要首先解决所有的冲突然后,你必须再次提交所有的更改然后推送
在测试分支中做了更改的人更好,因为他知道他做了什么改变 .
无论是rebase还是合并都不应该覆盖任何人的更改(除非您在解决冲突时选择这样做) .
开发过程中的常用方法是
当你准备合并回主人,
如果您担心在合并中出现问题,
git merge --abort
就在那里 .使用push然后pull作为合并的手段是愚蠢的 . 我也不确定你为什么要把测试推向原点 .
旧线程,但我还没有找到自己的方式 . 对于使用rebase工作并想要从master上的分支合并所有提交的人来说,它可能很有 Value . 如果存在冲突,则可以针对每次提交解决冲突 .
Get Master and Branch up-to-date:
Merge Branch on top of Master:
If you run into Conflicts during the Rebase:
首先,解决文件中的冲突 . 然后:
Once rebase finished, rebase branch on top of master:
我会首先使待合并的分支尽可能干净 . 运行测试,确保状态符合您的要求 . 通过git squash清理新提交 .
除了KingCrunches answer,我建议使用
您可能在另一个分支中进行了许多提交,这应该只是主分支中的一个提交 . 要使提交历史记录尽可能干净,您可能希望将所有提交从测试分支压缩到主分支中的一个提交(另请参见:Git: To squash or not to squash?) . 然后,您还可以将提交消息重写为非常富有表现力的内容 . 一些易于阅读和理解的东西,无需深入研究代码 .
编辑:你可能会感兴趣
In git, what is the difference between merge --squash and rebase?
Merging vs. Rebasing
How to Rebase a Pull Request
所以在GitHub上,我最终为功能分支
mybranch
做了以下事情:从原点获取最新信息
找到合并基础哈希:
现在确保只有第一个是
pick
,其余的是s
:接下来选择一个非常好的提交消息并推送到GitHub . 然后发出拉取请求 .
合并拉取请求后,您可以在本地删除它:
并在GitHub上
这是我在团队工作中使用的工作流程 . 场景如您所述 . 首先,当我完成
test
工作时,我会与主人一起工作,以便在我工作test
分支期间拉入已添加到master的任何内容 .git pull -r upstream master
这将把更改提取到master,因为您分叉了
test
分支并应用它们,然后应用您在测试中编辑的更改 . 如果有,您将必须手动修复它们并提交 . 一旦你很好地切换到主分支并合并test
in没有问题 .