Consider an acid buffer with $pK_a=5$. Ignore the hydroxyl concentration, assuming it is negligible.
Dilution leads to an identical (proportional) reduction in the concentration of all solutes: undissociated acid, complementary base (anion), and protium. Because the concentration of anion and protium is reduced, encounters between the two will occur less frequently. On the other hand, dissociation of the acid into component ions continues unabated, since this process is (we are ignoring activities) a first order reaction. The result is an increase in the concentrations of anion and protium, thus reestablishing a value of the protium concentration close to that prior dilution.
Other important factors should be remembered in the context of ideal buffers and the Henderson-Hasselbach equation: (1) the concentrations of $\ce{A^-}$ and $\ce{HA}$ are set equivalent in an ideal buffer (2) the $\ce{H^+}$ concentration is set equal to the $K_a$ and (3) the concentrations of $\ce{A^-}$ and $\ce{HA}$ are much higher than those of $\ce{H^+}$ . That means that in both absolute and relative amounts, the concentrations of $\ce{A^-}$ and $\ce{HA}$ need to change by only a small amount in order to bring the pH back near the desired set point. This is very clear from the following plots (concentrations are molar and $pK_a = 5$). Every 0.1 time units the concentration is diluted by 17%. The pH spikes up but then settles back again as the acid dissociates. You practically don't see the changes in the undissociated acid and anion on the plot during the recovery because they are tiny.

You can compare this to the case when your buffer is not as good (same $pK_a$, but lower capacity, 100 $\mu M$ concentration). I altered the kinetics too so the pH would stabilize after each dilution:

I should add: ignoring $[OH^-]$ is admittedly bad near neutral pH/low buffer capacity, but then I was attempting to provide a visualization. Adding terms to cope with the hydroxyl equilibrium etc would complicate things without adding much value or accuracy (since the kinetics are not meant to be accurate anyway, just illustrative).
Addendum: Here's the code:
K = 1e-5; % M
kd=10; % arbitrary, set to alter convergence speed, numerical stability
dt = 1e-7; % arbitrary, alter to change convergence speed, numerical stability
v0 = [0.2; 0.2 ; K]; % M [HA], [A], [H],
%% for dilute conditions
%kd=80;
%dt = 1e-5;
%v0 = [0.0001; 0.0001 ; K]; % [HA], [A], [H]
Nstep = 10000;
t = [0:dt:(Nstep-1)*dt];
tdilute = t(round(Nstep*[0.1:0.1:0.9]));
dv_dt = @(kd,K,v) [ -kd*v(1)+kd/K*v(2)*v(3); kd*v(1)-kd/K*v(2)*v(3)] ;
dv_ = @(v,dt) dv_dt(kd,K,v)*dt;
dv = @(v) dv_(v,dt);
v = v0;
conc = v0;
for ii=2:Nstep
vstep = dv(v);
v = v + [vstep(1); vstep(2); vstep(2)];
conc(:,ii) = v;
if any(t(ii) == tdilute)
v = v/1.2; % <-- change factor to dilute by here
end
end
figure
subplot(2,1,1)
plot(t,conc(1,:),'r')
hold on
plot(t,conc(2,:),'g--')
plot(t,conc(3,:),'b--')
ylabel('[c]')
legend('[HA]','[A^-]','[H^+]')
subplot(2,1,2)
plot(t,-log10(conc(3,:)),'b--')
ylabel('pH')
xlabel('time (au)')