我有一个带XXX
分支的本地存储库。我想检查master
分支是否有变化(我可以将其整合到我的XXX
中)。
git pull
会将更改应用到我的本地存储库,但我想先检查是否有更改而不实际应用它们。
如何?
答案 0 :(得分:2)
我建议避免 git pull
。 git pull
的作用是:
git fetch
git merge
(但您可以选择git rebase
)他们之间没有停止。这是方便的,但是,它不是。 (Pull还为两个Git命令中的每个命令提供特定参数,但这通常不是必需的,并且模糊了所有实际操作。)
git merge
之后 git fetch
命令不允许您这样做 - 它将运行git pull
,然后立即运行第二个Git命令。
TL; DR:首先运行git fetch
,然后环顾四周,然后 - 之后你已经确定它是个好主意 - 你可以运行第二个Git命令git fetch
将运行。
git pull
因此,只需自己运行git fetch
。这将使你的Git调用另一个Git,git fetch
。你的Git会问他们的Git:嘿,你有什么分支?您的origin
和其他分支的提交的哈希ID是什么? 1 当您的Git获得答案时,您的Git将从他们的Git下载所有你需要的提交和你需要的提交 - 然后通过将那个哈希ID放入你的{{}来记住哪个提交是他们的 master
1}},等等。从本质上讲,你的Git现在在本地拥有所有分支机构,但是在master
名下,这样他们就不会以任何方式干涉你自己的任何分支机构。
请注意,与origin/master
不同,任何时候都可以安全地运行origin/*
。 git pull
操作不会破坏您正在处理的任何内容。 这确实假设您不会因特殊git fetch
选项或refspecs过度创作,坚持使用fetch
或git fetch
。 (特别是你需要避免git fetch
git fetch origin
,--update-head-ok
的特殊标志之一会使git pull
变得危险 - git pull
会尝试确保它#39;安全,但历史上一直存在这个错误 - 你不应该运行git pull
,因为这会覆盖你所有的分支。但是git fetch +refs/*:refs/*
是非常安全的。)
现在您已经完成了所有提交 plus 所有提交,您可以查看所有内容。我喜欢使用git fetch origin
,特别是git log --graph
,Patoshi gave us this nice mnemonic, "help from A DOG"(请参阅Pretty git branch graphs和相关帖子)。这个"环顾四周"如果你选择合并,你是如何真正告诉你git log --all --decorate --oneline --graph
会做什么的。 2 如果你选择了它,你也可以告诉你git merge
会做什么改变。
git rebase
将合并当您运行git merge
时,您通常会首先查看某个分支。这是Git放置合并结果的地方,但它也是git merge
本身的输入之一。然后运行git merge
。 3 所以你有两个特别的提交需要考虑。通常,您可以使用两个名称来指定这些内容,例如git merge thing
- 您将检出的分支 - 以及master
。这些名称不一定是分支名称,而第二个名称不是,而且:origin/master
不是你的<命名之一的分支名称/ em>分支机构。再一次,它只是你Git记住他们的 Git分支的方式。另请参阅What exactly do we mean by "branch"?
要查看合并会做什么,通常需要执行以下操作:
origin/master
找到这些的所有合并基础提交。通常只有一个,通常我们只是假设只有一个(因为当有几个时,事情变得复杂和毛茸茸)。然后你会这样做:
git merge-base --all master origin/master
因为这会为您提供git diff <that-hash> master # to see what we did since then
git diff <that-hash> origin/master # to see what they did
合并所需的所有更改集。
合并是关于组合更改。 要合并更改,合并必须找到一个共同的起点,然后找到两个集的更改。这意味着有三个输入:您当前的分支,另一个分支和合并基础。
git merge
命令 Git的diff命令内置了一个特殊规则,仅适用于此合并情况。没有其他Git命令的行为如此,但如果你使用这两个名称,例如git diff
和master
,并在它们之间加上三个点:
origin/master
Git会找到 4 合并基础并与git diff origin/master...master
区别开来:这将是&#34;你做了什么&#34;。然后,您可以围绕三点操作反转两个名称:
master
并且Git将再次找到合并基础,但这次是针对git diff master...origin/master
的差异,以查看&#34;他们做了什么&#34;。
我不会在这里进入rebase,但我注意到origin/master
真正做的是将一些现有的提交复制到新的和改进的提交中。如果您已经在某个分支 B 上工作,而您的上游git rebase
已获得新的提交,则可以在最新的上游提交您的提交。这有利有弊。它比合并要复杂得多 - 实际上,复制的每个提交都是一个小小的迷你合并 - 但很多人更喜欢它给出一个简单的开发历史的错觉,而不是复杂的现实。混乱的历史。与合并一样,可视化提交图是了解rebase的关键。
要查看您将要获得的内容,您需要可视化提交图({D} origin/B
git log
)和/或检查更改(git log --all --decorate --oneline --graph
和git diff B...origin/B
)。您确实无法使用git diff origin/B...B
执行此操作,因为您必须在 git pull
步骤与git fetch
之间执行步。这加上许多其他讨厌的比特,使git merge
成为一个不方便的命令。
1 通过运行git pull
,您可以看到他们的Git告诉您的Git。这与git ls-remote origin
的作用相同,只是它在收集分支名称和哈希ID后立即停止,然后显示它收集的内容。
2 您还可以做更多事情,但可视化图形拓扑或以其他方式找到合并基础是理解{的关键之一{1}}。
3 一旦您的分支设置了上游,您就可以运行git fetch
:Git会选择上游。通常,git merge
的上游为git merge
,因此,一旦master
,origin/master
本身就意味着 git checkout master
。但是,您始终可以指定要合并的特定内容,如果您要合并两个自己的分支,则通常必须这样做(尽管可以设置一个自己的分支)作为你自己的另一个分支的上游!)。
4 如果有多个合并基础,git merge
将选择其中一个。这不太对,但通常效果不错。
答案 1 :(得分:1)
答案 2 :(得分:0)