我在Git中有一个存储库。我做了一个分支,然后对主人和分支做了一些改变。
然后,几十次提交之后,我意识到分支处于比主设备好得多的状态,所以我希望分支“成为”主设备并忽略主设备上的更改。
我无法合并它,因为我不想在master上保留更改。我该怎么办?
Extra :在这种情况下,'old'主服务器已经push
- 编辑到另一个存储库,例如GitHub。这怎么改变了呢?
答案 0 :(得分:1912)
另外两个答案的问题是新主人没有旧主人作为祖先,所以当你推动它时,其他人都会搞砸。这就是你想要做的:
git checkout better_branch
git merge --strategy=ours master # keep the content of this branch, but record a merge
git checkout master
git merge better_branch # fast-forward master up to the merge
如果您希望自己的历史记录更加清晰,我建议您在合并提交消息中添加一些信息,以明确您所做的事情。将第二行更改为:
git merge --strategy=ours --no-commit master
git commit # add information to the template merge message
答案 1 :(得分:262)
确保所有内容都被推送到远程存储库(GitHub):
git checkout master
覆盖"掌握"与" better_branch":
git reset --hard better_branch
强制推送到您的远程存储库:
git push -f origin master
答案 2 :(得分:68)
编辑:您没有说您已经推送到公共回购!这使得世界变得不同。
有两种方式,“脏”方式和“干净”方式。假设您的分支名为new-master
。这是干净的方式:
git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part. Just don't. But if you want to...
# git branch -d --force old-master
这将使配置文件更改为与重命名的分支匹配。
你也可以用脏方式来做,这不会更新配置文件。这就是上面介绍的内容......
mv -i .git/refs/new-master .git/refs/master
git checkout master
答案 3 :(得分:41)
通过以下方式将分支重命名为master
:
git branch -M branch_name master
答案 4 :(得分:19)
据我了解,您可以将当前分支分支到现有分支。从本质上讲,这将覆盖当前分支中的任何内容master
:
git branch -f master HEAD
完成后,您通常可以推送本地master
分支,也可能需要强制参数:
git push -f origin master
没有合并,没有长命令。只需branch
和push
- 但是,是的,这将重写master
分支的历史记录,所以如果你在团队中工作,你必须知道什么你在做什么。
或者,我发现你可以将任何分支推送到任何远程分支,所以:
# This will force push the current branch to the remote master
git push -f origin HEAD:master
# Switch current branch to master
git checkout master
# Reset the local master branch to what's on the remote
git reset --hard origin/master
答案 5 :(得分:13)
此处给出的解决方案(在'master'中重命名分支)并不坚持远程(GitHub)回购的后果:
-f --force
通常,该命令拒绝更新远程ref,该远程ref不是用于覆盖它的本地ref的祖先。此标志禁用检查。这可能导致远程存储库丢失提交;小心使用它。
如果其他人已经撤回了您的仓库,他们将无法在没有用新的GitHub主分支替换他们自己的主仓(或处理大量合并)的情况下拉出新的主历史记录。
有alternatives to a git push --force for public repos
Jefromi's answer(将正确的更改合并回原始主人)就是其中之一。
答案 6 :(得分:10)
我发现这种简单的方法可以发挥最佳效果。它不会重写历史记录,并且分支的所有先前签入都将附加到主服务器。没有任何东西丢失,你可以清楚地看到提交日志中发生了什么。
目标:建立"分支"的当前状态。 "主人"
在分支机构上工作,提交并推送您的更改,以确保您的本地和远程存储库是最新的:
git checkout master # Set local repository to master
git reset --hard branch # Force working tree and index to branch
git push origin master # Update remote repository
在此之后,您的主服务器将是您上次提交分支的确切状态,您的主提交日志将显示该分支的所有签到。
答案 7 :(得分:9)
还可以将其他分支中的所有文件签出到主文件中:
git checkout master
git checkout better_branch -- .
然后提交所有更改。
答案 8 :(得分:6)
我在博客文章 Replace the master branch with another branch in git 中找到了我想要的答案:
git checkout feature_branch
git merge -s ours --no-commit master
git commit # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch
它与Cascabel's answer基本相同。除了"选项"他在下面添加了,他的解决方案已嵌入我的主代码块中。
这种方式更容易找到。
我将此添加为新答案,因为如果我以后需要此解决方案,我希望所有代码我将用于一个代码块。
否则,我可以复制粘贴,然后阅读下面的详细信息,以查看我 应该更改的行 - 在我执行之后。
答案 9 :(得分:4)
要添加Jefromi的答案,如果您不想在source
分支的历史记录中放置无意义的合并,则可以为{{1}创建临时分支合并,然后扔掉它:
ours
这样,合并提交将仅存在于git checkout <source>
git checkout -b temp # temporary branch for merge
git merge -s ours <target> # create merge commit with contents of <source>
git checkout <target> # fast forward <target> to merge commit
git merge temp # ...
git branch -d temp # throw temporary branch away
分支的历史记录中。
或者,如果您根本不想创建合并,只需抓取target
的内容并将其用于source
上的新提交:
target
答案 10 :(得分:1)
如果您在 Eclipse 中使用 eGit :
答案 11 :(得分:1)
我的处事方式如下
#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop
答案 12 :(得分:1)
对我来说,我希望我的开发者在领先之后能回到大师那里。
开发中:
git checkout master
git pull
git checkout develop
git pull
git reset --hard origin/master
git push -f
答案 13 :(得分:0)
我没有足够的业力来评论。
我知道这不是 OP 想要的,但是如果您知道将来会遇到与 OP 类似的问题,您可以这样做。
这是你的情况,
如果这让人感到困惑,请参阅下图的糟糕情况。
*bad situation*
initial master ---> added boring changes ----merge---> you loose boring
\ /
---> (awesome branch) added awesome changes ---
要解决这个问题(即停止无聊的损失),请执行以下操作 基本上,
git branch boring
将无聊替换为您想要保留的任何名称来创建当前母版的副本所以,
*good situation*
initial master ---> added awesome changes ---> Final master(awesome) branch
\
---> (boring branch) added boring changes ---> Dont merge to master --X-->
答案 14 :(得分:-1)
以下步骤在由Atlassian(Bitbucket服务器)驱动的Git浏览器中执行
将{current-branch}设为master
master
中创建一个分支,并将其命名为“ master-duplicate”。