ChatGPT解决这个技术问题 Extra ChatGPT

将开发分支与 master 合并

我在 GitHub 存储库中有两个分支,即 masterdevelopment。如图所示,我正在开发分支中进行所有开发。

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

现在我想将 development 分支上的所有更改合并到 master 中。我目前的做法是:

git checkout master 
git merge development
git push -u origin master 

请让我知道我遵循的程序是否正确。

git pull -u 为分支(或所有分支,如果推送多个分支)设置上游跟踪。设置后,跟踪将持续存在。没有理由持续使用它。

S
Sailesh

我通常喜欢先将 master 合并到 development 中,这样如果有任何冲突,我可以在 development 分支本身中解决并且我的 master 保持干净。

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

这两种方法没有太大区别,但我注意到有时我不想在合并它们之后将分支合并到 master 中,或者在这些方法之前还有更多工作要做可以合并,所以我倾向于让 master 保持不变,直到最后的东西。

编辑:来自评论

如果要跟踪合并的人员和时间,可以在合并时使用 --no-ff 标志来执行此操作。这通常仅在将 development 合并到 master(最后一步)时有用,因为您可能需要在工作流程中多次将 master 合并到 development(第一步),并为这些创建提交节点可能不是很有用。

git merge --no-ff development

这种方法有一个轻微的缺点:实际合并到 master 很可能是快进合并,因此不会创建任何提交节点。这与分支上的实际代码没有问题,但是以后很难找出谁将实际合并到 master 以及在什么时间进行的。需要一个明确的 --no-ff 来合并到 master 来解决这个问题。
是的,这正是 --no-ff 的用途。 :)
git merge --no-ff development 只是为了纠正 @elect 的用法。
@sailesh 如果您同意评论,您能否更新您的答案以包含 git merge 标志?
@Mars,如果旧更改是提交的直接祖先,则合并将覆盖文件。例如,让 A->B->C 成为 master,而 A->X->Y 是您的 dev 分支。如果您更改 X 中可能与 A 中的更改发生冲突的文件的一部分,则不会发生冲突,因为 AX 的祖先。关于丢失的更改,请查看 stackoverflow.com/questions/7147680/… 以恢复所有更改。
a
alper

就个人而言,我的方法与您的方法相似,当它们返回 master 时,会有更多的分支和一些压缩的提交。

我的一位同事不喜欢这么多地切换分支并留在开发分支上,类似于以下所有从开发分支执行的东西。

git fetch origin master    
git merge master    
git push origin development:master

第一行确保他有自上次更新他的本地存储库以来已对 master 进行的任何上游提交。

第二个将这些更改(如果有)从 master 拉到开发中

第三个将开发分支(现在与 master 完全合并)推送到 origin/master。

我可能对他的基本工作流程有点错误,但这是它的主要要点。


谢谢!这对我来说更直观。
是的——在我写这篇文章的 6 年多的时间里,我也采用了它——尽管用 rebase 来更新 dev 分支而不是 merge
G
Gediminas

对于没有任何分支知识的人来说,从底部进行解释。

基本的主/主分支开发逻辑是:你只在另一个分支上工作,所以你只使用主/主分支来与另一个准备合并的分支合并。

您开始以这种方式创建一个新分支:

在本地目录中克隆存储库(或创建新存储库):

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

创建一个新分支。它将包含您的主分支存储库的最新文件

$ git branch new_branch

将当前的 git 分支更改为 new_branch

$ git checkout new_branch

像往常一样进行编码、提交……

$ git add .
$ git commit -m “Initial commit”
$ git push # pushes commits only to “new_branch”

当这个分支上的工作完成后,与“master”分支合并:

$ git merge master
$ git checkout master # goes to master branch
$ git merge development # merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!
$ git push # pushes all “new_branch” commits to both branches - “master” and “new_branch”

我还建议使用 Sourcetree 应用程序来查看更改和分支的可视化树。


我喜欢你不为大师工作的方法。但是今天当我玩 gitflow 时,我创建了 developrelease 分支。然后添加了一个发行说明文件并提交。然后完成合并回 master/develop 的发布。但我的主分支只有新添加的发行说明。之前的开发提交期间没有其他文件在其中更新。
如果您在 master 以外的另一个分支上工作,请确保您已将更改提交并推送到该分支。您可以在 github.com 或 bitbucket.com 的图形界面上查看文件的外观,然后尝试在网站上单击“合并”。它应该更新从您的分支到主控的所有内容。如果 master 有较新的文件,则应该是冲突,您将收到错误消息。不确定我的回答是否足够好,如果没有,请给我留言:)
我使用 sourcetree 作为 GUI 和 github 存储库。我尝试了 2 次发布测试。 master 从未更新过最新的开发分支。
尝试在实时 github.com 网站上使用您正在处理的分支的文件。他们被推了吗?如果是,请尝试单击同一分支 - 合并,您将看到会发生什么。以我个人对 sourcetree 的经验来说,这很糟糕——我也无法完全理解我的分支中正在发生的事情
感谢@Gediminas 的详细解释。在阅读您的答案之前,我对 git 关键字感到困惑.. :)
s
sandip
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

s
sandip

如果您可以使用 Git Flow 工作流程,那就太好了。它可以轻松地将开发分支合并到主分支。

您要做的就是按照此处提到的 git-flow 指令进行操作:

脚步:

设置 git-flow 项目

创建分支并合并一切以开发

运行命令 git flow release start

然后为发布提供有意义的信息

运行命令 git flow release finish

它将所有内容合并到 master 并将分支更改为 master。

运行命令 git push 将更改发布到远程主机。

有关详细信息,请访问页面 - http://danielkummer.github.io/git-flow-cheatsheet/


如果有人使用 git flow 的解决方案!
S
Sergiu Dumitriu

是的,这是正确的,但它看起来像是一个非常基本的工作流程,您只是在准备好集成之前缓冲更改。您应该查看 git 支持的 more advanced workflows。您可能会喜欢 topic branch 方法,它可以让您并行处理多个功能,或者 graduation approach 可以稍微扩展您当前的工作流程。


H
Haris Np

如果您使用的是 Mac 或 Ubuntu,请转到分支的工作文件夹。在终端

假设 harisdev 是分支名称。

git checkout master

如果有未跟踪或未提交的文件,您将收到错误,您必须提交或删除所有未跟踪或未提交的文件。

git merge harisdev 

git push origin master

最后一个删除分支的命令。

$ git branch -d harisdev

这里有什么特定于 Mac 或 Ubuntu?
对不起。其他答案都没有提到应该在终端中给出命令和删除分支的命令。实际上我只是想添加删除分支的命令,以便开发人员将来不会弄乱同一个分支。我正在使用Mac,所以我提到了它。您的问题是有效的,并且这些命令都不是特定于 Mac 或 Ubuntu。
感谢您的澄清。
k
kataras

步骤1

创建并切换到一个新的“dev”分支,您的本地 git 文件与远程同步,但“dev”分支尚不存在。

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

第2步

对“dev”分支进行更改(如果您按照步骤 1 进行更改,则为当前分支),提交并将它们推送到远程“dev”分支。

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

第 3 步

将你的“dev”分支合并到“master”中。

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.

N
Nesha Zoric

这就是我通常的做法。首先,确保您已准备好将更改合并到 master 中。

使用 git fetch 检查开发是否与远程服务器的最新更改保持同步 获取完成后 git checkout master。通过执行 git pull 确保 master 分支有最新的更新准备工作完成后,您可以使用 git merge development 开始合并 使用 git push -u origin master 推送更改,您就完成了。

您可以在文章中找到有关 git merging 的更多信息。


C
Cisco

基于@Sailesh 和@DavidCulp:

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

第一个命令将确保您已向远程 master 提交了所有上游提交,并且不会发生 Sailesh 响应。

第二个将执行合并并创建您可以解决的冲突。

这样做之后,终于可以checkout master切换到master了。

然后将开发分支合并到本地主节点上。 no-ff 标志将在 master 中创建一个提交节点,以便整个合并可跟踪。

之后,您可以提交并推送您的合并。

此过程将确保人们可以看到从开发到 master 的合并提交,然后如果他们查看开发分支,他们可以看到您在开发期间对该分支所做的各个提交。

或者,您可以在推送之前修改合并提交,如果您想添加在开发分支中完成的内容的摘要。

编辑:我的原始答案建议一个没有做任何事情的git merge master,最好在获取原点/主人之后做git merge FETCH_HEAD


B
Bhanuchander Udhayakumar

1)在分支开发中,使用以下命令检查 git 状态:

git status

不应该有未提交的代码。如果是,请将您的代码推送到开发分支:

git add *

git commit -m "My initial commit message"

git push origin Development

2)在开发分支上,运行以下两个命令:

git branch -f master HEAD

git push -f origin master

它会将您的开发分支代码推送到主分支。


这是否也会将所有开发提交推送到 master,或者只是将新的单个提交添加到 master 中?
这实际上是如何工作的?特别是当你在开发时的“git branch master”看起来很疯狂。如果已经有一个名为 master 的分支,如何创建一个名为 master 的新分支?文档说 -f 这样做:将 重置为 。这是什么意思?
这不是将本地主机推到远程主机上吗?如果您在团队中工作,这似乎是个坏主意。
-f 不推荐。
T
Tiago Medici

一旦您“签出”开发分支,您...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 

S
Sankaran Srinivasan

如果您使用的是 gerrit,以下命令可以完美运行。

git checkout master
git merge --no-ff development

您可以使用默认提交消息保存。确保已生成更改 ID。您可以使用以下命令来确定。

git commit --amend

然后使用以下命令推送。

git push origin HEAD:refs/for/refs/heads/master

您可能会遇到如下错误消息。

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

为了解决这个问题,gerrit 项目管理员必须在 gerrit 中创建另一个名为 'refs/for/refs/heads/master' 或 'refs/for/refs/heads/*' 的引用(这将涵盖未来的所有分支)。然后授予此引用的“Push Merge Commit”权限,如果需要提交 GCR,则授予“提交”权限。

现在,再次尝试上面的推送命令,它应该可以工作。

学分:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642


d
djm.im

我认为最简单的解决方案是

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

这也保留了所有正在使用的分支的历史记录


A
Ankit Kumar Rajpoot
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master

当你看到错误时强制推送几乎从来都不是正确的事情,除非你非常确定你知道为什么你的本地分支缺少来自远程分支的提交。一般来说,最好回到第 3 步并再次pull。此外,与现有答案相比,目前尚不清楚该答案增加了什么价值。