本文介绍了git命令使得一个分支像另一个分支的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我试图让一个分支进行变更,并将其带回与其分离的上游相同。这些更改都是本地的,并且已经推送到github,所以 git reset 或者 git rebase 都是真正可行的,因为他们改变了历史,这对于一个已经被推送的分支来说是一件坏事。 我也试过 git merge 有不同的策略,但它们都不会撤消本地更改,即如果我添加了文件,合并可能会使其他文件重新排列,但我仍然会保留上游文件所没有的文件。 / p> 我可以在上游创建一个新的分支,但我真的很喜欢一个合并,根据修订历史记录应用所有更改以创建分支与上游再次相同,这样我就可以安全地推动这一变化而不会破坏历史。有没有这样一个命令或一系列命令?解决方案您可以将上游分支合并到 dev 分支,使用自定义合并驱动程序keepTheirs: 请参阅 git merge -s theirs 需要 - 但我知道它不存在。 在你的情况下,只需要一个 .gitattributes ,并且一个 keepTheirs 脚本如: mv -f $ 3 $ 2 exit 0 git merge - strategy = theirs 模拟#1 显示为合并,上游为第一个父级。 Jefromi 提及(在评论中)合并 - 我们的,合并您的工作在上游(或从上游开始的临时分支上),然后将分支快速转发到该合并的结果: git checkout -b tmp origin / upstream git merge -s我们的下游#忽略下游的所有更改 git checkout downstream git merge tmp#fast-forward to tmp HEAD git branch -D tmp#删除tmp (编辑2011): 这个工作流程已经在博客文章: git merge - -strategy = theirs 模拟#2 显示为合并,以我们的第一个父项为。 (由 jcwenger 提议) git checkout -b tmp上游 git merge -s我们thebranch#忽略下游的所有更改 git checkout downstream git合并--squash tmp#从tmp应用更改,但不作为合并。 git rev-parse upstream> .git / MERGE_HEAD #record上游第二个合并头 git commit -m将上游分支重定位#进行提交。 git分支-D tmp#删除tmp git merge --strategy = theirs 模拟#3 博客文章提及: git merge -s我们的ref-to-be-merged git diff --binary ref-to-be-merged | git apply -R --index git commit -F .git / COMMIT_EDITMSG --amend git merge - 战略=他们的模拟#4 (相同的博文) git branch -m上游不稳定上游不稳定保存 git分支上游不稳定上游远程/主 git合并-s我们的上游 - 不稳定 git diff --binary ref-to-merged | git apply -R --index --exclude =debian / * git commit -F .git / COMMIT_EDITMSG --amend git merge --strategy = theirs 模拟#5 (由 Barak A. Pearlmutter 提议) : git checkout MINE git merge --no-commit -s我们的HERS git rm - rf。 git checkout HERS - 。 git checkout MINE - debian#或其他适当的 git gui#edit commit message&点击提交按钮 git merge --strategy = theirs 模拟#6 (由相同的 Michael Gebetsroither ): #获取另一个分支的内容 git read-tree -u --reset< ID> #选择性地合并子目录#例如从另一个分支中取代上游源 git合并-s我们的--no-commit other_upstream git读取树--reset -u other_upstream#或使用--prefix = foo / git checkout HEAD - debian / git checkout HEAD - .gitignore git commit -m'取代上游来源'-a I'm trying to take a branch with changes and bring it back to be identical to the upstream it diverged from. The changes are both local and have been pushed to github, so neither git reset or git rebase are really viable, since they change history, which is a bad thing with a branch that's already been pushed.I've also tried git merge with various strategies but none of them undo the local changes, i.e. if I'd added a file, a merge might bring other files back in line, but I'll still have that file that the upstream doesn't have.I could just create a new branch off the upstream, but i'd really like a merge that in terms of revision history applies all the changes to take my branch and make it identical to the upstream again, so that I can safely push that change without clobbering history. Is there such a command or series of commands? 解决方案 You could merge your upstream branch to your dev branch, with a custom merge driver "keepTheirs":See ""git merge -s theirs" needed — but I know it doesn't exist".In your case, only one .gitattributes would be required, and a keepTheirs script like:mv -f $3 $2exit 0git merge --strategy=theirs Simulation #1Shows as a merge, with upstream as the first parent.Jefromi mentions (in the comments) the merge -s ours, by merging your work on the upstream (or on a temp branch starting from upstream), and then fast-forwarding your branch to the result of that merge:git checkout -b tmp origin/upstreamgit merge -s ours downstream # ignoring all changes from downstreamgit checkout downstreamgit merge tmp # fast-forward to tmp HEADgit branch -D tmp # deleting tmp(Edit 2011):This workflow has been reported in this blog post by the OP:git merge --strategy=theirs Simulation #2Shows as a merge, with ours as the first parent.(proposed by jcwenger)git checkout -b tmp upstreamgit merge -s ours thebranch # ignoring all changes from downstreamgit checkout downstreamgit merge --squash tmp # apply changes from tmp but not as merge.git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge headgit commit -m "rebaselined thebranch from upstream" # make the commit.git branch -D tmp # deleting tmpgit merge --strategy=theirs Simulation #3This blog post mentions:git merge -s ours ref-to-be-mergedgit diff --binary ref-to-be-merged | git apply -R --indexgit commit -F .git/COMMIT_EDITMSG --amendgit merge --strategy=theirs Simulation #4(same blog post)git branch -m upstream-unstable upstream-unstable-savegit branch upstream-unstable upstream-remote/mastergit merge -s ours upstream-unstablegit diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"git commit -F .git/COMMIT_EDITMSG --amendgit merge --strategy=theirs Simulation #5(proposed by Barak A. Pearlmutter):git checkout MINEgit merge --no-commit -s ours HERSgit rm -rf .git checkout HERS -- .git checkout MINE -- debian # or whatever, as appropriategit gui # edit commit message & click commit buttongit merge --strategy=theirs Simulation #6(proposed by the same Michael Gebetsroither):# get the contents of another branchgit read-tree -u --reset <ID># selectivly merge subdirectories# e.g superseed upstream source with that from another branchgit merge -s ours --no-commit other_upstreamgit read-tree --reset -u other_upstream # or use --prefix=foo/git checkout HEAD -- debian/git checkout HEAD -- .gitignoregit commit -m 'superseed upstream source' -a 这篇关于git命令使得一个分支像另一个分支的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-15 08:07