Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“git隐藏”是否在内部“承诺”我的本地回购?_Git_Git Commit_Git Stash - Fatal编程技术网

“git隐藏”是否在内部“承诺”我的本地回购?

“git隐藏”是否在内部“承诺”我的本地回购?,git,git-commit,git-stash,Git,Git Commit,Git Stash,我只在推到远程回购之前手动提交本地回购 但我更多的时候是为了得到编码伙伴的更改 有时我们都在同一个文件上工作,但存在冲突。在这种情况下,他告诉我在我的git拉之前先做一个git藏起来,然后再做一个git藏起来 但有时这会导致git下次告诉我,我不能拉,因为我有未合并的文件。这些通常是本地树中的实验性更改,我不希望提交或推动这些更改 有几次我需要发送我的工作,结果是远程repo中的中间版本,包括我的本地实验、调试代码等,这些都是我从未希望发送的。我想避免弄得这么乱 这是因为隐藏修改了我的本地回购协

我只在推到远程回购之前手动提交本地回购

但我更多的时候是为了得到编码伙伴的更改

有时我们都在同一个文件上工作,但存在冲突。在这种情况下,他告诉我在我的git拉之前先做一个git藏起来,然后再做一个git藏起来

但有时这会导致git下次告诉我,我不能拉,因为我有未合并的文件。这些通常是本地树中的实验性更改,我不希望提交或推动这些更改

有几次我需要发送我的工作,结果是远程repo中的中间版本,包括我的本地实验、调试代码等,这些都是我从未希望发送的。我想避免弄得这么乱

这是因为隐藏修改了我的本地回购协议吗?如果是的话,我怎样才能避免呢?如果不是的话,还有什么可能导致它?我完全是git的新手,只使用这几个命令。

将本地更改保存在临时框中,而不是工作树中

您可以查看存储列表-

$ git stash --list
在进行更改之前,请确保将所有不必要的/实验性的更改完美地隐藏起来

$ git stash save 'provide stash message'       # better give a stash message
$ git stash     # see if all the changes are stashed
如果不想删除它,也可以应用隐藏而不是pop。您还可以通过git stash drop删除1个隐藏,而无需应用它。 基本上,pop=应用+删除

将本地更改保存在临时框中,而不是工作树中

您可以查看存储列表-

$ git stash --list
在进行更改之前,请确保将所有不必要的/实验性的更改完美地隐藏起来

$ git stash save 'provide stash message'       # better give a stash message
$ git stash     # see if all the changes are stashed
如果不想删除它,也可以应用隐藏而不是pop。您还可以通过git stash drop删除1个隐藏,而无需应用它。 基本上,pop=应用+删除


我想在这里首先提到,术语索引与暂存区域的含义相同,并且您应该记住,在任何时候都有三个版本的文件处于活动状态:头版本、索引或暂存版本以及工作树版本。当您第一次运行git checkout时,通常三个版本都匹配。任何提交的版本都是永久的,就像提交一样永久且不可更改:您不能触摸当前提交中存储的版本。您可以随时覆盖索引和工作树版本,但正常模式是:

检查提交的版本:将提交复制到索引,然后将索引复制到工作树。 在工作树版本上工作。 使用git add将工作树版本复制回索引。 重复步骤2和3,直到满意为止;或者使用GitAdd-patch构建一个索引版本,该版本类似于工作树版本,但有所不同。通常,在运行调试文件时,这样做是为了使某个文件的可提交版本中没有额外的调试内容。这确实意味着索引树和工作树可以彼此不同,也可以与头提交不同

如果您确实运行git commit,那么这将立即从索引/暂存区域中的任何内容进行提交。这就是为什么您必须始终保持git添加,以便将工作树复制到索引中

同样,git stash save也会进行提交。更准确地说,如果git stash save做了什么,有时它什么也不做,如果没有更改,它至少会进行两次提交。如果使用-untracked或-all标志,它将进行三次提交。与文档一样,我们将主要忽略第三次提交。1

这些提交的不寻常之处在于它们不在分支上。特殊引用名称refs/stash指向新创建的w工作树commit。它至少有两个父级,一个是头提交,另一个是i索引提交。对于-untracked或-all,有一个第三个父级,我称之为u,它持有额外的、未跟踪的文件

在这里我们也将忽略的所有情况2中,在i和w提交中保存每个文件的索引和工作树版本后,git stash save然后运行git reset-hard HEAD,用HEAD提交中存储的版本替换这些文件的索引和工作树版本。因此,您的工作现在已保存,以后可以恢复,但不再存在于索引或工作树中

1如果且仅当您使用-all或-untracked选项创建第三次提交时,Git还会使用适当的选项运行Git clean以删除存储在此第三个父级中的文件。请记住:任何现有的未跟踪文件,无论是否被忽略,都不会包含在i或w中。它们根本不会被保存,因此也不会被清除,除非您使用这些额外的选项。请注意,未跟踪文件的定义只是指目前不在索引中的任何文件。最后两个词也很关键,如果你还没有遇到,但最终可能会遇到

2使用-keep index选项时会出现一种情况。在里面 在这种情况下,git stash save代码会做一些相当棘手的事情:在进行i和w提交之后,它不会将索引和工作树重置为HEAD,而是将它们重置为i提交中的内容。这样做的目的是安排工作树来保存建议的新提交,以便测试工作树文件的程序可以测试文件的待提交版本。然而,对于粗心的人来说,这里有几个陷阱:参见

你错在哪里 一旦您保存了一个隐藏,即i和w提交,您就可以安全地运行git pull、3或更好的git fetch。这将从另一个Git获得新的提交,您的Git将记住它们作为源,通过origin/master和origin/develope和origin/feature/toll等记住它们。然后,拉取的第二步,即重设基础或合并,将重设基础,即复制现有提交(如果有),或将现有提交(如果有)与您引入的最新提交合并,并调整您自己的当前分支以指向结果

到目前为止,一切都很顺利,这正是你正在做的。但现在我们来谈谈棘手的部分

现在,您可以按照同事/编码伙伴的建议运行git stash pop。我建议从git stash apply开始,而不是从git stash pop开始,但是当它失败并且失败时,考虑到您提到的其他问题,这并不重要。4 git尝试应用保存的提交,以便恢复您在索引和/或工作树中保存的更改。但正如我刚才所说的,这很棘手,因为提交是快照,而不是更改。另外,默认情况下,git stash apply/git stash pop会丢弃i提交。使用-index,它也尝试将i提交恢复到索引中

为了将w提交恢复为更改,而不是快照,Git使用其合并机制。隐藏脚本中有以下实际行:

git merge-recursive $b_tree -- $c_tree $w_tree
其效果就像您运行了git merge或更接近git cherry pick的命令。Git将您隐藏的工作树$w_tree commit w与$b_tree头部的commit进行比较,以查看您所做的更改,并将当前索引转换为部分commit$c_tree与同一个$b_tree进行比较,以查看它们所做的更改,并合并它们

与任何合并一样,此合并可能会因合并冲突而失败。这就是您所描述的:

。。。无法拖动,因为我有未合并的文件

当合并失败时,它会将部分合并的结果保留在工作树中,并将原始文件集保留在索引中。例如,假设文件foo.txt存在合并冲突。现在,不再是foo.txt-HEAD当前提交、索引和工作树的三个版本,而是五个版本!这些是:

头,一如既往; 索引阶段1,合并基础版本:这是一个取自$b_树的版本,这是一个在运行git stash save时与返回的提交一起使用的树; 索引阶段2或-我们的:这是启动git stash apply/git stash pop失败时索引中的内容。这可能与HEAD版本相匹配。 索引阶段3或-他们的:这是$w_树中的任何内容,即您隐藏的更改;和 保留在工作树中的版本,带有合并冲突标记。 请注意,正如git rebase和git cherry pick一样,我们/他们的git签出标志在这里有点颠倒

一旦您处于这种恼人的未合并索引项状态,除了完成它或完全中止操作之外,您几乎无能为力

在这种特殊情况下,git stash apply已经在应用的中途停止,因此已经中止了后续git stash drop。因此,您仍然拥有隐藏,可以运行git reset-hard HEAD来中止应用隐藏的尝试。或者,您可以编辑工作树文件以完成Git无法完成的合并,Git添加文件以将其复制到索引中,以便索引具有来自工作树的单个合并条目,替换三个更高的分段条目

对于任何失败的合并,您必须执行相同的过程:要么中止合并,然后确定以后要做什么;或者你现在就完成

请注意,一般情况下,您不应该只使用git添加工作树文件,而是使用冲突标记完成。虽然这解决了cannot X的问题,但您有未合并的索引项,这会使您的文件中充满冲突标记,这并不是真正有用的

如果git需要将您的一些提交与其他人的提交合并,那么在运行git pull时也可能发生这种合并失败合并冲突。或者,Git可以自己成功地进行合并,或者至少认为它成功了,然后进行新的合并提交。在这种情况下,系统将提示您输入提交消息:


我注意到,隐藏后拉的副作用有时会打开vi,让我输入提交消息

这表示您已在分支上进行了正常提交 ,并且您的git pull已经运行git merge,它认为它成功地进行了合并,现在需要提交消息来提交新的合并提交

您可能希望在这里使用git rebase而不是git merge。如果先使用git fetch,然后使用第二个git命令,而不是使用git pull,这会更容易

请注意,如果您确实使用git rebase并学习它,特别是非常方便的git rebase-i,您可以随意进行各种临时提交,包括:

。。。本地实验、调试代码等

当你重新设置基址时,你会将这些提交复制到其他人的提交之上,将你的工作保持为你自己的工作;您最终可以使用git-rebase-i来压缩临时提交,以支持一个大的最终真正提交。你必须小心不要意外地推他们一旦你这样做了,拷贝到处都是,要让其他人放弃它们太难了

3我建议不要在这里使用git pull:而是将其拆分为多个组件。首先,运行gitfetch从另一个git获取新的提交。一旦您有了提交,您可以查看它们,如果您愿意的话。然后使用git rebase或git merge将这些提交合并到分支中。每个分支需要一个git rebase或git merge,但在所有分支之前只需要一个git fetch

一旦您非常熟悉git pull的两个组成部分将如何工作,您就可以安全地运行git pull,知道当出现问题时,最终会出现问题,您将认识到发生了什么,哪一步失败了,并且知道如何解决问题

4不过,为了完整起见,请注意git stash pop只是指git stash apply和git stash drop。也就是说,试图应用隐藏;然后如果Git认为进展顺利,立即放下藏品。但有时候吉特认为一切都很顺利,而事实并非如此。在这种特殊的情况下,手头仍然有藏品是很好的,而git stash drop使得找回藏品变得非常困难


我想在这里首先提到,术语索引与暂存区域的含义相同,并且您应该记住,在任何时候都有三个版本的文件处于活动状态:头版本、索引或暂存版本以及工作树版本。当您第一次运行git checkout时,通常三个版本都匹配。任何提交的版本都是永久的,就像提交一样永久且不可更改:您不能触摸当前提交中存储的版本。您可以随时覆盖索引和工作树版本,但正常模式是:

检查提交的版本:将提交复制到索引,然后将索引复制到工作树。 在工作树版本上工作。 使用git add将工作树版本复制回索引。 重复步骤2和3,直到满意为止;或者使用GitAdd-patch构建一个索引版本,该版本类似于工作树版本,但有所不同。通常,在运行调试文件时,这样做是为了使某个文件的可提交版本中没有额外的调试内容。这确实意味着索引树和工作树可以彼此不同,也可以与头提交不同

如果您确实运行git commit,那么这将立即从索引/暂存区域中的任何内容进行提交。这就是为什么您必须始终保持git添加,以便将工作树复制到索引中

同样,git stash save也会进行提交。更准确地说,如果git stash save做了什么,有时它什么也不做,如果没有更改,它至少会进行两次提交。如果使用-untracked或-all标志,它将进行三次提交。与文档一样,我们将主要忽略第三次提交。1

这些提交的不寻常之处在于它们不在分支上。特殊引用名称refs/stash指向新创建的w工作树commit。它至少有两个父级,一个是头提交,另一个是i索引提交。对于-untracked或-all,有一个第三个父级,我称之为u,它持有额外的、未跟踪的文件

在这里我们也将忽略的所有情况2中,在i和w提交中保存每个文件的索引和工作树版本后,git stash save然后运行git reset-hard HEAD,用HEAD提交中存储的版本替换这些文件的索引和工作树版本。因此,您的工作现在已保存,以后可以恢复,但不再存在于索引或工作树中

1如果且仅当您使用-all或-untracked选项创建第三次提交时,Git还会使用适当的选项运行Git clean以删除存储在此第三个父级中的文件。请记住:任何现有的未跟踪文件,无论是否被忽略,都不会包含在i或w中。它们根本不会被保存,因此也不会被清除,除非您使用这些额外的选项。请注意,未跟踪文件的定义只是指目前不在索引中的任何文件。最后两个词也很关键,如果你不是 但最终可能会遇到

2使用-keep index选项时会出现一种情况。在本例中,git stash save代码做了一些相当棘手的事情:在进行i和w提交之后,它不是将索引和工作树重置为HEAD,而是将它们重置为i提交中的内容。这样做的目的是安排工作树来保存建议的新提交,以便测试工作树文件的程序可以测试文件的待提交版本。然而,对于粗心的人来说,这里有几个陷阱:参见

你错在哪里 一旦您保存了一个隐藏,即i和w提交,您就可以安全地运行git pull、3或更好的git fetch。这将从另一个Git获得新的提交,您的Git将记住它们作为源,通过origin/master和origin/develope和origin/feature/toll等记住它们。然后,拉取的第二步,即重设基础或合并,将重设基础,即复制现有提交(如果有),或将现有提交(如果有)与您引入的最新提交合并,并调整您自己的当前分支以指向结果

到目前为止,一切都很顺利,这正是你正在做的。但现在我们来谈谈棘手的部分

现在,您可以按照同事/编码伙伴的建议运行git stash pop。我建议从git stash apply开始,而不是从git stash pop开始,但是当它失败并且失败时,考虑到您提到的其他问题,这并不重要。4 git尝试应用保存的提交,以便恢复您在索引和/或工作树中保存的更改。但正如我刚才所说的,这很棘手,因为提交是快照,而不是更改。另外,默认情况下,git stash apply/git stash pop会丢弃i提交。使用-index,它也尝试将i提交恢复到索引中

为了将w提交恢复为更改,而不是快照,Git使用其合并机制。隐藏脚本中有以下实际行:

git merge-recursive $b_tree -- $c_tree $w_tree
其效果就像您运行了git merge或更接近git cherry pick的命令。Git将您隐藏的工作树$w_tree commit w与$b_tree头部的commit进行比较,以查看您所做的更改,并将当前索引转换为部分commit$c_tree与同一个$b_tree进行比较,以查看它们所做的更改,并合并它们

与任何合并一样,此合并可能会因合并冲突而失败。这就是您所描述的:

。。。无法拖动,因为我有未合并的文件

当合并失败时,它会将部分合并的结果保留在工作树中,并将原始文件集保留在索引中。例如,假设文件foo.txt存在合并冲突。现在,不再是foo.txt-HEAD当前提交、索引和工作树的三个版本,而是五个版本!这些是:

头,一如既往; 索引阶段1,合并基础版本:这是一个取自$b_树的版本,这是一个在运行git stash save时与返回的提交一起使用的树; 索引阶段2或-我们的:这是启动git stash apply/git stash pop失败时索引中的内容。这可能与HEAD版本相匹配。 索引阶段3或-他们的:这是$w_树中的任何内容,即您隐藏的更改;和 保留在工作树中的版本,带有合并冲突标记。 请注意,正如git rebase和git cherry pick一样,我们/他们的git签出标志在这里有点颠倒

一旦您处于这种恼人的未合并索引项状态,除了完成它或完全中止操作之外,您几乎无能为力

在这种特殊情况下,git stash apply已经在应用的中途停止,因此已经中止了后续git stash drop。因此,您仍然拥有隐藏,可以运行git reset-hard HEAD来中止应用隐藏的尝试。或者,您可以编辑工作树文件以完成Git无法完成的合并,Git添加文件以将其复制到索引中,以便索引具有来自工作树的单个合并条目,替换三个更高的分段条目

对于任何失败的合并,您必须执行相同的过程:要么中止合并,然后确定以后要做什么;或者你现在就完成

请注意,一般情况下,您不应该只使用git添加工作树文件,而是使用冲突标记完成。虽然这解决了cannot X的问题,但您有未合并的索引项,这会使您的文件中充满冲突标记,这并不是真正有用的

如果git需要将您的一些提交与其他人的提交合并,那么在运行git pull时也可能发生这种合并失败合并冲突。或者,Git可以自己成功地进行合并,或者至少认为它成功了,然后进行新的合并提交。在这种情况下,系统将提示您输入提交消息:


我注意到,在藏匿后拉动的副作用有时会打开 vi供我输入提交消息

这表示您已经在分支上进行了正常的提交,并且您的git pull已经运行了git merge,它认为已经成功地进行了合并,现在需要提交消息来进行新的合并提交

您可能希望在这里使用git rebase而不是git merge。如果先使用git fetch,然后使用第二个git命令,而不是使用git pull,这会更容易

请注意,如果您确实使用git rebase并学习它,特别是非常方便的git rebase-i,您可以随意进行各种临时提交,包括:

。。。本地实验、调试代码等

当你重新设置基址时,你会将这些提交复制到其他人的提交之上,将你的工作保持为你自己的工作;您最终可以使用git-rebase-i来压缩临时提交,以支持一个大的最终真正提交。你必须小心不要意外地推他们一旦你这样做了,拷贝到处都是,要让其他人放弃它们太难了

3我建议不要在这里使用git pull:而是将其拆分为多个组件。首先,运行gitfetch从另一个git获取新的提交。一旦您有了提交,您可以查看它们,如果您愿意的话。然后使用git rebase或git merge将这些提交合并到分支中。每个分支需要一个git rebase或git merge,但在所有分支之前只需要一个git fetch

一旦您非常熟悉git pull的两个组成部分将如何工作,您就可以安全地运行git pull,知道当出现问题时,最终会出现问题,您将认识到发生了什么,哪一步失败了,并且知道如何解决问题

4不过,为了完整起见,请注意git stash pop只是指git stash apply和git stash drop。也就是说,试图应用隐藏;然后如果Git认为进展顺利,立即放下藏品。但有时候吉特认为一切都很顺利,而事实并非如此。在这种特殊的情况下,手头仍然有藏品是很好的,而git stash drop使得找回藏品变得非常困难


git stash确实做了一种提交,但它不太可能是您意外推动的。您是否使用Git GUI提交的文件比您预期的要多?或者你可能在做git add./git commit-a?不,在我了解git在原始级别的功能之前,我会避免使用GUI:git stash确实做了一种提交,但这不太可能是你无意中推动的。您是否使用Git GUI提交的文件比您预期的要多?或者你可能在做git add./git commit-a?不,在我了解git在原始级别的功能之前,我会避免使用GUI:我注意到,隐藏后的拉操作的副作用有时会打开vi,让我输入提交消息。这让我很困惑,让我觉得我要把事情搞得一团糟。有时隐藏信息会指出隐藏中的实际变化。此外,对于隐藏的信息,也不应影响拉动。你能重新生成这个问题并附加命令吗?一个问题是我只有一个项目,我不想在它上做实验,因为这是我不想添加混乱的实际工作。所以复制一份,然后在它上做实验。@hippietrail,git pull有时在git stash与git stash完全无关后打开vi。后者只是将未提交的更改保存到与当前签出的分支无关的区域中。git pull向您弹出vi的事实是因为git pull看到您的本地分支和您从中提取的分支已经分离,因此命令将它提取的内容合并到本地分支中,要求您描述合并操作。我注意到,在隐藏之后,提取的副作用有时会打开vi,让我输入提交消息。这让我很困惑,让我觉得我要把事情搞得一团糟。有时隐藏信息会指出隐藏中的实际变化。此外,对于隐藏的信息,也不应影响拉动。你能重新生成这个问题并附加命令吗?一个问题是我只有一个项目,我不想在它上做实验,因为这是我不想添加混乱的实际工作。所以复制一份,然后在它上做实验。@hippietrail,git pull有时在git stash与git stash完全无关后打开vi。后者只是将未提交的更改保存到与当前签出的分支无关的区域中。git pull向您弹出vi是因为git pull看到您的本地分支和您从中提取的分支已经分离,因此命令将其提取的内容合并到本地分支中,要求您描述合并操作。感谢您提供的超深答案+1.这里所有的案例都被精确地讨论了,虽然有点长:哇,这是我在堆栈溢出问题上得到的最好的答案。干得好!谢谢你深奥的回答+1.这里全部
这些案例虽然有点长,但讨论得很精确:哇,这是我在堆栈溢出问题上得到的最好答案。干得好!