【问题标题】:Move uncommitted changes from current branch to another branch that conflicts with those changes将未提交的更改从当前分支移动到与这些更改冲突的另一个分支
【发布时间】:2014-04-11 21:14:38
【问题描述】:

假设我在分支master 上,我开始进行一些更改。

我对已经在 Emacs 中打开的文件进行了更改(所以在后台,当结帐发生时,Emacs 是不知道的,除非我不断地恢复缓冲区)。

该文件确实存在于分支other_branch 中,该分支打算稍后合并到master。但是文件在master 中并不存在,直到我不小心从 Emacs 中保存了它。

更改尚未提交,但我意识到我不应该在 master 上进行更改,并且打算在开始更改之前签出不同的分支。

我不想丢失当前的工作,也不想提交给master

我尝试过使用git stash,后跟git checkout other_branch,但这给了我一个错误,说由于未提交的更改,我不允许将分支切换到other_branch

ems@computer:~$ git checkout other_branch
error: The following untracked working tree files would be overwritten by checkout:
    some_file
Please move or remove them before you can switch branches.
Aborting

我在master 中开始(意外)修改的文件确实已经存在于other_branch 中,因此仅检查other_branch 会破坏我的工作目录副本,以及所做的更改,对吗?

我尝试了stash,它似乎确实隐藏了更改,但是当我尝试结帐时,我收到了上面的错误消息。

总结

  1. checkout 一些新的分支,other_branch tracking master

  2. other_branch 中创建一个新文件test.txt 并在Emacs 中打开它进行编辑。提交给other_branch

  3. 回到终端,结账大师。

  4. 回到 Emacs,您忘记了您现在是 master,开始对 test.txt 进行一些更改并保存文件。就master 而言,这是一个全新的文件。

您如何将这些更改转移到other_branch

【问题讨论】:

  • git status 紧跟在您的 git stash 之后是什么? git stash 的全部意义在于清理工作树,然后它应该允许你想要的任何结帐。
  • stash 似乎没有对未跟踪的文件做任何事情——例如未提交的文件。看起来问题在于该文件(在结帐期间在 emacs 中打开)确实 not 存在于master
  • 所以,相对于master,这是一个新文件,而不是隐藏文件的一部分。

标签: git git-branch git-checkout git-stash


【解决方案1】:

暂时重命名文件?

$ mv test.txt test.txt.tmp
$ git checkout other_branch
$ mv test.txt.tmp test.txt

检查更改并提交

【讨论】:

  • 当然,但我想以正确的方式进行。这超出了版本控制以执行版本控制任务。在紧要关头,我会这样做。但我在这里要求了解git 的实际规定是什么。
  • 您可以使用@VonC 的存储,或者在新分支上创建提交并合并。问题是:您的test.txt 的第一个版本已经 版本化。执行mv back; checkout; mv forth 技巧只是重播文件的编辑 - 如果您从一开始就在other_branch 上,您将处于相同的状态。
【解决方案2】:

如果在结帐期间未跟踪的文件是一个问题,也许您可​​以尝试:

git stash --include-untracked

来自git stash man page

如果使用--include-untracked 选项,所有未跟踪的文件也会被隐藏,然后用git clean 清理,使工作目录处于非常干净的状态


由于这也不起作用(在存储弹出窗口中),您可以暗示:

  • 提交(在 master 分支中)
  • 结帐开发并挑选提交
  • 结帐到主控并将其重置为HEAD~

【讨论】:

  • 我在结帐后收到一条消息,上面写着could not restore untracked files from stash,然后尝试stash applystash pop
  • 我认为问题在于,就master而言,它没有被跟踪,但已经在我尝试stash pop的分支中被跟踪。
  • @EMS 也许你不需要 stash。我已经编辑了我的答案。
  • @EMS 在创建存储后尝试git checkout stash@{0} -- test.txt
【解决方案3】:

对我有用的是:

master 为未跟踪的冲突文件执行git add。现在它已被跟踪,请执行git stash 并结帐other_branch。现在,git stash pop 将尝试将 tracked-in-stash 版本与 tracked-in-other_branch 版本合并。这可能会造成合并冲突,因此您必须打开文件并解决任何冲突,并确保在other_branch 上发送git addcommit 它们。然后返回 master 并验证文件没有暂存以进行提交并且不存在于该分支中。

这允许它们被视为在存储中被跟踪,但无需实际提交并从主服务器合并。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2016-09-15
    • 2021-01-07
    • 2016-06-04
    • 2012-12-31
    • 2012-11-21
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多