我知道GIT rebase会重写历史记录 - 即提交ID会改变.但是,有没有办法追踪分支何时被重新分支以及从哪个分支?
编辑:我有一个开发分支'A'和一个主题分支'B'.团队共享'A'.在某些时候,'A'已经与主流分支重新建立.由于重新基础(以及后续提交),当我更新主题分支时,我看到了不一致.我试图找出正确的人来解决问题.
我开始*.py diff=python了.git/info/attributes.所以Git知道功能界限在哪里.git diff -W甚至可以确保显示整个功能.
但有没有办法将git diff的输出限制为特定的函数(或多个函数)?
(没错,我猜它很糟糕......)
编辑这也将是有益的git log和git rev-list:不显示我的每一个承诺会修改views.py,告诉我犯这是修改某个功能.(是的,在一个理想的世界里,views.py不会是一个经常被8个不同的开发者修改的2000行庞然大物...)
以前,我可以打字
git log
Run Code Online (Sandbox Code Playgroud)
现在,我必须输入:
git log | less
Run Code Online (Sandbox Code Playgroud)
获得相同的效果.我没有(故意)改变任何参数.我已经检查了我的全局配置:"〜/ .gitconfig"和我的项目git config".git/config"但我看不到会导致这种情况的任何内容.所有命令参数似乎都是为了选择退出.任何帮助是极大的赞赏!!
此外,这些都不起作用:
git config --add --global core.pager less
git log
Run Code Online (Sandbox Code Playgroud)
要么
GIT_PAGER=less git log
Run Code Online (Sandbox Code Playgroud)
要么
PAGER=less git log
Run Code Online (Sandbox Code Playgroud) 我试图查看存储库历史记录中的提交,但仅针对具有特定扩展名的文件.
如果这是目录结构:
$ tree
.
??? a.txt
??? b
??? subdir
??? c.txt
??? d
Run Code Online (Sandbox Code Playgroud)
这是完整的历史:
$ git log --name-only --oneline
a166980 4
subdir/d
1a1eec6 3
subdir/c.txt
bc6a027 2
b
f8d4414 1
a.txt
Run Code Online (Sandbox Code Playgroud)
如果我想查看扩展名为.txt的文件的日志:
$ git log --oneline *.txt
f8d4414 1
Run Code Online (Sandbox Code Playgroud)
它仅返回当前目录中的文件,而不返回子目录中的文件.我想在当前目录中包含所有可能的子目录.
我也尝试过:
$ git log --oneline */*.txt
1a1eec6 3
Run Code Online (Sandbox Code Playgroud)
和:
$ git log --oneline *.txt */*.txt
1a1eec6 3
f8d4414 1
Run Code Online (Sandbox Code Playgroud)
这适用于这种情况,但对于更通用的情况则不实用.
和:
$ git log --oneline HEAD -- *.txt
f8d4414 1
Run Code Online (Sandbox Code Playgroud)
没有成功.
我可能最终为我自己的repo服务器重新发明了部分github REST API.但也许有一些服务器脚本可以做到这一点?或许你有其他建议?
这是我的用例:
我正在开发一个Firefox扩展,它将显示一个数据
git log -- <path>
Run Code Online (Sandbox Code Playgroud)
我总是可以编写一个实现完善的JGit的小服务器脚本,并在那里执行"git log"命令.但是,FF扩展依赖于该服务器脚本;(
我想知道,如果存在类似github REST API for"not-github"-repos的东西,它会更像我的小服务器脚本?
我还考虑过Git JS Client,比如Git.JS(显然是唯一的JS Client;与node.js合作;不幸的是,项目不再活跃,没有文档.).但是,我不需要一个完整的客户端.我只是想从远程主仓库中检索一些只读信息.
考虑一个git存储库,其中一个文件曾被删除.
git rm path/to/file
git commit -a -m"testing"
Run Code Online (Sandbox Code Playgroud)
好的,现在我想看到该git log文件,但我收到了经典的错误消息:
git log path/to/file
fatal: ambiguous argument 'path/to/file': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Run Code Online (Sandbox Code Playgroud)
解决方案很简单 - 添加--:
git log -- path/to/file
Run Code Online (Sandbox Code Playgroud)
但为什么?为什么需要这个?这里的理由是什么?不能git做一个有根据的猜测,这可能是一个文件一次?我理解"模棱两可"的问题 - 但从来没有这个名称的标签.如果文件一旦删除,并且没有标记,那么选择"文件解释"始终是一个不错的选择.
另一方面,可以有一个名为与文件相同的标记,它可以git log很好地处理:
fatal: ambiguous argument 'path/to/file': both revision and filename
Use '--' to separate filenames from revisions
Run Code Online (Sandbox Code Playgroud)
这种行为似乎不一致.任何人都可以解释一下git的开发人员的想法吗?
该--abbrev-commit标志可以与git log和一起使用,git rev-list以显示部分前缀,而不是提交对象的完整40个字符的SHA-1哈希值.根据Pro Git的书,
它默认使用七个字符,但如果有必要使它们更长,以保持SHA-1明确[...]
另外,短SHA的长度至少为4个字符.仍然根据Pro Git的书,
通常,八到十个字符足以在项目中独一无二.
例如,Linux内核是一个相当大的项目,具有超过450k的提交和360万个对象,没有两个对象的SHA-1重叠超过前11个字符.
由于防止提交对象的所有前缀哈希值之间的任何重叠所需的最长前缀的长度(11,在Linux内核的情况下)是回购邮件大小的粗略指示,我想以编程方式确定相应的数量.我自己的本地存储库.我怎样才能做到这一点?
我有一个旧的承诺md5hash上myfile.extension与SOME CHANGE在提交主体(未提交标题/元).
我怎样才能生成提交列表与SOME CHANGE修改(不只是存在)导致对提交HEAD的md5hash,而不必检查每个差异?(其中不幸的是,目前的情况很多.)
我试过git rev-list --all | xargs git grep 'SOME CHANGE'但这似乎找到SOME CHANGE了文件中的所有提交.
git blame由于线条已经改变并且SOME CHANGE已经移动,因此似乎毫无用处.
我想在我的项目中创建一个指标来衡量提交从创建到进入主分支需要多长时间?
是否可以?看起来对于快速转发的提交,我无法从 git 日志中获取此信息。
如果我能在 X 天前获得存储库的快照,也许我可以计算它。另一种选择是获取在修改分支 HEAD 时注册的日志。
更新:如果您在每个版本中创建一个带注释的标签,您只能看到包含提交的标签的日期。以下是如何列出标签中包含的提交
这是在git log -p中忽略文件的后续内容,也与使'git log'忽略某些路径的更改有关.
我正在使用Git 1.9.2.我正在尝试使用pathspec魔术:(exclude)来指定某些补丁不应该在输出中显示git log -p.但是,我要排除的修补程序仍显示在输出中.
这是一个重现这种情况的最小工作示例:
$ cd ~/Desktop
$ mkdir test_exclude
$ cd test_exclude
$ git init
$ mkdir testdir
$ printf "my first cpp file\n" > testdir/test1.cpp
$ printf "my first xml file\n" > testdir/test2.xml
$ git add testdir/
$ git commit -m "added two test files"
Run Code Online (Sandbox Code Playgroud)
现在我想显示我的历史记录中的所有补丁,期望与文件testdir夹中的XML文件相对应的补丁.因此,按照VonC的回答,我跑了
$ git log --patch -- . ":(exclude)testdir/*.xml"
Run Code Online (Sandbox Code Playgroud)
但我的testdir/test2.xml文件的补丁仍显示在输出中:
commit 37767da1ad4ad5a5c902dfa0c9b95351e8a3b0d9
Author: xxxxxxxxxxxxxxxxxxxxxxxxx
Date: …Run Code Online (Sandbox Code Playgroud) git ×10
git-log ×10
git-blame ×1
git-diff ×1
git-rebase ×1
git-rev-list ×1
github ×1
github-api ×1
linux-kernel ×1
pager ×1
sha1 ×1
web-services ×1