[英]Git: move changes off of master branch
基本问题,但这一直发生在我身上:
working-branch
更改 master
git merge working-branch
git push
cap deploy
(到staging) 然后我回过头来想想别的东西,然后开始做一些改变......同时还要掌握。
什么是简单的方法:
working-branch
和清除master
以便我可以继续编辑working-branch
new-working-branch
,然后丢弃working-branch
? 在本页 “分支”部分的后半部分冒了一个风险并尝试了推荐,但这只是消除了我的所有编辑!?! 也许是因为在git branch dubious-experiment
和git checkout master
,两个分支上的git status
是相同的(在master上不是'clean')。 所以git reset --hard <SHA1sum>
消灭了两者的所有变化!?!
git branch dubious-experiment
M---N-----O----P---Q ("master" and "dubious-experiment")
git checkout master
# Be careful with this next command: make sure "git status" is
# clean, you're definitely on "master" and the
# "dubious-experiment" branch has the commits you were working
# on first...
git reset --hard <SHA1sum of commit N>
根据您的描述,我假设您尚未提交任何更改 - 这是正确的吗?
如果是的话,这是你的答案:
您需要在编辑器中设置它,但这可能很难。 在提示符和编辑器中显示当前分支有很大帮助。
new-working-branch
,然后丢弃working-branch
git checkout -b new-working-branch
git add …
git commit -m "mycommit"
由于你还没有提交任何东西,你不需要在master上做任何改变。 如果您愿意,现在可以丢弃您的工作分支。
working-branch
git checkout -b temp-branch
git add …
git commit -m "mycommit"
git rebase --onto working-branch master
git checkout working-branch
git reset --hard temp-branch
git branch -d temp-branch
如果您的更改不与master上的任何更改冲突,但不会与工作分支中的更改冲突,则可以更简单地完成此操作:
git stash
git checkout working-branch
git stash pop
如果您已将更改提交给master
但没有推送到任何地方......
为最后的更改创建一个新分支
git checkout -b newfeat master
在working-branch
分支上重放所有更改(移动提交)
git rebase --onto working-branch origin/master newfeat
更改master
分支并将其重置为上次推送的状态
git checkout master
git reset --hard origin/master
此时你有:
master
指向最后被推提交( origin/master
) working-branch
从未改变过 newfeat
分支,包含所有新的提交,并且领先于working-branch
。 我用过类似的情况:
git branch -f <branch-name>
git checkout <branch-name>
要么
git checkout -B <branch-name>
。
两种变体都将分支branch-name
移动到您当前的提交,而不需要重新设置树。
我通常建议使用以下Git设置:
git config push.default nothing
有了这个,你至少必须在推动时命名分支。 它不会阻止你在本地提交master,但是当你意识到你拥有时,你可以将这些提交移动到一个分支而不会影响其他任何人。
在你真正执行一个可以修改某些东西的git命令之前,养成输入$ git status
的习惯。
鉴于此,您可能已经编辑了文件但未将其签入,因为您将在提交之前运行git status
。 在这种情况下,如果你只是切换分支然后提交,git会做正确的事情。
如果你已经向master发送了一个提交,那么只需在分支之间移动文件,如下所示:
$ git checkout --patch master <somefile>
如果你只是想用它合并同一个文件,你真的不需要重置master,但是因为你可能还没有推送任何东西,你应该重置到远程跟踪分支......
$ git reset master origin/master
$ git reset stage origin/stage # whatever
1.阻止对主人的直接编辑(也许警告)
你并不是唯一一个想要这个的人。 我遇到的最好的想法是将git分支直接放在shell提示符中。 我的提示如下:
[user@host directory:git_branch]
我也为git_branch条目着色,所以我在任何时候都在努力。 Stack Overflow上的这 两个链接应该有助于您的提示。
2.将所有编辑移动到工作分支和清除主控,以便我可以继续编辑工作分支
要么
3.将编辑旋转到一个全新的分支新工作分支,然后丢弃工作分支?
这些都是同样的问题 - 如何将主变更移到分支上,无论是旧分支还是新分支。 而你自己的答案是正确的。 虽然乍一看,假设你是主人,你可以更简单地运行:
git branch new_branch
git reset --hard origin/master
我更喜欢将master重置为origin / master而不是担心特定的提交SHA。 但你的步骤基本上是正确的。 至于为什么你丢失了更改,我必须认为在重置master时错误地没有指向Q的分支指针。 没有其他解释是有道理的。 再次,拥有分支shell提示符将有助于避免这些错误。 此外,我很喜欢使用gitk或git log --graph来验证我的分支在我移动它们之前的位置。 由于我无法在工作中轻松使用gitk,因此我的.gitconfig中有一个名为“graph”的别名,它本质上是它的命令行版本:
[alias]
graph = log --graph --all --date=short --pretty=format':%C(yellow)%h%Cblue%d%Creset %s %Cgreen %aN, %ad%Creset'
这将显示最左侧的图形,黄色的提交SHA,蓝色的分支,白色的提交消息和绿色的作者和日期。 当然,这可以根据自己的喜好进行修改。
[编辑使上述命令更简单]
==============================
回应以下评论:
从...开始
A-B < origin/master
\
C-D < master
现在执行git checkout -b new_branch
A-B < origin/master
\
C-D < master, new_branch
现在checkout master, git checkout master
。 请注意,如果您已经在master上,那么git checkout -b new_branch && git checkout master
与git branch new_branch
相同。 我编辑了上面的答案以反映这一点。
现在将master重置为origin / master, git reset --hard origin/master
A-B < master, origin/master
\
C-D < new_branch
因为你有一个指向D的分支(new_branch),所以不会丢失任何更改。 如果我犯了错误,请详细说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.