从 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
乙:
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
如果我有一个来自远程分支的本地分支,我不喜欢将除此分支之外的其他分支与远程分支合并。此外,我不会推送我的更改,直到我对我想要推送的内容感到满意并且我根本不会推送任何东西,这仅适用于我和我的本地存储库。在您的描述中,test
似乎只适合您?所以没有理由发布它。
git 总是试图尊重你和其他人的变化,--rebase
也是如此。我认为我无法恰当地解释它,因此请查看 the Git book - Rebasing 或 git-ready: Intro into rebasing 以获得一些说明。这是一个很酷的功能
这是一个非常实用的问题,但是上面所有的答案都不实用。
喜欢
git checkout master
git pull origin master
git merge test
git push origin master
这种方法有两个问题:
这是不安全的,因为我们不知道 test 分支和 master 分支之间是否有冲突。它会将所有测试提交“挤压”到 master 上的一个合并提交中;也就是说在master分支上,我们看不到test分支的所有变更日志。
因此,当我们怀疑会有一些冲突时,我们可以进行以下 git 操作:
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
在 commit
之前测试 merge
,避免 --no-ff
的快进提交,
如果遇到冲突,我们可以运行 git status
来检查冲突的详细信息并尝试解决
git status
一旦我们解决了冲突,或者如果没有冲突,我们commit
和push
他们
git commit -m 'merge test branch'
git push
但是这种方式会丢失测试分支中记录的更改历史,并且会使 master 分支难以让其他开发人员了解项目的历史。
所以最好的方法是我们必须使用 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
是的,当你完成了 upers 之后,所有 Test 分支的提交都将被移到 Master 分支的头部。变基的主要好处是您可以获得线性且更清晰的项目历史记录。
您唯一需要避免的是:永远不要在公共分支上使用 rebase
,例如 master 分支。
切勿进行如下操作:
git checkout master
git rebase -i test
https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing 的详细信息
附录:
如果不确定 rebase 操作,请参考:https://git-scm.com/book/en/v2/Git-Branching-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
当你准备好合并回master时,
git checkout master
git log ..test # if you're curious
git merge test
git push
如果您担心在合并中破坏某些内容,git merge --abort
可以为您服务。
使用推然后拉作为合并的手段是愚蠢的。我也不确定您为什么将测试推向原点。
git stash
是为了。
我会首先使要合并的分支尽可能干净。运行你的测试,确保状态是你想要的。清除 git squash 的新提交。
除了KingCrunches answer,我建议使用
git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master
您可能在另一个分支中进行了许多提交,而这应该只是主分支中的一个提交。为了使提交历史尽可能干净,您可能希望将测试分支中的所有提交压缩到主分支中的一个提交中(另请参见:Git: To squash or not to squash?)。然后,您还可以将提交消息重写为非常富有表现力的内容。无需深入研究代码即可轻松阅读和理解的东西。
编辑:您可能对
在 git 中,merge --squash 和 rebase 有什么区别?
合并与变基
如何重新设置拉取请求
所以在 GitHub 上,我最终为功能分支 mybranch
执行了以下操作:
从原产地获取最新信息
$ git checkout master
$ git pull origin master
找到合并基础哈希:
$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f
$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f
现在确保只有第一个是 pick
,其余的是 s
:
pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better
接下来选择一个非常好的提交消息并推送到 GitHub。然后发出拉取请求。
拉取请求合并后,可以在本地删除:
$ git branch -d mybranch
在 GitHub 上
$ git push origin :mybranch
旧线程,但我还没有找到 my way 这样做。对于使用 rebase 并希望在 master 之上合并来自(功能)分支的所有提交的人来说,这可能很有价值。如果途中发生冲突,您可以在每次提交时解决它们。您在此过程中保持完全控制,并且可以随时中止。
获取最新的 Master 和 Branch:
git checkout master
git pull --rebase origin master
git checkout <branch_name>
git pull --rebase origin <branch_name>
在 Master 上合并分支:
git checkout <branch_name>
git rebase master
可选:如果您在 Rebase 期间遇到冲突:
首先,解决文件中的冲突。然后:
git add .
git rebase --continue
您可以随时通过以下方式中止变基:
git rebase --abort
推送您的重新定位分支:
git push origin <branch_name>
如果您之前推送过此分支,则需要使用强制推送覆盖它:
git push origin -f <branch_name>
在这样做之前,请始终检查您当前的本地分支是否符合您的期望,因为强制推送会覆盖远程存储库中的旧分支。
现在你有两个选择:
A) 创建一个 PR(例如在 GitHub 上)并通过 UI 将其合并到那里
B)返回命令行,将分支合并到master
git checkout master
git merge --no-ff <branch_name>
git push origin master
完毕。
这是我在团队工作中使用的工作流程。场景如你所描述。首先,当我完成 test
的工作时,我使用 master 进行 rebase 以提取在我一直在 test
分支工作期间添加到 master 的任何内容。
git pull -r upstream master
这会将更改拉到 master,因为您分叉了 test
分支并应用它们,然后应用您所做的更改以“在”master 的当前状态之上进行测试。如果其他人对您在测试中编辑的相同文件进行了更改,则此处可能存在冲突。如果有,您将不得不手动修复它们并提交。完成此操作后,您可以毫无问题地切换到 master 分支并合并 test
。
git checkout master
git pull origin master
# Merge branch test into master
git merge test
合并后,如果文件被更改,那么在合并时会出现“解决冲突”的错误
因此,您需要首先解决所有冲突,然后您必须再次提交所有更改,然后推送
git push origin master
谁在测试分支中进行了更改更好,因为他知道自己做了什么更改。
我会使用变基方法。主要是因为它在语义上完美地反映了您的情况,即。您要做的是刷新当前分支的状态并“假装”它是基于最新的。
因此,即使不签出 master
,我也会:
git fetch origin
git rebase -i origin/master
# ...solve possible conflicts here
当然,仅从原点获取不会刷新 master
的本地状态(因为它不执行合并),但对于我们的目的来说完全可以 - 我们希望避免切换,以节省时间.
@KingCrunch 的答案在很多情况下都应该有效。可能出现的一个问题是您可能在另一台需要从测试中提取最新版本的机器上。所以,我建议先拉测试。修订版如下所示:
git checkout test
git pull
git checkout master
git pull origin master
git merge test
git push origin master
我会根据开发和功能分支回答,
如果您在功能分支上并且需要使用开发更新它,请使用以下命令:
git checkout develop
git pull
git checkout feature/xyz
git merge develop
现在您的 feature/xyz
已更新为 develop
分支,您可以将更改推送到远程 feature/xyz
。
正如标题所说的“最佳方式”,我认为考虑耐心合并策略是个好主意。
来自:https://git-scm.com/docs/merge-strategies
使用这个选项,'merge-recursive' 会花费一些额外的时间来避免有时由于不重要的匹配行(例如,来自不同函数的大括号)而发生的错误合并。当要合并的分支大相径庭时使用此选项。另请参阅 git-diff[1] --patience。
用法:
git fetch
git merge -s recursive -X patience origin/master
Git 别名
我总是为此使用别名,例如运行一次:
git config --global alias.pmerge 'merge -s recursive -X patience'
现在你可以这样做:
git fetch
git pmerge origin/master
您必须签出分支才能拉取,因为拉取意味着合并到 master 中,并且您需要一个工作树来合并。
git checkout master
git pull
无需先结账; rebase 用两个参数做正确的事
git rebase master test
git checkout master
git merge test
git push 默认推送此处和远程存在的所有分支
git push
git checkout test
这是来自 GitLab:只需按照说明进行操作:
https://i.stack.imgur.com/zkdvS.png
step-1
中,您正在检出一些功能分支,然后在 step-2
中,您再次检出 master 分支。我很困惑,为什么要首先检查功能分支?请解释
git fetch origin feature
不应该是检查远程功能分支以将本地与远程功能同步后的第二个命令?
这里已经有很多很好的答案了。我只是添加我所做的步骤。
git fetch -p
git checkout master
git rebase origin/master
git checkout test
git rebase master
解释
git fetch -p
将检索自您上次提取以来所做的任何更改,并且 -p
修剪您的分支,删除所有过时的分支。
git checkout master
签出主分支
git rebase origin/master
更新 master
分支。在这里拉动会给你同样的结果。
git checkout test
签出您所做更改的分支
git rebase master
使用 master
上的更改更新 test
分支。这会合并所有更改的文件,如果您的任何提交存在冲突,您必须解决它们,然后执行 git rebase --continue
或 git rebase --abort
仅执行 git merge feature-branch
时,我总是遇到合并冲突。这似乎对我有用:
git checkout -b feature-branch
做一堆代码更改...
git merge -s ours master
git checkout master
git merge feature-branch
或者
git checkout -b feature-branch
做一堆代码更改...
git checkout master
git merge -X theirs feature-branch
git merge test
给了我fatal: 'test' does not point to a commit
。我必须在git log
中查找测试分支上的提交点,切换回 master 分支然后执行git merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
。test
必须存在。当然,您可以改用提交哈希,但使用分支名称通常更容易。在内部它只是检索分支的HEAD
的哈希值。