ChatGPT解决这个技术问题 Extra ChatGPT

从 master 更新 Git 分支

我是 Git 新手,现在我处于这种情况:

我有四个分支(master、b1、b2 和 b3)。

在我从事 b1-b3 工作之后,我意识到我在分支 master 上需要更改一些应该在所有其他分支中的东西。

我改变了我在master中需要的东西......这是我的问题:

如何使用 master 分支代码更新所有其他分支?

我在这里找到了答案:How do you merge selective files with git-merge?
Git 让另一个简单的任务变得困难。 Git 开发人员应该在他们的 SDLC 循环中使用 Stack Overflow 作为反馈。 300,000 人应该指出 Git 的工作流程存在严重问题。他们需要聘请 UX 专家,因为他们显然无法靠自己的方式正确解决问题。
@jww什么是sdlc循环?系统开发生命周期?

C
Chris Kooken

你有两个选择:

第一个是合并,但这会为合并创建一个额外的提交。

检查每个分支:

git checkout b1

然后合并:

git merge origin/master

然后推:

git push origin b1

或者,您可以进行变基:

git fetch
git rebase origin/master

我对这种方法感到担忧。当我运行 git log --graph 时,图表显示 master 实际上已合并到主题分支。从长远来看,这会导致任何问题吗?我认为最好的做法是始终将主题分支合并回主分支。请评论。
如果您要使用合并工作流程,请注意此问题:randyfay.com/node/89
您正在将 master 合并到 b1 中。为什么你got push origin master...没有意义。您没有更改主分支。我认为 119 upvote 是一个错误:/
不要使用合并方法,使用git rebase master是正确答案
对于我们这些稍后阅读的人 - 作者的编辑解决了@Kursion 对错字的担忧。此外,下面第二高的投票答案与此答案基本相同,但带有分支结构图和关于您为什么不想变基的警告。
C
Christian

你基本上有两个选择:

你合并。这实际上非常简单,并且是一个完美的本地操作: git checkout b1 git merge master # repeat for b2 and b3 这使历史保持原样:您从 master 分叉,您对所有分支进行了更改,最后您合并了从 master 更改为所有三个分支。 git 可以很好地处理这种情况,它是为同时在各个方向发生的合并而设计的。您可以相信它能够正确地将所有线程聚集在一起。它根本不关心分支 b1 是否合并 master,或者 master 合并 b1,合并提交在 git 中看起来都一样。唯一的区别是,哪个分支最终指向这个合并提交。你变基。具有 SVN 或类似背景的人会觉得这更直观。这些命令类似于合并案例: git checkout b1 git rebase master # repeat for b2 and b3 人们喜欢这种方法,因为它在所有分支中保留了线性历史。然而,这个线性历史是一个谎言,你应该意识到它是一个谎言。考虑这个提交图: A --- B --- C --- D <-- master \ \-- E --- F --- G <-- b1 合并结果是真实的历史: A -- - B --- C --- D <-- master \ \ \-- E --- F --- G +-- H <-- b1 但是,变基会为您提供以下历史记录: A --- B --- C --- D <-- master \ \-- E' --- F' --- G' <-- b1 关键是,提交 E'、F' 和 G' 永远不会确实存在,并且可能从未经过测试。他们甚至可能无法编译。实际上,通过 rebase 创建无意义的提交非常容易,尤其是当 master 中的更改对 b1 中的开发很重要时。这样做的后果可能是,你无法区分 E、F 和 G 三个提交中的哪一个实际上引入了回归,从而降低了 git bisect 的价值。我并不是说你不应该使用 git rebase。它有它的用途。但是,无论何时使用它,您都需要意识到您在历史上撒谎的事实。你至少应该编译测试新的提交。


我正在合并另一个源分支(不是主分支),添加到这个好答案的其他步骤是在合并之前在我的本地存储库上更新它(在本地拥有最新的代码):git checkout <source branch> git pull。然后继续上面的:git checkout b1 ...
作为一个长期使用 SVN 的用户,我更喜欢合并选项而不是 rebase:使用任何版本控制,准确记录您所做的更改以及原因是非常非常重要的。我可以看到变基对简化明显历史的吸引力,但是您应该返回并添加到 E'、F'、G' 的提交注释中 - 并且最好将变基自动添加到这些注释中。否则,如果构建/测试/测试部署过程在 G' 上中断,您必须找出在没有完整信息的情况下进行更改的原因。
历史是谎言
谢谢我使用“git merge any-branch-name”将一个分支代码合并到另一个分支。当我在分支 2 上时,我可以在本地测试分支 1 的代码
或者您最终可能会遇到这种情况,一团糟(首先是分支)$ git rebase production First, rewinding head to replay your work on top of it... Applying: ADDED TO ENV AS TEST Using index info to reconstruct a base tree... M Puppetfile Falling back to patching base and 3-way merge... Auto-merging Puppetfile CONFLICT (content): Merge conflict in Puppetfile Failed to merge in the changes. Patch failed at 0001 ADDED TO ENV AS TEST The copy of the patch that failed is found in: /home/user/src/puppet4-controlrepo/.git/rebase-apply/patch
M
Michael J. Gray

git rebase master 是执行此操作的正确方法。合并意味着将为合并创建提交,而变基则不会。


当你已经推送到原点时,如果你变基,你将重写提交历史,这将与你的远程分支冲突。我认为 rebase 应该只在拉动或没有推送到远程分支时使用。
如果您是唯一在远程分支上工作的人,您可以执行 git push --force origin 功能以使用重新定位的本地分支更新您的远程分支。 stackoverflow.com/questions/8939977/…
rebase 和 merge 都可以,rebase 最适合私有分支,因为它提供了更清晰的历史图表。这个答案是最好的
需要更清楚地在清晰度(对于单用户或小团队)或混乱的真相(对于多贡献者代码分支 - 可维护性所需(根据我的经验 - YMMV))之间进行权衡。
重新“如果你已经推了怎么办?” --> The golden rule of git rebase is to never use it on public branches
t
the Tin Man

如果您一直在断断续续地在一个分支上工作,或者在您一直在处理某事时在其他分支上发生了很多事情,那么最好将您的分支重新定位到 master 上。这使历史保持整洁,并使事情更容易理解。

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

笔记:

不要对你与其他人合作过的分支进行变基。

您应该基于您将要合并到的分支,该分支可能并不总是主分支。

http://git-scm.com/book/ch3-6.html 有一章是关于变基的,网络上还有大量其他资源。


感谢您提供简单的解决方案
提示:如果您之前所在的分支是 local_branch_name,则 git checkout local_branch_name 可能是 git checkout -
J
Jens

@cmaster 做出了最详尽的回答。简单来说:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

您不应该重写分支历史记录,而是将它们保持在实际状态以供将来参考。在合并到 master 时,它会创建一个额外的提交,但这很便宜。提交不收费。


是否从 master 刷新功能分支,应该定期完成?假设功能分支需要一段时间才能完成,并且 master 在那段时间已经进化。
为什么最后要使用 git merge?为什么不 git pull,是不是多余的?
S
Sundar Gsv

使用您的主分支副本更新其他分支,例如(备份)。您可以按照任何一种方式(变基或合并)...

做rebase(不会对备份分支进行任何额外的提交)。合并分支(将有一个额外的自动提交到备份分支)。注意:变基只不过是建立一个新的基地(一个新的副本)

git checkout 备份 git merge master git push

(如果有任何类似backup2等的其他分支,请重复此操作)

git checkout 备份 git rebase master git push

(如果有任何类似backup2等的其他分支,请重复此操作)


B
Brian Agnew

您可以合并,也可以使用 git cherry-pick 跨分支应用单个提交。


D
D_Oghli

从 master 更新您的分支:

  git checkout master
  git pull
  git checkout your_branch
  git merge master

h
harsha

git checkout master git pull git checkout feature_branch git rebase master git push -f

在对 master 进行 rebase 后,您需要进行有力的推动


S
Sanjay Bharwani

有两种方法

您想将 master 分支合并到您的分支中 - git checkout master - git pull - git checkout your-feature-branch - git merge master //解决冲突(如果有)并提交 - git push

2:如果您想在 main.js 之上重新调整您的更改。

 git checkout master #Switch to main branch
 git pull #Take latest
 git checkout your-feature-branch #Switch to story branch
 git pull --ff-only # Ensure branch is up to date
 git rebase -i origin master #Interactively rebase your commits on top of master. So your changes are on top of latest commits in main.
 git rebase --continue #Resolve conflicts and rebase --continue to continue with next commits
 git push -f origin your-feature-branch # As you have rewritten the commit history, you have to **force push** the commits

@Anku 我添加了内联注释以使其更具解释性。
嗨@Sanjay ..我尝试了第二个选项但没有奏效。运行 git push 后..我使用 git checkout feature_branch 转到功能分支。而且我没有看到来自主分支的功能分支有任何变化。
有没有办法不解决冲突,因为大师已经做了很多改变,我不想手动解决它们。
如果有冲突,就必须解决。如果您的分支与 master 相比已过时(不理想),那么我建议您从 main 创建另一个分支(因此您拥有最新的分支)并在其之上进行更改。 (一些手动操作)
谢谢@Sanjay,这就是我所做的: 1. 我在不同的文件夹中克隆了 Master 分支。 2. 复制 (CTL + C) 此文件夹中的所有内容并粘贴 (CTL + V) 到我的功能分支文件夹。现在我拥有了 Master 分支所拥有的一切。我希望这是可以通过 git 命令完成的,但无论如何。谢谢你的帮助!
M
ManojP

如果您想恢复到上次提交并删除日志历史记录

使用下面的命令,假设您想转到具有 commitID SHA - 71e2e57458bde883a37b332035f784c6653ec509 的上一个提交,您可以指向此提交,在此提交之后它不会显示任何日志消息,之后所有历史记录都将被删除。

git push origin +71e2e57458bde883a37b332035f784c6653ec509^:master

M
Martin W

对于发现此线程的每个人都在寻找易于使用且一致的解决方案以将当前分支与 master 上的最新更改合并:

您可以将其添加到您的 shell 配置中:

alias merge='currentBranch=$(git rev-parse --abbrev-ref HEAD) && git checkout master && git pull && git checkout $currentBranch && git merge master'

此别名适用于 5 个命令:

currentBranch=$(git rev-parse --abbrev-ref HEAD) # gets your current branch(needed for point 4)
git checkout master # checks out master
git pull # gets latest changes from master
git checkout $currentBranch # checks out the in point 1 saved branch
git merge master # merges your current branch with master

添加别名后,您可以简单地使用命令“合并”来“更新”您当前正在处理的分支。


k
kris

这个问题有两种选择。

1) git rebase

2)git合并

只有在合并的情况下与以上两者存在差异,才会在历史记录中有额外的提交

1) git checkout 分支(b1,b2,b3)

2) git rebase origin/master (如果发生冲突,通过执行 git rebase --continue 在本地解决)

3) git推送

或者, git merge 选项是类似的方式

1) git checkout "your_branch"(b1,b2,b3)

2) git 合并大师

3) git推送