git:如何在合并时覆盖所有本地更改?
情况是这样的。我在git:如何在合并时覆盖所有本地更改?,git,Git,情况是这样的。我在master分支上工作。我创建file1并提交。我创建file2并提交。哎呀。有一天我可能想使用file2,但它绝对不应该放在主分支中。这样我就不会丢失我使用的文件2 git checkout head~1 git branch new-branch git checkout new-branch 这样我才能继续发展。我将文件3添加到新分支。如果您一直注意的话,我有两个分支,master包含“file1”和“file2”,以及new-branch包含“file1”和“file
master
分支上工作。我创建file1并提交。我创建file2并提交。哎呀。有一天我可能想使用file2,但它绝对不应该放在主分支中。这样我就不会丢失我使用的文件2
git checkout head~1
git branch new-branch
git checkout new-branch
这样我才能继续发展。我将文件3添加到新分支
。如果您一直注意的话,我有两个分支,master
包含“file1”和“file2”,以及new-branch
包含“file1”和“file3”
现在是将我所做的更改恢复到主分支的时候了。最好的方法是什么?我当然希望主分支
的负责人指向出现在新分支
中的文件,但我也不想因为重置而丢失我在文件2中所做的工作,以防我想使用它
请记住,这是一种简化。我得到的不是三个文件,而是十几个文件,几十行代码都被修改了,而且都是多次提交的。我当然希望解决方案不是逐个文件合并/签出,因为这将是一个巨大的痛苦
有什么想法吗?当您注意到提交文件的错误时,您应该做的是:撤消提交(而不是创建新分支): 这会使file2未被跟踪、未受损坏,并且可能的修改未受到限制。然后,您应该(已经)(编辑)未限制的修改,以备以后使用:
git stash save "modifications that should not be in the master branch"
隐藏消除了任何本地更改,这允许主
指向新分支
:
git merge new-branch
这里的目标是消除这两个分支之间的分歧,即使
master
成为新分支的祖先。这样就不必进行实际合并,最后一个命令只需快进主分支(前提是没有本地更改)。既然您没有遵循所描述的,而且您还没有发布(推送)任何内容,为什么不切换这两个分支呢?
(前提是一切都已承诺)
master
和新分支
只是指向某些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的情况下修复错误”一段中的类似方法
的,
- 而且在
我在总店工作。我
创建file1并提交
我创建file2并提交
哎呀。我可能想使用file2,
总有一天,但绝对不是
应该放在盒子里的东西
主分支
哎呀。很简单。从您所在的位置创建一个新分支:
git checkout -b savingfile2
这将使文件2更改保存文件2的提交。现在返回并在master上松开一步
git checkout master
git reset --hard HEAD~1
此时,主文件之前的提交将反映添加的file1,
master和savingfile2之间的额外提交将是file2的添加
如果您对master进行了更多更改,然后希望最终恢复file2,则需要将该分支重新设置到新master上:
date >file3
git add file3
git commit -m 'adding file3'
date >file4
git add file4
git commit -m 'adding file4'
现在我们终于想要文件2:
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
应该可以了。如果我在发现之前对主分支进行了多次提交,这将如何工作git reset
只是将头倒回,而不是让我移动那些不正确的提交,对吗?您可以使用(交互式)rebase
从提交历史中删除任意提交(而不是git reset
),只要这些提交没有被推到任何地方。这看起来正是我需要的。谢谢你们说“这看起来正是我需要的”,但你们有并没有像我在回答中指出的那个样尝试切换分支?我有。Randal的回答更接近我的答案。原来钥匙是git reset--hard HEAD~1
。我不知道你可以用一个命令重置一个提交字符串。我所需要做的就是从当前主分支上分支,然后重新设置到我开始出错的地方。“git merge savingfile2将是一个快进”@weakish-该选项比答案更新。:)
git checkout master
git reset --hard HEAD~1
date >file3
git add file3
git commit -m 'adding file3'
date >file4
git add file4
git commit -m 'adding file4'
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