所以我在master分支中有很多提交。我想回滚到一个提交并在一个文件中进行一些更改。它只与checkout
命令有关。
那我的步骤是什么。
1.我从主人git checkout -b new_branch
结账新分行
2.然后在new_branch中,我使git checkout f95ecfe
回滚到提交。
现在说:HEAD detached at f95ecfe
在这个阶段,我想添加一些更改并将这个新分支推送到bitbucket。
我应该做一些其他的动作,还是我可以简单地制作git push origin new_branch
同样在这个提交后的主人f95ecfe我有很多其他提交,所以我的问题也是如何正确地将这个新分支与分离头与主人合并。它会合并一个我修改过的文件,还是会合并来自新分支的整个树,并且所有文件的状态都与主树不同?
答案 0 :(得分:2)
你应该认为推动master
是神圣的(除非你是唯一一个编辑它的人)。否则,如果你开始重新排序master,(即你回到过去,更改提交,并“强制推送”它们),那么你实际上是在重写历史。任何拔掉了主人的人都会在他们再次拉扯时出现不一致的情况,并且必须对其进行排序。总疼痛。
根据您的偏好/与您合作的人,有几种不同的方法来保持“好主人”。
以下是我建议在这些情况下处理您的情况的方法:
我的偏好是一个线性主人 - 所以这意味着每当有人推动时,他们首先在主人之上重新定位,然后推动。那么师父就是一条直线,你不会让很多分支合并混乱。
你应该做的只是在你的主人的 end 上添加修复文件的提交,并推送它,在提交消息中标识你正在修改的先前提交等。
也就是说,你可以采取以下措施:
git checkout master
git add FILE_TO_CHANGE
git commit -m 'Bug fix for f95ecfe (Plus more details, obviously)'
git push origin master
(可选地,创建一个bug修复分支,然后删除它,完整的工作流可能看起来像这样):
git pull --rebase origin master //Pull latest code
git checkout master // Move head to master (and check it out)
git checkout -b bug_fix // Create branch and check out to it (currently pointing to the same commit as master)
// Do some work...
git add FILE_TO_CHANGE
git commit -m 'Bug fix for f95ecfe (Plus more details, obviously)'
git pull --rebase origin master // Pull latest code, try to rebase on top of it
git checkout master
git merge bug_fix // fast-forward merge master onto bug_fix branch
git push origin master // push master
git branch -d bug_fix // delete the temporary local branch
分支主数据允许您更清楚地查看哪些提交相关,但意味着它看起来非常混乱。有些人更喜欢这种方法。
工作流程将类似于:
git pull origin master
git checkout f95ecfe // Move head to f95ecfe (note: HEAD is no longer on a branch! - just a commit)
git checkout -b bug_fix // Create branch at the current position and check out to it (branch is pointing to f95ecfe)
// Do some work...
git add FILE_TO_CHANGE
git commit -m 'Bug fix for f95ecfe (Plus more details, obviously)'
git pull origin master // Pull latest code. ALSO merges onto master.
// Alternatively could do:
git merge master
git checkout master // Now we need to bring master up to where we are
git merge bug_fix // fast-forward master onto the bug_fix merge
git push origin master // push master
git branch -d bug_fix // delete the temporary local branch
如果只编辑master并且想要及时返回并更改提交,并在master上更改它,请执行以下操作:
git checkout f95ecfe
git checkout -b 'bug_fix' // It's nicer to have your head attached to a branch. So create a branch at this point
// Make some changes
git commit --amend 'Message'
现在您需要将所有其他提交添加到您当前所在的位置。有很多方法可以做到这一点。就个人而言,我更喜欢通过git gui使用cherry-pick
命令一步一步地执行此操作,而不是执行一次大规模的rebase。但最干净的事情是将master
变为bug_fix
,如下所示:
git checkout master
git rebase --onto bug_fix f95ecfe // Put the commits from (but not including) f95ecfe up to master, on top of bug_fix
然后你应该检查git gui中的所有内容,然后你可以推送:
git push -f origin master
注意:如前所述,这是{em> FORCED 推送-f
。如果其他人在他们的机器上有主分支的副本,不要这样做,因为它会使他们的副本不一致,并且因为他们必须改变他们的所有更改并修复他们的本地主人而导致他们非常痛苦。
PS:有很多方法可以完成这一部分,我给出了我认为最简单的方法(在某种意义上它使用了更多的基本命令)。替代方案包括在master之上进行提交(根据线性主指令),然后使用git rebase -i
(交互模式)重新排序提交&lt; - 这可能是最自然的方式。< / p>
答案 1 :(得分:0)
您可以在您所处的状态下创建分支,然后像执行任何其他分支一样执行操作。
分离头状态只表示您所做的任何更改都不在分支上,如果您要去分支机构,可能会丢失。因此,您可以继续进行更改并提交它们。然后将它们发送到遥控器,执行以下操作:
//Create a branch at your current state.
// you can also do this before committing.
git branch <new branch name>
//Send it to the remote.
git push origin <new branch name>
现在您的更改就像任何其他分支一样。如果您想将更改带入掌握,您需要做的只是git merge
并解决由于您的更改而发生的任何冲突。
This page has an explanation of detached head.基本上,您正在探索本地仓库中的代码。但是如果你改成一个分支,你的提交只是浮动。它们不是要引用的分支的一部分,并且在某些时候将被垃圾收集。为了保留更改,您只需创建一个您的提交可以成为其中一部分的分支。