git:如何在合并时覆盖所有本地更改?

时间:2010-01-08 02:32:14

标签: git

这是情况。我正在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中完成的重置工作,如果我想使用它。

请记住,这是一种简化。而不是只有三个文件,我有十几个文件,其中有几十行代码被改变,所有这些都有多次提交。我当然希望解决方案不是逐个文件合并/签出,因为这将是一个巨大的痛苦。

有什么想法吗?

3 个答案:

答案 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ä进行操作,但由于您尚未发布(推送)任何内容,为什么不切换两个分支?
(如果一切都已提交)

masternew-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

......你已经完成了。
(免责声明:尚未测试,因此请谨慎使用;))

请参阅: