启动一个新仓库并添加一些提交:
#( 03/01/17@10:50am )( tim@tim ):~
mkdir test && cd test && git init
Initialised empty Git repository in /home/tim/test/.git/
。
#( 03/01/17@11:17am )( tim@tim ):~/test@master✔
touch readme && git add --all && git commit -am "readme"
[master (root-commit) 1b7f299] readme
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme
。
#( 03/01/17@11:17am )( tim@tim ):~/test@master✔
touch howto && git add --all && git commit -am "howto"
[master fd46c4c] howto
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 howto
。
#( 03/01/17@11:19am )( tim@tim ):~/test@master✔
touch la && git add --all && git commit -am "add la"
[master 4680089] add la
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 la
。
#( 03/01/17@11:20am )( tim@tim ):~/test@master✔
ls
howto la readme
#( 03/01/17@11:20am )( tim@tim ):~/test@master✔
echo "hello" >> readme && echo "hello" >> howto
#( 03/01/17@11:20am )( tim@tim ):~/test@master✗✗✗
git commit -am "edit readme and howto"
[master 8969440] edit readme and howto
2 files changed, 2 insertions(+)
所以现在我们有以下提交:
commit 8969440d52e578113f609d948e6ffd06cec96fa9
Author: Tim Richardson <tim@x.com>
Date: Wed Mar 1 11:20:54 2017 +0000
edit readme and howto
commit 4680089c7c1a0ead84f6b2973fd6d9e1356fd5c0
Author: Tim Richardson <tim@x.com>
Date: Wed Mar 1 11:20:06 2017 +0000
add la
commit fd46c4cf593752ec8163d8db21042c8dd336f529
Author: Tim Richardson <tim@x.com>
Date: Wed Mar 1 11:18:09 2017 +0000
howto
commit 1b7f299c5ad4fc50ce4913ab4cdbbdc761db0487
Author: Tim Richardson <tim@x.com>
Date: Wed Mar 1 11:17:50 2017 +0000
readme
让我们结帐一个称为测试的新分支,并将其重置为初始提交:
#( 03/01/17@11:26am )( tim@tim ):~/test@master✔
git checkout -b test
Switched to a new branch 'test'
#( 03/01/17@11:27am )( tim@tim ):~/test@test✔
git reset --hard 1b7f299c5ad4fc50ce4913ab4cdbbdc761db0487
HEAD is now at 1b7f299 readme
如果我樱桃挑选提交8969440失败,因为它依赖于FD46C4C和1B7F29而不是4680089:
#( 03/01/17@11:27am )( tim@tim ):~/test@test✔
git cherry-pick 8969440
error: could not apply 8969440... edit readme and howto
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
但是,我可以从1B7F299C挑选4680089c7,而没有任何冲突,即使它不是GIT日志的一级后代:
#( 03/01/17@11:28am )( tim@tim ):~/test@test✗✗✗
git reset --hard
HEAD is now at 1b7f299 readme
#( 03/01/17@12:10pm )( tim@tim ):~/test@test✔
git cherry-pick 4680089c7
[test de3878f] add la
Date: Wed Mar 1 11:20:06 2017 +0000
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 la
因此,贴片之间有一个依赖关系图:
+---------+
| |
| 1b7f299 +--------+
| | |
+---------+ | +----------+
+----->+ |
| | 8969440 |
+---------+ | | |
| | | +----------+
| fd46c4c +--------+
| |
+---------+
+---------+
| |
| 4680089 |
| |
+---------+
我的问题得到了更大的存储库,如何根据补丁计算依赖关系图?我如何使用git来判断哪些提交依赖其他人?
标题中问题的答案,以找到提交的父母:
git log --pretty=%p <commit>
%P
用于完整的sha1。
,但这不是您所期望的。
在您的情况下,假设我们已经提交A和B,并且B依靠A。A可能是B的父母B。
尝试将B樱桃挑选到当前分支(例如master
),并发生冲突。运行git status
以查看哪些文件有冲突。假设它们是foo.c
和bar.c
。
运行git log master..B -- foo.c bar.c
并获得一组触摸foo.c
或bar.c
的提交。
运行git log B..master -- foo.c bar.c
并获得另一组提交。
通过提交消息和补丁比较这两个集,以在第一组中找到依赖项提交,不包括第二组的依赖项。樱桃挑选那些您真的需要一个人。
真实情况可能更复杂。A和B可能是相同错误的提交。仅樱桃挑选A或仅B b会导致任何冲突,但是如果您不挑选两个错误,则无法修复该错误。
如果您做一个良好的工作流程,例如将所有相关承诺压缩为一个,并从一开始就跟踪每个错误/功能,则可以节省大量时间和努力。找到记录和樱桃挑选委员会一个或挤压提交比搜索缺失的依赖性提交要容易得多。可能有冲突,但您可以确定这不是因为您错过了一些依赖项。
您可以解析差异以查找已更改的旧修订中的所有区域,然后使用git log -L<start>,<end>:file...
(*)搜索以前触及此代码的提交。因此,对于任何给定的提交,您可以早些时候搜索它。
我不确定是否可以按照您需要正确定义图形,因为"补丁B取决于补丁A"不是那么规则。例如,有可能创建连续的提交a-b-c-d,因此当d取决于a和c,而不是b,而c则取决于b,而不是A。/div>