检查Git是否有变化

时间:2018-02-21 10:37:03

标签: git version-control

我有一个带XXX分支的本地存储库。我想检查master分支是否有变化(我可以将其整合到我的XXX中)。

git pull会将更改应用到我的本地存储库,但我想先检查是否有更改而不实际应用它们。

如何?

3 个答案:

答案 0 :(得分:2)

我建议避免 git pullgit pull的作用是:

  1. 运行git fetch
  2. 运行第二个Git命令,通常为git merge(但您可以选择git rebase
  3. 他们之间没有停止。这是方便的,但是,它不是。 (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过度创作,坚持使用fetchgit 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 --graphPatoshi 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 diffmaster,并在它们之间加上三个点:

    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 --graphgit 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,因此,一旦masterorigin/master本身就意味着 git checkout master。但是,您始终可以指定要合并的特定内容,如果您要合并两个自己的分支,则通常必须这样做(尽管可以设置一个自己的分支)作为你自己的另一个分支的上游!)。

    4 如果有多个合并基础,git merge将选择其中一个。这不太对,但通常效果不错。

答案 1 :(得分:1)

您可以通过以下命令看到差异

git diff (local-branch) (remote-branch)

OR

click here for more details

答案 2 :(得分:0)

这应该这样做,

$ git diff <masterbranch_path> <remotebranch_path>

您可能还想查看git fetch