【问题标题】:Git: Compare All Local Commits to Remote Repo VersionGit:将所有本地提交与远程仓库版本进行比较
【发布时间】:2011-08-09 17:38:10
【问题描述】:

我对 Git 有点陌生,我正在尝试做的事情似乎应该是可能的。基本上我一直在克隆一个 repo 并且做了很多本地提交。有没有办法查看我所有更改的“总和”与原始回购版本的差异?我认为这是可能的,因为当我执行push 时,Git 基本上会这样做。

这是我正在尝试做的一个例子:在 gitk 我会看到这样的东西:
* - [mybranch] 在 answers.txt 末尾添加了“42”(本地提交)
* - 在 my.txt 末尾添加了“Hello World”(本地提交)
* - 在 my.txt 的开头添加了“C#/.NET”(本地提交)
* - (我克隆的原始仓库)

与我从RemoteRepo 签出的原始版本相比,我如何查看我对my.txtanswers.txt 所做的所有更改的总和的差异?

【问题讨论】:

  • 如果您需要在 GitHub 中执行此操作 - check this

标签: git diff compare status gitk


【解决方案1】:

有三种方法(这里给出的其他答案中的另外两种)

1) git diff origin/master master
2) git diff origin/master..master
3) git diff origin/master...master

第一个和第二个是相同的,并且显示主控和远程主控的提示之间的变化。

第三个显示自分支上次推送以来在主服务器上发生的更改,我认为这是您正在寻找的最合适的更改

【讨论】:

  • 谢谢,3 效果很好(我最终使用 git difftool 而不是 git diff)。 1 和 2 显示了远程仓库中不属于我的差异,所以这些不是我需要的。
  • origin/master...origin/master 是一个空集?我认为您在编辑过程中以某种方式弄乱了语法。你的意思是origin/master...master 吗?
  • 这个命令会打开 vi/vim 吗?我很困惑命令之后会发生什么,我在什么环境中??
  • master分支需要是当前结账的分支吗?
【解决方案2】:

最现成的答案是

 git show-branch

你可以做更多的控制是使用git log附件git rev-list

 git log --left-right --graph --cherry-pick \
      --oneline branchname...remote/branchname

这是我的首选方法,会产生类似

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 some tagged commit

包括--decorate,你会得到接近gitk、git-gui和gitweb的东西:

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c (tag_4) Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 (tag_3) some tagged commit

专业提示 1:使用 'git config alias.lr log --long-option1 --long-option2' 方便使用

专业提示 2:使用“git config color.ui auto”来立即缓解眼部问题

如果您想要 所有 个本地头(在所有本地分支上)与 所有 个远程提交(在同上分支上):

git log --decorate --pretty=oneline --all --not --glob=refs/remotes --no-walk

不要走不通,以获取所有单独的修订。在这种情况下,我更喜欢使用前面显示的开关(--graph --left-right)

合并

如果你想清楚地看到合并,包括 --boundary

各种高级查询:

过滤结果

Git logrev-list 支持一整套狡猾的过滤能力,请参阅手册页

--after '2001-01-01'
--until 'last week'
--author 'martin'
-E -i  --grep='fixes #[0123456789]+'
-S 'new_debug_function'

还有很多很多其他的。这应该为您提供足够的杠杆作用,几乎可以零努力地获得您想要的信息

本地存储了什么?

什么驻留在存储中,但不在远程(请注意,无法引用远程分支上的存储,因为存储驻留在 reflogs 中,并且 reflogs(即使对于远程分支)总是反映本地历史记录[1]):

git log $(git rev-list -g stash) --not --glob=refs/remotes 

所有(其他)无法访问的提交...

注意事项

  • 在我的工作流程中,这些构成仅重新设置/修改了提交并删除了存储
  • 根据历史图表的大小,生成这些也需要一些时间
  • 这将包括所有丢弃的存储,但不包括当前的存储

    git log $(git fsck --unreachable --full --lost-found | grep '提交' |剪切 -d' ' -f3) \ --no-walk --not --glob=refs/remotes --oneline --decorate

脚本

出于脚本目的,将git log 的使用替换为git rev-list,您将只获得哈希值(以及更多脚本文件的健壮性)

[1] 另请参阅我之前关于如何在存储库之间转移存储的答案:

【讨论】:

    【解决方案3】:

    (通常)执行您想要的操作的最简单且最容易记住的命令是:

    git diff origin
    

    这显示了您最初提取的内容(原点)与您正在处理的当前分支之间的差异,默认为 master

    【讨论】:

      【解决方案4】:

      可以用git diff A B查看区别,它会比较A和B中的代码:

      git diff origin/master master
      

      origin/master 是您上次从中获取(或克隆)远程 master 分支时的状态,master 是代码的本地状态——除非您在本地工作时切换了分支。

      【讨论】:

        【解决方案5】:

        一切 git diff HEAD origin/"nameofyourbranch"

        针对特定文件 git diff HEAD:"filename" origin/"nameofbranch":"filename"

        【讨论】:

        • git diff origin/branch HEAD -- file
        【解决方案6】:
        git diff origin/master..master
        

        【讨论】:

          猜你喜欢
          • 2013-08-05
          • 2018-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 2019-06-22
          相关资源
          最近更新 更多