Git:保留未提交更改的情况下检出分支

8
在Git中,我如何检出旧的分支并保留当前分支的所有更改,但它们只是标记为未提交的更改或新文件?
是否有像git checkout-but-keep-changes branch_name这样的命令?

不太清楚你的问题。当你说“我的更改”时,是指对先前分支的提交,还是修改后的文件,或者其他什么? - Andrew C
@AndrewC 谢谢,我已经更新了我的问题。 - Drew LeSueur
3340的回答涵盖了那个案例中的大部分内容。 - Andrew C
2个回答

11

当您检出文件时,Git 通常会执行此操作,假设您所做的更改不是要在检出时更改的文件。例如,假设我在存储库中有以下文件:

a.txt
b.txt
c.txt

现在我将对文件a.txt进行更改:
a.txt (modified)
b.txt
c.txt

现在假设我有另外两个分支,a-changedb-changed,它们分别修改了a.txtb.txt
如果我尝试检出b-changed,Git会无怨无悔地执行,因为我的工作目录更改不会与该分支上的更改冲突。但是,如果我尝试检出a-changed,Git将不会执行,因为我已经对本地副本进行了更改,而检出会覆盖它们。Git会提示:
$ git checkout a-changed
error: Your local changes to the following files would be overwritten by checkout:
        a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting

Git提供了一种解决这个问题的方法:隐藏你的更改! 这将保存您当前的更改并在工作目录中撤消它们。 也就是说,在运行git stash之后,工作目录将被清除,并将您的更改放置到stash堆栈上。 然后,您可以检出所需的分支并运行git stash pop,它将从堆栈中弹出您的更改并将其应用于新的工作树。 希望它们能够干净地应用。 如果不是这样,您将在a.txt中获得标准的合并冲突标记。 值得注意的是,stash没有从堆栈中弹出,因此在解决合并后需要执行git stash drop
您还可以向checkout命令传递-m--merge)标志,表示您希望您的更改与传入的更改进行三方合并。 通常,我更喜欢隐藏东西。

0

我在寻找 git reset --soft 命令。

抱歉我的问题表述不太清楚。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接