如何列出被 git pull/git merge 修改的文件?

如何列出被 git pull/git merge 修改的文件?

在我们的一个项目中,MysQL-Dumps 与 git 同步。数据库中的每个表都有一个文件。拉取/合并后,转储将通过钩子导入到本地数据库。现在的问题是,我需要找到所有通过拉取更改的表转储,以便仅导入这些转储。我如何让合并后钩子知道哪些文件发生了更改?在合并之前可能不止一个提交,通常还有更多提交。

我如何获得已修改文件的列表?

答案1

git diff --name-only SHA1 SHA2

用于git log获取 git 提交 ID。git diff SHAx如果您只想与已提取的最新头部进行比较,请使用 just。

在你git pull执行git loggit status获取 SHAx 之前。你可以git fetch执行合并之前的操作,而不是拉取,而是进行日志和差异操作。

答案2

我发现的最简单的方法是

git diff --name-only HEAD@{0} HEAD@{1}

因为HEAD@{n}表示第 n 个前值HEAD

答案3

我使用git reflog后得到了git pull如下结果:

SHA1 HEAD@{0}: pull: Fast-forward
SHA2 HEAD@{1}: checkout: moving from somewhere to anotherplace

在读出“拉:快进”之后的 SHA 就是拉动之前所在的 SHA。

之后,我使用了git diff --name-only SHA2另一个答案,它将为您提供从该提交到当前状态更改的文件列表。

我不能 100% 确定这对于具有大量更改和合并的拉动如何起作用,但对于简单的快进来说,它工作得非常好。

答案4

在您拉取/合并分支之后,您可以立即看到拉取或合并的更改(即由新的提交/合并引入的更改):

git diff ORIG_HEAD HEAD

否则大多数合并将有两个父级,HEAD^1HEAD^2。如果所有更改的表都作为单个提交提交,那么很可能其中一个是主/源分支,另一个是钩子的提交 - 您需要做的就是仅显示该侧的更改,例如:

git diff --name-only HEAD^2

对于更复杂/交叉的合并,解开变化实​​际上可能相当困难。Git log 有高级选项来选择最理想的路径,这取决于变更流程,YMMV。

相关内容