git stash和apply

13 浏览
0 Comments

git stash和apply

我对git还不太了解,对stash的工作原理也不太清楚。

假设我正在master分支上工作,尝试执行git pull,但收到一个错误,说我的本地更改将被覆盖,需要进行stash或commit。如果我还没有暂存任何更改,然后执行git stash,然后成功执行git pull并更新,那么当我执行git stash apply时会发生什么?

一般来说,如果其他人修改了文件,我执行git pull,那么当我执行git stash apply时会发生什么?它会覆盖刚刚更新的文件,无论我stash时是否暂存它们吗?它会用stash的文件覆盖刚刚通过git pull更新的每个文件吗?

0
0 Comments

在使用git时,一般情况下,未提交的更改是不好的。要么你的更改是好的,那就提交它们,要么它们是不好的,那就丢弃它们。在有未提交更改的情况下进行任何git操作往往会引起问题,因为git并不知道你没有提交的任何内容,所以git无法帮助你。

说完这个,回到你的问题上。

Git通常是非常智能的。当你应用你的存储时,它会尝试将你的更改与其他更改合并。大多数情况下,这只是起作用的。

如果更改真的发生冲突,因为你以不同的方式更改了相同的行,git会告诉你,你必须自己解决冲突。即使在这种情况下,git也会通过git mergetool来帮助你,它会启动一个适当的命令来显示冲突,并允许你逐个解决它们。

讨论(本答案的第一段)可能更适合放在评论中,而不是答案中。

0
0 Comments

Git stash and apply是一个用于保存和恢复工作进度的git命令。当我们在工作过程中需要切换到其他分支进行修复或更新时,可以使用git stash命令将当前的工作进度保存起来,然后切换分支进行其他操作。当我们完成其他操作后,可以使用git stash apply命令将之前保存的工作进度恢复回来。

然而,在使用git stash和apply命令时,有时会出现冲突的情况。当我们在切换分支后,对文件进行了修改,而在恢复工作进度时发现与之前保存的工作进度产生了冲突。此时,git stash并不会立即删除之前保存的工作进度,而是保留下来供我们处理冲突。我们可以通过git stash list命令查看之前保存的工作进度的SHA1值,然后使用git checkout命令切换到对应的版本,再使用git stash apply命令将工作进度恢复回来。这样,我们就可以解决冲突并继续之前的工作。

为了更好地处理这种情况,我们还可以使用git stash branch命令。该命令可以将三个步骤(切换到保存的工作进度适用的版本、创建新分支、应用工作进度并在成功应用后删除工作进度)合并成一步。我们可以使用以下命令来实现:

git stash branch 

这样,我们就可以方便地在新分支下恢复之前保存的工作进度,并且在成功应用后删除工作进度。

总之,git stash和apply命令可以帮助我们保存和恢复工作进度,避免在切换分支时丢失修改。当出现冲突时,我们可以通过查看保存的工作进度的SHA1值和使用git stash apply命令来解决冲突。另外,使用git stash branch命令可以更方便地进行保存和恢复工作进度的操作。

0
0 Comments

原因:

git stash命令会在当前的HEAD commit上创建一个特殊的merge commit(称为stash-bag),存储了暂存的更改。而git stash apply命令会尝试将这些更改应用到当前所在的不同的commit上。

解决方法:

1. 当你完成了这些更改后,应该使用git stash drop命令将stash-bag从它所在的commit上移除。

2. 如果你不喜欢apply的结果,想要稍后再试,建议将apply和drop两个步骤分开使用。

git stash and apply问题的出现原因和解决方法

git stash命令会在当前的HEAD commit上创建一个特殊的merge commit(stash-bag),存储了暂存的更改。当你完成了这些更改后,应该使用git stash drop命令将stash-bag从它所在的commit上移除。git stash apply命令会尝试将这些更改应用到当前所在的不同的commit上。

git stash命令相对来说比较复杂,要真正理解git stash,需要了解commit、branch、index/staging-area、git的引用命名空间以及合并等的工作原理。因为git stash会创建一个特殊的merge commit,并且这个merge commit不属于任何分支,而git stash apply命令会使用git的合并机制来尝试“重新应用”在创建这个特殊merge commit时保存的更改,可选地保留已暂存和未暂存更改之间的区别。

幸运的是,你不需要完全理解这些原理才能使用git stash。当你在某个分支(比如master)上工作,并且有一些还没有准备好的更改时,不想将它们提交到分支上,同时又想从远程仓库的origin/master分支上获取一些新的提交时,可以使用git stash命令来保存这些更改并保持工作目录的干净。然后可以执行git pull来拉取远程仓库的提交。

在执行git stash命令后,stash-bag会被挂在你运行git stash命令时所在的commit上。这个commit是你在master分支上运行git stash命令之前的commit。当你运行git pull命令后,提交D和E会被添加到你的本地master分支上,此时stash-bag仍然挂在之前的commit上。

如果你在本地master分支上已经进行了一些自己的提交,运行git stash命令后再运行git pull命令,会产生一个真正的合并(merge)而不是快进(fast forward)。这时会生成一个新的合并提交M。这个时候,origin/master标签仍然指向提交E,而你所在的master分支指向合并提交M,它是提交E和你的提交Z的合并。你在origin/master分支上领先一个提交。

不管是哪种情况,在执行git stash apply命令时,stash脚本会执行git diff stash^ stash > /tmp/patch和git apply /tmp/patch命令。这个命令会对比stash(即w的部分)和正确的父提交(C或Z),找出“你做了什么”并将更改应用到当前所在的提交上(E或M)。

总之,一旦stash成功应用,你可以使用git stash drop命令删除对stash-bag的引用,从而使它可以被垃圾回收。在删除之前,stash-bag有一个引用(refs/stash或stash@{0}),所以它会一直存在,除非你创建了一个新的stash,这会将当前的stash推送到stash reflog中(引用变为stash@{1}),并将新的stash使用refs/stash名称。stash保留的时间默认是永久的,但如果你进行了其他配置,推送的stash可能会丢失。

需要注意的是,git stash drop命令会弹出stash栈,重新编号stash@{2}为stash@{1},将stash@{1}变为普通的stash。可以使用git stash list命令查看stash栈。

以上就是关于git stash and apply问题的出现原因和解决方法的整理。

0