git switch分支而不丢弃本地更改

meg*_*wac 154 git git-branch

好吧,让我们说有一天我们做了一些修改,当我们去提交它们时,我们注意到我们正在处理错误的分支.

我们如何强制git切换分支而不丢弃本地更改.

在我等待回复的时候,我可能会以天真的方式解决这个问题,但我想知道如果我说的话是正确的程序,如果我说之前没有发生这种情况......

  • 备份改变了回购
  • git reset --hard
  • git checkout right-branch
  • 恢复更改
  • git commit -m "changes"

tor*_*rek 289

根据您的距离以及您希望它们分支的分支,有许多不同的方法.

我们来看一个经典错误:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop
Run Code Online (Sandbox Code Playgroud)

所以,现在你想这些变化,你还没有承诺master,要论develop.

1:如果你不一个develop呢,方法很简单:

$ git checkout -b develop
Run Code Online (Sandbox Code Playgroud)

develop将从您现在的任何地方开始创建一个新的分支.现在你可以提交,新的东西全部开启develop.

2:你这样做有一个develop.看看git是否会让你切换而不做任何事情:

$ git checkout develop
Run Code Online (Sandbox Code Playgroud)

这将成功,或抱怨.如果成功,太棒了!提交.如果不是(error: Your local changes to the following files would be overwritten ...),你仍然有很多选择.

最简单的可能是git stash(正如所有其他答案者一样,击败我点击post说).运行git stash save,或者只是简单git stash pushgit stash:

$ git stash
Run Code Online (Sandbox Code Playgroud)

这使用一个奇怪的非branch-y方法提交你的代码(是的,它确实做了一些提交).它所做的提交不是"在"任何分支上,而是现在安全地存储在存储库中,因此您现在可以切换分支,然后"应用"存储:

$ git checkout develop
Switched to branch 'develop'
$ git stash apply
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,你喜欢结果,那么你就应该save藏匿.这将删除对奇怪的非分支提交的引用.(它们仍在存储库中,有时可以在紧急情况下检索,但在大多数情况下,您应该考虑它们在那时消失.)

push步骤使用git强大的底层合并机制合并了存储的更改,这与您进行分支合并时使用的相同.这意味着如果你错误地处理的分支与你想要处理的分支有很大不同,你可以得到"合并冲突".因此,在假设存储干净地应用之前仔细检查结果是个好主意,即使git本身没有检测到任何合并冲突.

许多人使用git stash drop,这是短手的apply.这样就可以了,但这意味着如果应用程序导致混乱,并且您决定不想继续沿着这条路走下去,那么您就无法轻易获得隐藏.这就是为什么我建议单独git stash pop检查结果,git stash apply && git stash drop只有在满足时才会这样做.(这当然会引入另一个观点,你可以再喝一杯咖啡,忘记你在做什么,回来,做错事,所以这不是一个完美的治疗方法.)

  • 如果我想切换到另一个分支而不提交到当前分支(例如,更改尚未完成),然后又切换回继续该怎么办? (2认同)

Ray*_*Ray 33

使用git stash

git stash
Run Code Online (Sandbox Code Playgroud)

它将更改推送到堆栈.当你想拉回来使用时

 git stash apply
Run Code Online (Sandbox Code Playgroud)

你甚至可以拉出单个物品.要完全吹掉藏匿物:

 git stash clear
Run Code Online (Sandbox Code Playgroud)

  • 最后一个命令应该是`git stash drop`; git stash clear会抹掉整个存储堆栈,包括可能与此命令集无关的存储。 (5认同)

bro*_*oot 13

  • git stash 保存您未经修改的更改
  • git stash list 列出您保存的未登记的藏匿处
  • git stash apply stash@{x} 其中x可以是0,1,2 ......没有你做过的藏匿处


And*_*rko 13

您可以使用 :

  1. git stash 保存您的工作
  2. git checkout <your-branch>
  3. git stash apply git stash pop 加载您的最后作品

当您想暂时保存未完成或凌乱的工作,同时又想在另一个分支上做某事时,Git stash 非常有用。

git -stash 文档


X30*_*61X 6

你可以:

  • 使用git stash搁置更改,或者,

  • 创建另一个分支并在那里提交您的更改,然后将该分支合并到您的工作目录中


ser*_*y.n 5

您可以使用--merge/-m git checkout选项: git checkout -m <another-branch>

-m --合并

切换分支时,如果您对当前分支与要切换到的分支之间不同的一个或多个文件进行了本地修改,则该命令将拒绝切换分支以在上下文中保留您的修改。但是,使用此选项,当前分支、您的工作树内容和新分支之间的三向合并已完成,您将位于新分支上。

来源:https : //git-scm.com/docs/git-checkout