这是情况。我正在master
分支机构工作。我创建了file1并提交。我创建了file2并提交。哎呦。有一天,我可能想要使用file2,但绝对不应该放在master分支中。所以我没有丢失file2我使用
git checkout head~1
git branch new-branch
git checkout new-branch
这样我才能继续发展。我将file3添加到new-branch
。如果您一直在关注,我有两个分支,master
包含“file1”和“file2”,new-branch
包含“file1”和“file3”。
现在是时候将我所做的更改带回主分支了。最好的方法是什么?我绝对希望master
分支的头部指向new-branch
中显示的文件,但我也不想丢失我在file2中完成的重置工作,如果我想使用它。
请记住,这是一种简化。而不是只有三个文件,我有十几个文件,其中有几十行代码被改变,所有这些都有多次提交。我当然希望解决方案不是逐个文件合并/签出,因为这将是一个巨大的痛苦。
有什么想法吗?
答案 0 :(得分:2)
我正在处理主分支。一世 创建file1并提交。
date >file1
git add file1
git commit -m 'added file1'
我创建了file2并提交。
date >file2
git add file2
git commit -m 'added file2'
糟糕。我可能想要使用file2, 总有一天,但绝对不是 应放入的东西 主分支。
糟糕。非常简单。从你所在的位置建立一个新分支:
git checkout -b savingfile2
这将使file2更改savingfile2
的提交。现在回去并在主人身上放松一步
git checkout master
git reset --hard HEAD~1
此时,通向master的提交将反映file1的添加, master和savingfile2之间的额外提交将是file2的添加。
如果您对master进行了更多更改,然后想最终恢复file2,那么您需要将该分支重新绑定到新主服务器上:
date >file3
git add file3
git commit -m 'adding file3'
date >file4
git add file4
git commit -m 'adding file4'
现在我们终于想要file2:
git checkout savingfile2
git rebase master # might need to fix conflicts here
git checkout master
git merge savingfile2 # will be a fast-forward
git branch -d savingfile2 # no need any more
应该这样做。
答案 1 :(得分:1)
当你注意到你提交file2的错误时你应该做的是:撤消提交(而不是创建一个新的分支):
git checkout master
git reset HEAD^
这使得file2无法跟踪且无损伤,并且可能无法修改。那么你应该(有)stash(ed)未经修改的修改,以防你以后想要使用它们:
git stash save "modifications that should not be in the master branch"
Stashing摆脱了任何本地更改,允许master
指向new-branch
:
git merge new-branch
这里的目标是消除两个分支之间的分歧,即使master
成为new-branch
的祖先。这样就不会发生实际的合并,最后一个命令只是快进 master
分支(前提是没有本地更改)。
答案 2 :(得分:1)
由于您没有按照optimal workflow所描述的Tomi Kyöstilä进行操作,但由于您尚未发布(推送)任何内容,为什么不切换两个分支?
(如果一切都已提交)
master
和new-branch
只是指向某些SHA1的一些指示:
$ git checkout master #start from master
$ git branch tmp # tmp points on master HEAD
$ git checkout new-branch # switch to new-branch
$ git branch -f master new_branch # master points at new-branch HEAD
$ git checkout tmp # switch back to *former* master branch
$ git branch -f new_branch tmp # new-branch points at former master HEAD
$ git checkout master # go to new master
$ git branch -D tmp # remove tmp pointer
......你已经完成了。
(免责声明:尚未测试,因此请谨慎使用;))
请参阅:
git-reset
的错误”段落中的类似方法
"Branching and merging with git",