从master
创建一个新的分支,我们称之为test
。
有几个开发人员要么提交到master
,要么创建其他分支,然后合并到master
。
假设test'的工作需要几天时间,你想用
master'内的提交持续更新`test'。
我会从test
做git pull origin master
。
问题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
获得修改,并在此基础上堆积我的修改,因此它可能会覆盖其他人的修改。
问题2:这两种方法中哪一种是正确的? 有什么区别?
这一切的目的是让我的test'分支与
master'中发生的事情保持同步,以后我可以把它们合并到`master'中,希望尽可能保持时间轴的线性。
我将如何做到这一点
git checkout master
git pull origin master
git merge test
git push origin master
如果我有一个来自远程的本地分支,我不太愿意把这个分支和远程分支合并。我也不会推送我的修改,直到我对我想推送的内容感到满意,而且我也不会推送那些只属于我和我的本地仓库的东西。在你的描述中,"测试 "似乎只为你而设?所以没有理由发布它。
git总是试图尊重你和其他人的修改,`--rebase'也会如此。我不认为我可以适当地解释它,所以请看一下 Git书--Rebasing 或 git-ready: Intro into rebasing 的小说明。这是个相当酷的功能
这是一个非常实际的问题,但上述所有答案都不实际。
比如说
git checkout master
git pull origin master
git merge test
git push origin master
这种方法有**两个问题。
1.这是不安全的,因为我们不知道测试分支和主分支之间是否有任何冲突。
2.2.这将把所有的测试提交挤到主干分支的一个合并提交中;也就是说,在主干分支上,我们无法看到测试分支的所有修改日志。
所以,当我们怀疑会有一些冲突时,我们可以进行以下git操作。
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
在 "提交 "前测试 "合并",通过 "不提交 "避免快速提交。
如果遇到冲突,我们可以运行git status
来检查冲突的细节并尝试解决
git status
一旦我们解决了冲突,或者没有冲突,我们就提交
并推送
它们
git commit -m 'merge test branch'
git push
但这种方式会丢失测试分支中记录的修改历史,而且会使主分支难以被其他开发者了解项目的历史。
所以最好的方法是用 "rebase "代替 "merge"(假设此时我们已经解决了分支冲突)。
下面是一个简单的例子,关于高级操作,请参考http://git-scm.com/book/en/v2/Git-Branching-Rebasing
git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test
是的,当你完成了上位,所有测试分支的提交都会被移到主干分支的头上。重置的主要好处是,你可以得到一个线性的、更干净的项目历史。
你唯一需要避免的是:永远不要在公共分支上使用rebase
,比如主分支。
不要做如下操作。
git checkout master
git rebase -i test
https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing 的详细信息
附录。
重置和合并都不应该覆盖任何人的修改(除非你在解决冲突时选择这么做)。
开发时的通常做法是
git checkout master
git pull
git checkout test
git log master.. # if you're curious
git merge origin/test # to update your local test from the fetch in the pull earlier
当你准备合并回主站时。
git checkout master
git log ..test # if you're curious
git merge test
git push
如果你担心在合并过程中破坏了什么,git merge --abort
会帮你。
使用先推后拉作为合并的手段是很愚蠢的。我也不确定你为什么要把测试推送到origin。