The issue is caused by the function undo-tree-visualizer-update-diff, which contains a (balance-windows) command at the end. So the simple dirty trick is to re-define the function with that command commented out after loading undo-tree:
(with-eval-after-load 'undo-tree ;; [2023-10-20 Fri] modify this function from undo-tree.el to prevent ;; re-balancing windows ------------------------------------------------------ (defun undo-tree-visualizer-update-diff (&optional node) ;; update visualizer diff display to show diff between current state and ;; NODE (or previous state, if NODE is null) (with-current-buffer undo-tree-visualizer-parent-buffer (undo-tree-diff node)) (let ((win (get-buffer-window undo-tree-diff-buffer-name))) (when win ;; (balance-windows); comment this line out (shrink-window-if-larger-than-buffer win)))) ) )