我在Git中有一个存储库.我做了一个分支,然后对主人和分支做了一些改变.
然后,几十次提交之后,我意识到分支处于比主设备好得多的状态,所以我希望分支"成为"主设备并忽略主设备上的更改.
我无法合并它,因为我不想在master上保留更改.我该怎么办?
额外:在这种情况下,'old'主服务器已经被push
转到另一个存储库,例如GitHub.这怎么改变了?
Cas*_*bel 2004
另外两个答案的问题是新主人没有旧主人作为祖先,所以当你推动它时,其他人都会搞砸了.这是你想要做的:
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
Run Code Online (Sandbox Code Playgroud)
如果您希望您的历史记录更清晰一点,我建议您在合并提交消息中添加一些信息,以明确您已完成的工作.将第二行更改为:
git merge --strategy=ours --no-commit master
git commit # add information to the template merge message
Run Code Online (Sandbox Code Playgroud)
Bra*_*ard 330
确保所有内容都被推送到远程存储库(GitHub):
git checkout master
Run Code Online (Sandbox Code Playgroud)
用"better_branch"覆盖"master":
git reset --hard better_branch
Run Code Online (Sandbox Code Playgroud)
强制推送到远程存储库:
git push -f origin master
Run Code Online (Sandbox Code Playgroud)
Die*_*Epp 70
编辑:你没有说你已经推到公共回购!这让世界变得与众不同.
有两种方式,"脏"方式和"干净"方式.假设您的分支已命名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
Run Code Online (Sandbox Code Playgroud)
这将使配置文件更改为与重命名的分支匹配.
你也可以用脏方式来做,这不会更新配置文件.这就是上面介绍的内容......
mv -i .git/refs/new-master .git/refs/master
git checkout master
Run Code Online (Sandbox Code Playgroud)
Ala*_*avi 42
将分支重命名为master
:
git branch -M branch_name master
Run Code Online (Sandbox Code Playgroud)
fre*_*nte 22
据我所知,您可以将当前分支分支到现有分支.从本质上讲,这将覆盖master
当前分支中的任何内容:
git branch -f master HEAD
Run Code Online (Sandbox Code Playgroud)
完成后,您通常可以推送本地master
分支,也可能需要force参数:
git push -f origin master
Run Code Online (Sandbox Code Playgroud)
没有合并,没有长命令.只要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
Run Code Online (Sandbox Code Playgroud)
Von*_*onC 13
这里给出的解决方案(在'master'中重命名分支)并不坚持远程(GitHub)repo的后果:
-f --force
通常,该命令拒绝更新远程ref,该远程ref不是用于覆盖它的本地ref的祖先.此标志禁用检查.这可能导致远程存储库丢失提交; 小心使用它.
如果其他人已经撤回了你的仓库,他们将无法在没有用新的GitHub主分支替换他们自己的主仓(或处理大量合并)的情况下拉出新的主历史记录.对于公共回购,
有一些git push --force的替代方案.
Jefromi的答案(将正确的变化合并回原来的主人)就是其中之一.
小智 11
我发现这种简单的方法可以发挥最佳效果.它不会重写历史记录,并且分支的所有先前签入都将附加到主服务器.没有任何东西丢失,你可以清楚地看到提交日志中发生的事情.
目标:使"分支"的当前状态成为"主人"
在分支机构上工作,提交并推送您的更改,以确保您的本地和远程存储库是最新的:
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
Run Code Online (Sandbox Code Playgroud)
在此之后,您的主服务器将是您上次提交分支的确切状态,您的主提交日志将显示该分支的所有签入.
小智 9
也可以将其他分支中的所有文件签出到master中:
git checkout master
git checkout better_branch -- .
Run Code Online (Sandbox Code Playgroud)
然后提交所有更改.
我在博客文章中找到了想要的答案,用git中的另一个分支替换master分支:
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
Run Code Online (Sandbox Code Playgroud)
基本上与Cascabel的答案相同。他在解决方案下方添加的“选项” 已经嵌入到我的主代码块中。
这种方式更容易找到。
我加入这是一个新的答案,因为如果我以后需要这个解决方案,我想拥有所有的代码我打算在一个代码块使用。
否则,我可以复制粘贴,然后阅读下面的详细信息,以查看应该更改的行-在执行完之后。
要添加到Cascabel 的回答中,如果您不想在source
分支的历史记录中放置无意义的合并,则可以为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
Run Code Online (Sandbox Code Playgroud)
这样合并提交将只存在于target
分支的历史记录中。
或者,如果您根本不想创建合并,您可以简单地获取 的内容source
并将它们用于新的提交target
:
git checkout <source> # fill index with contents of <source>
git symbolic-ref HEAD <target> # tell git we're committing on <target>
git commit -m "Setting contents to <source>" # make an ordinary commit with the contents of <source>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
693564 次 |
最近记录: |