- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大多数情况下,当我尝试 check out 另一个现有分支时,如果我在当前分支上有一些未提交的更改,Git 不允许我这样做。所以我必须首先提交或 stash 这些更改。
但是,有时 Git 确实允许我在不提交或 stash 这些更改的情况下 check out 另一个分支,并且它会将这些更改传送到我 check out 的分支。
这里的规则是什么?更改是暂存的还是未暂存的有关系吗?将更改带到另一个分支对我来说没有任何意义,为什么 git 有时会允许它?也就是说,它在某些情况下有用吗?
最佳答案
初步说明
这个答案试图解释 Git 的行为方式。不建议参与任何特定的工作流程。 (我自己的偏好是无论如何都提交,避免 git stash
并且不要试图太棘手,但其他人喜欢其他方法。)
这里的观察是,在您开始工作后 branch1
(忘记或没有意识到首先切换到不同的分支 branch2
会很好),您运行:
git checkout branch2
有时 Git 会说“好吧,你现在在 branch2 上!”有时,Git 会说“我不能那样做,我会丢失你的一些更改。”
git stash
to save them; this is one of the things it's designed for.请注意
git stash save
或
git stash push
实际上的意思是“提交所有更改,但根本不在任何分支上,然后将它们从我现在所在的位置删除。”这使得切换成为可能:您现在没有进行中的更改。然后您可以
git stash apply
切换后的它们。
Sidebar:
git stash save
is the old syntax;git stash push
was introduced in Git version 2.13, to fix up some problems with the arguments togit stash
and allow for new options. Both do the same thing, when used in the basic ways.
git stash
或
git commit
;或者,如果您的更改很容易重新创建,请使用
git checkout -f
强制它。这个答案是关于 Git 何时让你开放
git checkout branch2
即使你开始做出一些改变。为什么它有时起作用,而有时不起作用?
git add
s,
git rm
s 等等——假设你在
branch1
.一个
git checkout branch2
必须这样做:
branch1
中的每个文件而不是在 branch2
,1 删除该文件。 branch2
中的每个文件而不是在 branch1
,创建该文件(具有适当的内容)。 branch2
中的版本不同,更新工作树版本。 branch1
中提交的版本相同,则删除文件是“安全的” ;如果您进行了更改,则它是“不安全的”。 branch2
如果现在不存在,则为“安全”。2 如果现在确实存在但内容“错误”,则为“不安全”。 branch1
,用不同版本替换文件的工作树版本是“安全的”。 . git checkout -b newbranch
) 始终被认为是“安全的”:作为此过程的一部分,不会在工作树中添加、删除或更改任何文件,并且索引/暂存区也不会受到影响。 (警告:在不更改新分支起点的情况下创建新分支是安全的;但是如果您添加另一个参数,例如
git checkout -b newbranch different-start-point
,这可能需要更改内容,以移动到
different-start-point
。然后 Git 将应用像往常一样结帐安全规则。)
P
的文件。
是 在
branch1
如果
git rev-parse branch1:P
产生一个散列。那个文件
不是 在
branch1
如果您收到错误消息。路径的存在
P
在回答这个特定问题时,您的索引或工作树中的内容无关紧要。因此,这里的 secret 是检查
git rev-parse
的结果。在每个
branch-name:path
.这要么因为文件“在”最多一个分支而失败,要么给了我们两个哈希 ID。如果两个哈希 ID 相同,则两个分支中的文件相同。无需更改。如果hash ID不同,说明两个分支的文件不同,必须改成切换分支。
branch1
中有所不同和
branch2
:
$ git show branch1:inboth
this file is in both branches
$ git show branch2:inboth
this file is in both branches
but it has more stuff in branch2 now
$ git checkout branch1
Switched to branch 'branch1'
$ echo 'but it has more stuff in branch2 now' >> inboth
此时,工作树文件
inboth
与
branch2
中的匹配,即使我们在
branch1
.此更改不是为提交而暂存的,这就是
git status --short
显示在这里:
$ git status --short
M inboth
space-then-M 表示“已修改但未暂存”(或更准确地说,工作树副本与暂存/索引副本不同)。
$ git checkout branch2
error: Your local changes ...
好的,现在让我们暂存工作树副本,我们已经知道它也与
branch2
中的副本匹配.
$ git add inboth
$ git status --short
M inboth
$ git checkout branch2
Switched to branch 'branch2'
这里的暂存和工作副本都与
branch2
中的内容相匹配。 ,因此允许结帐。
$ git checkout branch1
Switched to branch 'branch1'
$ cat inboth
this file is in both branches
我所做的更改现在从暂存区丢失了(因为结帐是通过暂存区写入的)。这是一个角落案例。变化没有消失,但我上演的事实已经消失了。
$ echo 'staged version different from all' > inboth
$ git add inboth
$ git show branch1:inboth > inboth
$ git status --short
MM inboth
两人
M
s 这里的意思是:暂存文件不同于
HEAD
文件,并且,工作树文件与暂存文件不同。工作树版本确实匹配
branch1
(又名
HEAD
)版本:
$ git diff HEAD
$
但是
git checkout
不允许结帐:
$ git checkout branch2
error: Your local changes ...
让我们设置
branch2
版本作为工作版本:
$ git show branch2:inboth > inboth
$ git status --short
MM inboth
$ git diff HEAD
diff --git a/inboth b/inboth
index ecb07f7..aee20fb 100644
--- a/inboth
+++ b/inboth
@@ -1 +1,2 @@
this file is in both branches
+but it has more stuff in branch2 now
$ git diff branch2 -- inboth
$ git checkout branch2
error: Your local changes ...
即使当前的工作副本与
branch2
中的匹配,暂存文件没有,所以
git checkout
会丢失那个副本,而
git checkout
被拒绝。
git add
一个文件,您可以用您的工作树中的任何内容替换索引版本。
git add
它到索引。所以实际上每个文件都有三个位置:当前提交、索引和工作树。
git checkout branch2
,Git 在幕后所做的是比较
branch2
的提示提交到当前提交和索引中的任何内容。任何与现有文件匹配的文件,Git 都可以不理会。这一切都没有受到影响。任何在两次提交中都相同的文件,Git 也可以单独保留——这些是让您切换分支的文件。
path/to/name.txt
,我们有
path/to/name.txt
的索引条目.也许所有三个哈希都匹配。也许其中两个匹配,一个不匹配。可能三个人都不一样吧。而且,我们可能还有
another/file.txt
仅在 X 中或仅在 Y 中,并且现在是否在索引中。这些不同的情况中的每一种都需要单独考虑:Git 是否需要将文件从提交复制到索引,或从索引中删除,以从 X 切换到 Y?如果是这样,它还必须将文件复制到工作树,或将其从工作树中删除。如果是这种情况,索引和工作树版本最好至少匹配一个已提交的版本;否则 Git 会破坏一些数据。
git checkout
文档中,而是在
the git read-tree
documentation, under the section titled "Two Tree Merge" 中描述。)
关于git - 当前分支上有未提交的更改时 checkout 另一个分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053757/
我时不时地输入“git”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!