Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git:如何在合并时覆盖所有本地更改?_Git - Fatal编程技术网

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