如何将当前工作分支移动到git的主分支(master branch)

51

我目前有一个项目,其中包含多个分支。主分支长时间没有合并。因此,我想使用最新的代码切换到主分支。

请问您能否提供必要的命令和步骤。

让我重新描述我的问题。

我正在一个具有不同分支的项目中工作。最新的更改是在除主分支以外的某个分支上进行的。现在我的要求是:是否有一种方法可以将当前工作分支移动到主分支而不需要将其与主分支合并,以避免冲突?


1
你可能需要澄清一下你的问题,恐怕这样才能有人能够帮助你。我的理解是,你正在处理一个具有许多分支的存储库,但这些分支已经有一段时间没有合并回“主”分支了,现在你想将一个或多个分支的工作合并到“主”分支中,是这样吗? - Mark Longair
1
我不明白你所谓的“移动”分支到主分支是什么意思?你想在主分支上工作吗?那么,“git checkout master”应该能解决问题。另外,这似乎是一个纯git的问题,你可能需要删除ruby-on-rails标签。 - Droggl
如果您的代码与主分支发生冲突,那么任何代码移动都必须解决这些冲突。在GIT中,这种分支代码移动到另一个分支的操作被称为合并 - Justinas
10个回答

81

如果你想让 master 分支的文件状态和 other_branch 分支完全一致,并且保存历史记录 - 请执行以下步骤(注意末尾的句号):

git checkout master
git checkout other_branch .

现在你将在当前的master分支中拥有一个完整的other_branch的副本(它比reset更柔和),但尚未提交。然后进行普通提交:

git add --all
git commit -m "* copy other_branch to master working tree"

注意: 未被跟踪(未被索引)的文件(目录)从other_branch将保留,如果它们没有被主分支跟踪。要移除这些未被跟踪的文件(目录):

git clean -fd

请参见如何从当前Git工作树中删除本地(未跟踪)文件?以获取更多详细信息。


看起来这个不能删除文件夹。 - Evgenia Karunus
如果需要的话,您还需要执行 git clean -fd,请参见 https://dev59.com/4nVD5IYBdhLWcg3wL4YA#64966。 - radistao
1
谢谢。这对我有用,但是历史记录没有复制到主分支。 - radar
1
但是历史记录不会被复制到主分支。 这是另一回事 - “变基”是您的选择。 - radistao
只有在你知道自己在做什么的情况下才使用。看起来可以工作,但似乎存在风险。请小心。 - tremendows
显示剩余2条评论

29

您想要将 'develop' 分支合并到主分支吗?

git checkout master
git merge develop

还是你想将主分支的更改合并到你的开发分支中?

git checkout develop
git merge master

16
首先,我会尝试将其合并到master分支,看看是否真的存在许多冲突——git的合并在只标记真正冲突方面非常出色。如果您确保在开始之前git status干净,并且发现有太多冲突无法处理,您可以执行以下操作回退:
git reset --merge

不过,如果你只是想让你当前的master与另一个分支相同,你可以使用以下命令:

git checkout master
git reset --hard other-branch

然而,这通常是一个坏主意,因为:

  1. 你会丢失主分支上的所有工作。也许以后你还需要那个历史记录?(你可以在操作之前用 git branch old-master master 来“备份”你的主分支。)
  2. 你正在重写 master 分支的历史记录,所以如果你曾经与任何人共享过此分支,则结果将对你们两个人都很困惑。
  3. git reset --hard 应该始终谨慎使用,因为它会丢弃所有未提交的更改。

11
如果我理解你的英语正确的话,你想要将更改重置到最新提交的分支,而不是将更改合并回主分支。为此,请使用以下命令:

如果我理解您的英语正确,您不想将更改合并回主分支,而只是将主分支重置为指向当前检出分支中的最新提交?要做到这一点,请使用:

git branch -f master

1
我不是最初的请求者,但这正是我所需要的,而且我认为它表达了最初请求者的意图。 - Happyblue

5

您需要将当前分支合并到主分支。我通常的做法是:

1) git fetch origin  # get all branches from server  
2) git rebase master # update your local master to the origin master, in case master has changed upstream
3) git checkout <branch>  # go to your branch
4) git rebase master # rebase your branch to master; applies your branch's changes ontop of the master, where it diverged
5) git checkout master # go back to master
6) git merge <branch> # merge your branch into master.  since you rebased, this should be trivial
7) git push # push your master upstream

第二点,我认为,在 git checkout master 之后会更好。 - andymnc

4
如果你想要将文件从分支复制到主分支,请执行以下命令:
1. git checkout master 2. git checkout x_branch . (注意有个句号) 3. git add --all 4. git commit -m "将所有内容从x_branch复制到master" 5. git push -u origin master

1
将4步替换为5步。 - Zhasulan Berdibekov

1

如果你想将一些提交从 branch 合并到 master,你可以使用 cherry-picking

这只会将某些提交从 branch 合并到 master,但是当然不能保证不会发生冲突。

请参见 我的回答,了解如何处理 当 develop 分支与 master 分支非常不同的情况下管理热修复?

然而,如果你想将branch所有提交合并到master中,你就必须进行合并并解决冲突(除非你像Mark所描述的那样使用git reset --hard other-branch重置master分支,但这种做法是不被鼓励的)。


0

在IntelliJ中,您可以执行以下操作:

  1. 检出要合并到主分支的分支。
  2. VCS->Git->合并更改
  3. 选择主分支
  4. 将策略更改为“ours”
  5. 选择“不快进”。
  6. 单击“合并”
  7. 提交(可能不需要)
  8. 推送

这将把主分支变成您当前的分支。主分支的历史记录得以保留。我相信有一个git命令行等效方法。


0
如果你想把工作分支合并到主干中,也可以使用 rebase,它会更加清晰一些。
git checkout master
git rebase <working branch>

但不建议用于已推送到另一个远程存储库的分支,或从中启动其他分支的分支。 - dunni
你是对的。但我假设他想要为主分支进行快进。 - Sammy S.

-6

也许不是很干净,但对我来说有效

  • git pull #获取所有更改
  • 切换到我的分支
  • 将所有文件复制到临时目录
  • 切换到主分支
  • 删除主分支中的所有文件
  • 从临时目录复制文件
  • 提交

1
这听起来不像是一种Git的做法 :( - superandrew
但这很简单)) - DantaliaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接