有没有快速的方式来解决问题?#34; git diff"从点或分支起源?

时间:2015-04-22 22:48:16

标签: git git-diff

我已经查看了使用gradient(func1([1,2,3]),[1,2,3]) = 0 和git修订版(HEAD,ORIG_HEAD,FETCH_HEAD等)的各种SO答案,我仍然没有找到一个简单的方法来列出自那以后所做的更改本地分支的开头,或自上一次重组以来。

通过 easy 我的意思是无需查找并粘贴提交SHA或必须计算我想要回顾的提交数量。

gradient(func1([1,2,3]),[1,2,3]) = [cos(1),cos(2),cos(3)] 已关闭,但它指的是自我从中检出新分支后可能已经分歧的遥控器。

我希望git diff之类的内容可用。

......除非已经有办法做到这一点。有人有答案吗?

7 个答案:

答案 0 :(得分:34)

您可以使用SQL> CREATE OR REPLACE TRIGGER users_after_insert 2 AFTER INSERT ON USERS 3 FOR EACH ROW 4 BEGIN 5 INSERT INTO UTILITIES (UTILITY_NAME, RUNNING, USER_ID, UTILITY_ID, COST) 6 VALUES 7 ('Javaw.exe', 'YES', :new.USER_ID,seq_utility_id.nextval, round(dbms_random.value(25000, 100000))); 8 9 END; 10 / Trigger created. SQL> create or replace procedure sum_Data 2 is 3 begin 4 UPDATE USERS 5 SET Storage_Size = (SELECT SUM(FILE_SIZE) FROM FILES WHERE USERS.USER_ID = FILES.USER_ID); 6 UPDATE USERS 7 SET MEMORY_USAGE = (SELECT SUM(COST) FROM UTILITIES WHERE USERS.USER_ID = UTILITIES.USER_ID); 8 END; 9 / procedure created. SQL> insert into users (user_id,user_name,user_pass) values (124,'ALPHA','xxxxxx'); 1 row created. SQL> commit; Commit complete. SQL> select * from users; USER_ID USER_NAME USER_PASS STORAGE_SIZE MEMORY_USAGE ---------- ------------------ ------------------ ------------------ ------------ 124 ALPHA xxxxxx SQL> select * from utilities; UTILITY_ID UTILITY_NAME COST RUNN USER_ID ---------- ------------------ ---------- ---- ---------- 10 Javaw.exe 49780 YES 124 SQL> 找到分支点。考虑git merge-base主线和master您感兴趣的历史记录。要查找devdev分支的点,请运行:

master

我们现在可以在此基础上区分git merge-base --fork-point master dev

dev

如果git diff $(git merge-base --fork-point master dev)..dev 当前分支,则会简化为:

dev

有关详细信息,请参阅git-merge-base documentation

答案 1 :(得分:25)

使用git diff @{u}...HEAD,带三个点。

如果省略两个点,或者省略HEAD,则会显示两侧变化的差异。

有三个点,它只会显示你身边变化的差异。

编辑:对于需求略有不同的人,您可能会对git merge-base感兴趣(请注意,它有比其他答案更多的选项)。

答案 2 :(得分:7)

您可以使用以下方法从分支起始点区分当前分支:

git diff (start point)...

其中(起始点)是分支名称,提交标识或标记。

例如,如果您正在处理从develop分支的功能分支,则可以使用:

git diff develop...

表示自分支点以来当前分支的所有更改。

评论中已经提到过这一点,但我认为它应该得到回答。我不知道自从上次变种以来它会做什么。

答案 3 :(得分:2)

对于差异,您需要三点符号。如果您的分支被称为dev,并且它从master分支:

% git diff master...dev

对于日志,您需要双点表示法:

% git log master..dev

修订语法r1..r2(带两个点)表示"所有内容均可从r2(包括)到达,但无法从r1(包括)"到达。使用此功能的常用方法是将r1r2视为指定提交序列中的范围(r1独占,r2包含),所以如果您有10个版本,3..7会向您显示更改4,5,6和7. {1, 2, 3, 4, 5, 6, 7}减去{1, 2, 3}r1r2并非必须是r1的祖先。可以把它想象成一个集合操作,其中r1代表r2向后的整个祖先,而r2代表git log master..dev 向后的整个祖先,你就是这样的从第二组中减去第一组。

那么:

{{1}}

是分支的整个历史减去主人的整个历史。换句话说,只是分支。

答案 4 :(得分:1)

current solution提到

使用带有三个点的git diff @{u}...HEAD

但是...最好是使用Git 2.28(2020年第三季度)完成。
以前,“ git diff”用于接受随机和无意义的范围表示法中的参数,例如已清除的“ git diff A..B C,“ git diff A..B C...D”等。

请见commit b7e10b2commit 8bfcb3acommit bafa2d7(2020年6月12日)和Chris Torek (chris3torek)(2020年6月9日)。
(由Junio C Hamano -- gitster --commit 1457886中合并,2020年6月25日)

git diff:改善范围处理

签名人:克里斯·托雷克(Chris Torek)

git diff被赋予对称差异A...B时,它将从两个指定的提交中选择一些合并基础(如文档所述)。

但是,如果没有 合并基础,则此操作将失败:相反,您会看到A和B之间的差异,这当然不是预期的。

此外,如果在命令行(“ git diff A...B C”)上指定了其他修订,则结果会有些奇怪:

  • 如果存在对称差异合并基,则将其用作差异的左侧。
    最后的最后一个引用用作右侧。

  • 如果没有合并基础,则对称状态将完全丢失。
    我们将改为生成组合的差异。

如果您使用“ git diff C A...B D”,则会出现类似的怪异现象。同样,使用多个两点范围,或将额外的修订说明符与两点范围一起放入命令行,或将两个点范围和三个点范围混合在一起,都会产生废话。

为避免所有这些情况,请添加一个例程以捕获范围大小写并验证参数是否有意义。

作为副作用,当有多个选择时,产生警告,显示正在使用哪个合并库;如果没有合并基础,则死亡。

The documentation现在包括:

'git diff' [<options>] <commit> [<commit>...] <commit> [--] [<path>...]

此表单用于查看合并提交的结果。

首先列出的必须是合并本身;其余的两个或更多提交应该是其父母。
产生所需修订版本的一种便捷方法是使用后缀{caret}@
例如,如果master命名合并提交,则git diff master master^@给出的合并差异与git show master相同。

答案 5 :(得分:0)

要与远程主分支进行比较:

git diff $(git merge-base HEAD origin/master)..

答案 6 :(得分:0)

我在 .gitconfig 中写了一个别名来解决这个任务:

[alias]
    # See changes since branching off of main branch
    changes = "!f() { \
        current=$(git rev-parse --abbrev-ref HEAD); \
        main=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'); \
        commit=$(git merge-base --fork-point \"$main\" \"$current\"); \
        git diff \"$commit\"...; \
    }; f"

逐行,这个别名:

  1. 定义一个 shell 函数 f,它
  2. 计算当前分支名称,
  3. 计算主分支名称(可以是 main、master、develop 等),
  4. 计算这两个分支发散的提交,以及
  5. 运行 git diff 以查看自此提交以来的更改