如何简单的解释"git pull --rebase"?
How to explain "git pull --rebase" in simple terms?
我想我理解 git pull
这就是我解释它的方式,我称之为 "simple terms":
- 一般来说,
git pull
是关于 将 一个 "remote" 分支合并为一个 "local" 分支。
- 更详细地说,git使用"remote"分支的内容到"update"/"modify""local"分支的内容。
- 更详细一点,如果一个文件在"local"分支修改过,而在"remote"分支没有修改,那么合并后,文件内容将与"local" 分支中的内容。反之亦然。如果文件在 "remote" 分支中被修改但在 "local" 分支中没有修改,则内容将从 "remote" 分支中获取。
- 如果文件在两个分支("local" 和 "remote")中都被修改,那么 git 将 尝试 从两个分支中获取修改.如果更改发生在文件的不同位置,合并后这两个更改都将应用并出现在文件的内容中。
- 如果更改发生在同一个地方,我们就有了所谓的 "merge conflict",为了简单起见,我不会触及这种情况。
- 由于合并,我们修改了 "local" 存储库,因此我们需要 "commit"。
现在我想对 git pull --rebase
进行同样的解释。我不想使用 "head"、"index"、"fetch"、"upstream" 之类的术语,因为这些术语/概念只会让像我这样的初学者感到困惑。我知道我需要学习这些 "advanced" 概念,我通过阅读教程来学习,但现在,作为我学习过程的一部分,我想了解 git pull --rebase
.
已添加
我想我在某个时候听到了以下解释。通过 git pull --rebase
。当我们合并时,我们不是以 "symmetric" 的方式进行,如上所述。相反,我们首先 "forget" "local" 存储库中的更改,然后仅应用 "remote" 存储库中的更改。通过这样做,我们基本上 "copy" 了远程存储库。之后,我们将 "local" 存储库中的更改应用到 顶部 。但是,我仍然不清楚这到底是什么意思。特别是 "on top" 是什么意思。
我看到有两件事可以澄清:您关注的是两个分支中文件的状态,但考虑正在发生的事情的更好方法是根据已发生的变更集。第二个问题是 git pull
是 shorthand 两个操作:git fetch
和 git merge
。是的,您写的是 "don't want to use words like fetch
",但那不是 "advanced concept"。如果你想了解发生了什么,你需要从这里开始。
git fetch
本质上是 通知 本地仓库它不知道的更改。
git merge
将新到达的更改与您的本地更改统一起来。
要注意的是,如果两个回购协议上发生的事情没有同步,它们可能会发生分歧:
... b--o--o--o--o (remote)
\
x--x--x (local)
上面从左到右显示时间;最右边的点是最近的。因此,新到达的更改是对文件的旧状态的修改,即标记为 "b" 的文件。
git pull
,即普通 git merge
,将尽可能合并两个分支的最新状态。
git pull --rebase
会假装您所做的更改不是针对标记为 "b" 的状态,而是针对最新的远程状态。换句话说,它将尝试重写历史,使其看起来像这样:
... b--o--o--o--o (remote)
\
x--x--x (local)
这就是区别。一个后果是,如果您不进行变基,则您的回购历史记录会包含一些状态(如果您愿意,您可以在将来倒退到这些状态),其中应用了 "x" 更改,但 "o"没有变化。 rebasing后,版本库中没有这个地方。
简单:只要您的工作是本地的(意味着它没有被推送),git pull --rebase
将用于在更新的历史记录之上重播您的本地工作。
git fetch
将使用远程仓库的最新提交更新所述历史记录(例如 origin/master
)。
然后你的工作(你的 master
分支的本地提交)将在更新的历史记录之上一个接一个地重放(这是 rebase 所做的)。
想法是,当你想要推送时,推送将非常简单,并且不需要合并,因为你的提交只是在 origin/master
.[=18= 之上完成的新提交]
请注意,您可以完全隐藏变基部分 :
git config pull.rebase true
git config rebase.autoStash true
即使变基不顺利而您不得不中止,Git 也会为您恢复隐藏的当前工作 。
我想我理解 git pull
这就是我解释它的方式,我称之为 "simple terms":
- 一般来说,
git pull
是关于 将 一个 "remote" 分支合并为一个 "local" 分支。 - 更详细地说,git使用"remote"分支的内容到"update"/"modify""local"分支的内容。
- 更详细一点,如果一个文件在"local"分支修改过,而在"remote"分支没有修改,那么合并后,文件内容将与"local" 分支中的内容。反之亦然。如果文件在 "remote" 分支中被修改但在 "local" 分支中没有修改,则内容将从 "remote" 分支中获取。
- 如果文件在两个分支("local" 和 "remote")中都被修改,那么 git 将 尝试 从两个分支中获取修改.如果更改发生在文件的不同位置,合并后这两个更改都将应用并出现在文件的内容中。
- 如果更改发生在同一个地方,我们就有了所谓的 "merge conflict",为了简单起见,我不会触及这种情况。
- 由于合并,我们修改了 "local" 存储库,因此我们需要 "commit"。
现在我想对 git pull --rebase
进行同样的解释。我不想使用 "head"、"index"、"fetch"、"upstream" 之类的术语,因为这些术语/概念只会让像我这样的初学者感到困惑。我知道我需要学习这些 "advanced" 概念,我通过阅读教程来学习,但现在,作为我学习过程的一部分,我想了解 git pull --rebase
.
已添加
我想我在某个时候听到了以下解释。通过 git pull --rebase
。当我们合并时,我们不是以 "symmetric" 的方式进行,如上所述。相反,我们首先 "forget" "local" 存储库中的更改,然后仅应用 "remote" 存储库中的更改。通过这样做,我们基本上 "copy" 了远程存储库。之后,我们将 "local" 存储库中的更改应用到 顶部 。但是,我仍然不清楚这到底是什么意思。特别是 "on top" 是什么意思。
我看到有两件事可以澄清:您关注的是两个分支中文件的状态,但考虑正在发生的事情的更好方法是根据已发生的变更集。第二个问题是 git pull
是 shorthand 两个操作:git fetch
和 git merge
。是的,您写的是 "don't want to use words like fetch
",但那不是 "advanced concept"。如果你想了解发生了什么,你需要从这里开始。
git fetch
本质上是 通知 本地仓库它不知道的更改。git merge
将新到达的更改与您的本地更改统一起来。
要注意的是,如果两个回购协议上发生的事情没有同步,它们可能会发生分歧:
... b--o--o--o--o (remote)
\
x--x--x (local)
上面从左到右显示时间;最右边的点是最近的。因此,新到达的更改是对文件的旧状态的修改,即标记为 "b" 的文件。
git pull
,即普通git merge
,将尽可能合并两个分支的最新状态。git pull --rebase
会假装您所做的更改不是针对标记为 "b" 的状态,而是针对最新的远程状态。换句话说,它将尝试重写历史,使其看起来像这样:... b--o--o--o--o (remote) \ x--x--x (local)
这就是区别。一个后果是,如果您不进行变基,则您的回购历史记录会包含一些状态(如果您愿意,您可以在将来倒退到这些状态),其中应用了 "x" 更改,但 "o"没有变化。 rebasing后,版本库中没有这个地方。
简单:只要您的工作是本地的(意味着它没有被推送),git pull --rebase
将用于在更新的历史记录之上重播您的本地工作。
git fetch
将使用远程仓库的最新提交更新所述历史记录(例如 origin/master
)。
然后你的工作(你的 master
分支的本地提交)将在更新的历史记录之上一个接一个地重放(这是 rebase 所做的)。
想法是,当你想要推送时,推送将非常简单,并且不需要合并,因为你的提交只是在 origin/master
.[=18= 之上完成的新提交]
请注意,您可以完全隐藏变基部分
git config pull.rebase true
git config rebase.autoStash true
即使变基不顺利而您不得不中止,Git 也会为您恢复隐藏的当前工作