基本问题但这种情况一直发生在我身上:
working-branch
master
git merge working-branch
git push
cap deploy
(进行分期)然后我回过头来想想别的东西,然后开始做一些改变......同时还在掌握。
这是一个简单的方法:
working-branch
并清除master
,以便继续编辑working-branch
new-working-branch
,然后丢弃working-branch
?在this page的“分支”部分的后半部分冒了一个风险并尝试了推荐,但这只是消除了我的所有编辑!?!也许是因为在git branch dubious-experiment
和git checkout master
之后,两个分支上的git status
是相同的(主人不是'干净')。所以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>
答案 0 :(得分:28)
根据您的描述,我假设您尚未提交任何更改 - 这是正确的吗?
如果是,请回答:
您需要在编辑器中设置它,但这可能很难。在您的提示和编辑器中显示当前分支有很多帮助。
new-working-branch
,然后放弃working-branch
git checkout -b new-working-branch
git add …
git commit -m "mycommit"
由于你还没有提交任何东西,你不需要改变主人的任何东西。如果您愿意,现在可以丢弃您的工作分支。
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
答案 1 :(得分:6)
如果您已将更改提交至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
之前。答案 2 :(得分:0)
我用于类似的情况:
git branch -f <branch-name>
git checkout <branch-name>
或
git checkout -B <branch-name>
两个变体都将分支branch-name
移动到您当前的提交中,而不需要重新设置树。
答案 3 :(得分:0)
我通常建议使用以下Git设置:
git config push.default nothing
有了这个,你至少必须在推动时命名分支。它不会阻止你在本地提交master,但是当你意识到你拥有时,你可以将这些提交移动到一个分支而不会影响其他任何人。
答案 4 :(得分:-1)
养成在实际执行git命令之前键入$ git status
的习惯。
鉴于此,您可能已经编辑了文件但未将其签入,因为您将在提交之前运行git status
。在这种情况下,如果你只是切换分支然后提交,那么git会做正确的事。
如果你已经向master发起了一次提交,那么只需在分支之间移动文件,如下所示:
$ git checkout --patch master <somefile>
如果您只是要将相同的文件与它合并,那么你真的不需要重置master,但是因为你可能还没有推动任何东西,所以你应该重置为你的远程跟踪分支......
$ git reset master origin/master
$ git reset stage origin/stage # whatever
答案 5 :(得分:-1)
<强> 1。阻止对主人的直接编辑(可能是警告)
你不是唯一想要这个的人。我遇到的最好的想法是将git分支直接放在shell提示符中。我的提示符如下:
[user@host directory:git_branch]
我也为git_branch条目着色,所以我在任何时候都在努力。 Stack Overflow上的These two链接可以帮助您提示。
<强> 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,蓝色的分支,白色的提交消息,以及作者&amp;绿色的日期。当然,这可以根据自己的喜好进行修改。
[编辑使上述命令更简单]
==============================
回应以下评论:
从
开始A-B < origin/master
\
C-D < master
现在执行git checkout -b new_branch
A-B < origin/master
\
C-D < master, new_branch
现在结帐主人,git checkout 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),所以不会丢失任何更改。如果我犯了错误,请详细说明。