Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.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 pull“;当我的工作树和/或索引变脏时?_Git_Git Pull - Fatal编程技术网

“安全吗?”;git pull“;当我的工作树和/或索引变脏时?

“安全吗?”;git pull“;当我的工作树和/或索引变脏时?,git,git-pull,Git,Git Pull,假设我有一个git-repo,其工作树和/或索引是“脏的”(即,我有尚未提交或隐藏的本地修改),我很想在不首先提交或隐藏的情况下进行“git-pull”。(或者,假设我向git介绍了一名新的团队成员,他们很想在本地回购“肮脏”时运行“git pull”。)我想知道在这种情况下进行“git pull”有多安全。如果不安全,最糟糕的事情是什么?如果我从可信或不可信的来源提取数据,这有关系吗 到目前为止,我的调查表明,在我认为是一个相当直截了当的问题上,有一系列令人困惑的想法 首先,git stash

假设我有一个git-repo,其工作树和/或索引是“脏的”(即,我有尚未提交或隐藏的本地修改),我很想在不首先提交或隐藏的情况下进行“git-pull”。(或者,假设我向git介绍了一名新的团队成员,他们很想在本地回购“肮脏”时运行“git pull”。)我想知道在这种情况下进行“git pull”有多安全。如果不安全,最糟糕的事情是什么?如果我从可信或不可信的来源提取数据,这有关系吗

到目前为止,我的调查表明,在我认为是一个相当直截了当的问题上,有一系列令人困惑的想法

首先,git stash手册页让人觉得git pull相当安全,如果您遇到可能出错的情况,它将中止:

   Pulling into a dirty tree
       When you are in the middle of something, you learn that there are
       upstream changes that are possibly relevant to what you are doing.
       When your local changes do not conflict with the changes in the
       upstream, a simple git pull will let you move forward.

       However, there are cases in which your local changes do conflict
       with the upstream changes, and git pull refuses to overwrite your
       changes. In such a case, you can stash your changes away, perform a
       pull, and then unstash, like this...
到目前为止,在我的简单测试中,似乎也发生了这种情况

也可能意味着“git pull”是相当安全的,VisualStudio的工具栏上有一个突出的pull按钮,在使用“git pull”之前不会检查是否有脏污。(如果我在设计VisualStudio工具栏,我会尽量避免让自己的脚特别容易被射中。)

git pull手册页并没有让我的“git pull”听起来很危险,尽管它表明这不是一个最佳实践:

   If any of the remote changes overlap with local uncommitted changes,
   the merge will be automatically cancelled and the work tree untouched.
   It is generally best to get any local changes in working order before
   pulling or stash them away with git-stash(1).
但是,你也可以找到这样的建议,那就是进入肮脏的环境是非常糟糕的

对于哪种观点是最好的,有没有一个简单的答案,或者这是一个逐案的问题


后续:使用“git-pull--rebase”而不仅仅是“git-pull”会改变答案吗?在某些情况下,重定基址可能会有问题,但到目前为止,我的猜测是,拥有一个脏的工作树/索引不会使重定基址变得比其他情况更麻烦。

以我的经验,它是绝对安全的(我使用git大约4年了)。如果您有未限制的更改,它通常无法告诉您您有一个脏的工作副本。

对维护Apache DeltaSpike项目的人员没有冒犯,但是我相信Git手册页上关于Git的内容,而不是Delta Spike wiki的内容

另请注意,在引用的文本中(强调我的):

git-pull
如果您的分支在master之前,或者您的分支在附近有脏文件,则不应调用。这总是会导致提交历史记录中出现一些脏的工件

“提交历史记录中的脏工件”是Git合并提交。每当合并分支而不是在另一个分支上重定一个分支的内容时,都会发生这种情况。这些合并提交是否“脏”取决于您的项目、组织及其意见和策略


无论如何,
git pull
从来都不是危险的操作。如文件所述,它不会破坏您的任何历史记录或正在进行的工作。

git pull只是git fetch+重新设置基础/合并,自动合并可能会产生噪音或意外结果。(噪波示例:当您所做的只是向同一个文件添加一行10次时,您不需要10次合并提交。)如果未初始化的用户只是在不检查的情况下执行git拉和推,则噪波将被检入

我想说的是,新的团队成员在一棵肮脏的工作树上拉git后更容易迷失方向,不管它是否安全,这将取决于响应(每次拉后检查结果将是一个良好的开始)


然后根据从服务器获取的内容进行合并、重新设置基础或重置。您可以使用pull,它不会破坏正在进行的工作。然而,前一种方法是首选的。

到目前为止,我不确定这是否会影响git pull(这听起来像是它预先检测到是否可能存在合并冲突,如果可能的话会中止),但至少要注意,合并(即进行git合并)到脏工作树中显然会限制您“撤消”的能力在合并失败的情况下进行合并。特别是,从git合并手册页:

   [merge] --abort
       Abort the current conflict resolution process, and try to
       reconstruct the pre-merge state.

       If there were uncommitted worktree changes present when the merge
       started, git merge --abort will in some cases be unable to
       reconstruct these changes. It is therefore recommended to always
       commit or stash your changes before running git merge.
情景A:

如果拉式提交与您的工作树中的未提交的更改冲突,那么Git将中止并避免您将回购搞得一团糟

情景B:

如果拉式提交会与回购协议中的已提交更改发生冲突,并且您的工作树中也有未提交的更改不会发生冲突,那么您最终会陷入混乱。在拉取之前,您必须在不丢失工作树中的更改的情况下解决冲突并提交

在向Git介绍新的团队成员之后,我有时会想到场景B。我的团队的新成员的一个常见错误是意外/疏忽地更改了我们的网络驱动器repo中的文件,而不是他们应该更改的本地克隆上的文件,而且他们还忘记提交这些更改


另一方面,保护自己不受团队错误影响的一种方法是,始终首先选择干净的本地回购,在本地处理任何冲突,然后从本地回购选择与团队共享的回购。这个额外的步骤阻止了场景B,或者使脏树对您透明,或者在最坏的情况下,向您展示场景A。谢天谢地,场景A可以作为正常冲突处理,而不会像场景B那样令人头痛。

wiki的声明很奇怪:局部修改永远不会导致“工件”在提交历史中。@Jefromi:的确如此。这就是为什么我把重点放在后面的部分(如果必要的话,它会自动创建提交)。我在DeltaSpike的Wiki中看不到这样的评论。@DarWhi:the在标题为“避免git拉动”的第一部分中包含了评论。链接标题文本只是“e.g.”,所以它相当微妙。@DarWhi:你只是个r
git fetch
   [merge] --abort
       Abort the current conflict resolution process, and try to
       reconstruct the pre-merge state.

       If there were uncommitted worktree changes present when the merge
       started, git merge --abort will in some cases be unable to
       reconstruct these changes. It is therefore recommended to always
       commit or stash your changes before running git merge.